xref: /openbmc/linux/arch/x86/um/asm/checksum_32.h (revision c693cc46)
15c48b108SAl Viro /*
25c48b108SAl Viro  * Licensed under the GPL
35c48b108SAl Viro  */
45c48b108SAl Viro 
55c48b108SAl Viro #ifndef __UM_SYSDEP_CHECKSUM_H
65c48b108SAl Viro #define __UM_SYSDEP_CHECKSUM_H
75c48b108SAl Viro 
ip_compute_csum(const void * buff,int len)85c48b108SAl Viro static inline __sum16 ip_compute_csum(const void *buff, int len)
95c48b108SAl Viro {
105c48b108SAl Viro     return csum_fold (csum_partial(buff, len, 0));
115c48b108SAl Viro }
125c48b108SAl Viro 
135c48b108SAl Viro #define _HAVE_ARCH_IPV6_CSUM
csum_ipv6_magic(const struct in6_addr * saddr,const struct in6_addr * daddr,__u32 len,__u8 proto,__wsum sum)145c48b108SAl Viro static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
155c48b108SAl Viro 					  const struct in6_addr *daddr,
161e940829SAlexander Duyck 					  __u32 len, __u8 proto,
175c48b108SAl Viro 					  __wsum sum)
185c48b108SAl Viro {
195c48b108SAl Viro 	__asm__(
205c48b108SAl Viro 		"addl 0(%1), %0		;\n"
215c48b108SAl Viro 		"adcl 4(%1), %0		;\n"
225c48b108SAl Viro 		"adcl 8(%1), %0		;\n"
235c48b108SAl Viro 		"adcl 12(%1), %0	;\n"
245c48b108SAl Viro 		"adcl 0(%2), %0		;\n"
255c48b108SAl Viro 		"adcl 4(%2), %0		;\n"
265c48b108SAl Viro 		"adcl 8(%2), %0		;\n"
275c48b108SAl Viro 		"adcl 12(%2), %0	;\n"
285c48b108SAl Viro 		"adcl %3, %0		;\n"
295c48b108SAl Viro 		"adcl %4, %0		;\n"
305c48b108SAl Viro 		"adcl $0, %0		;\n"
315c48b108SAl Viro 		: "=&r" (sum)
325c48b108SAl Viro 		: "r" (saddr), "r" (daddr),
335c48b108SAl Viro 		  "r"(htonl(len)), "r"(htonl(proto)), "0"(sum));
345c48b108SAl Viro 
355c48b108SAl Viro 	return csum_fold(sum);
365c48b108SAl Viro }
375c48b108SAl Viro 
385c48b108SAl Viro #endif
39