xref: /OK3568_Linux_fs/kernel/arch/x86/um/asm/checksum_32.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Licensed under the GPL
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #ifndef __UM_SYSDEP_CHECKSUM_H
6*4882a593Smuzhiyun #define __UM_SYSDEP_CHECKSUM_H
7*4882a593Smuzhiyun 
ip_compute_csum(const void * buff,int len)8*4882a593Smuzhiyun static inline __sum16 ip_compute_csum(const void *buff, int len)
9*4882a593Smuzhiyun {
10*4882a593Smuzhiyun     return csum_fold (csum_partial(buff, len, 0));
11*4882a593Smuzhiyun }
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define _HAVE_ARCH_IPV6_CSUM
csum_ipv6_magic(const struct in6_addr * saddr,const struct in6_addr * daddr,__u32 len,__u8 proto,__wsum sum)14*4882a593Smuzhiyun static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
15*4882a593Smuzhiyun 					  const struct in6_addr *daddr,
16*4882a593Smuzhiyun 					  __u32 len, __u8 proto,
17*4882a593Smuzhiyun 					  __wsum sum)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	__asm__(
20*4882a593Smuzhiyun 		"addl 0(%1), %0		;\n"
21*4882a593Smuzhiyun 		"adcl 4(%1), %0		;\n"
22*4882a593Smuzhiyun 		"adcl 8(%1), %0		;\n"
23*4882a593Smuzhiyun 		"adcl 12(%1), %0	;\n"
24*4882a593Smuzhiyun 		"adcl 0(%2), %0		;\n"
25*4882a593Smuzhiyun 		"adcl 4(%2), %0		;\n"
26*4882a593Smuzhiyun 		"adcl 8(%2), %0		;\n"
27*4882a593Smuzhiyun 		"adcl 12(%2), %0	;\n"
28*4882a593Smuzhiyun 		"adcl %3, %0		;\n"
29*4882a593Smuzhiyun 		"adcl %4, %0		;\n"
30*4882a593Smuzhiyun 		"adcl $0, %0		;\n"
31*4882a593Smuzhiyun 		: "=&r" (sum)
32*4882a593Smuzhiyun 		: "r" (saddr), "r" (daddr),
33*4882a593Smuzhiyun 		  "r"(htonl(len)), "r"(htonl(proto)), "0"(sum));
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	return csum_fold(sum);
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #endif
39