50 #ifndef _MACHINE_IN_CKSUM_H_ 51 #define _MACHINE_IN_CKSUM_H_ 1 53 #include <sys/cdefs.h> 67 #if (defined(__GNUC__) && defined(__i386__)) 70 in_cksum_hdr(
const struct ip *ip)
72 register u_int sum = ((
const uint32_t*)ip)[0];
84 :
"+&r"(sum),
"=&r"(tmp)
85 :
"g"(((
const uint32_t*)ip)[1]),
86 "g"(((
const uint32_t*)ip)[2]),
87 "g"(((
const uint32_t*)ip)[3]),
88 "g"(((
const uint32_t*)ip)[4]),
97 in_cksum_update(
struct ip *ip)
100 __tmpsum = (int)ntohs(ip->ip_sum) + 256;
101 ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16));
108 #elif (defined(__GNUC__) && (defined(__mc68000__) || defined(__m68k__))) 110 static __inline__ u_int
111 in_cksum_hdr(
const struct ip *ip)
113 register u_int *ap = (u_int *)ip;
114 register u_int sum = *ap++;
117 __asm__ __volatile__(
"addl %2@+,%0\n\t" 126 "=d" (sum),
"=d" (tmp),
"=a" (ap) :
127 "0" (sum),
"2" (ap),
"m"(*ip));
128 sum = (sum & 0xffff) + (sum >> 16);
131 return ~sum & 0xffff;
138 #elif (defined(__GNUC__) && (defined(__PPC__) || defined(__ppc__))) 140 static __inline u_int
141 in_cksum_hdr(
const struct ip *ip)
143 register u_int sum, tmp;
147 " addc %0, %0, %1 \n" 149 " adde %0, %0, %1 \n" 151 " adde %0, %0, %1 \n" 153 " adde %0, %0, %1 \n" 155 " rotlwi %1, %0,16 \n" 158 " srwi %0, %0, 16 \n" 159 :
"=&r"(sum),
"=&r"(tmp):
"b"(ip),
"m"(*ip):
"xer" 173 in_cksum_update(
struct ip *ip)
176 __tmpsum = (int)ntohs(ip->ip_sum) + 256;
177 ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16));
184 #elif (defined(__GNUC__) && defined(__sparc__)) 186 static __inline u_int
187 in_cksum_hdr(
const struct ip *ip)
189 register u_int sum = 0;
190 register u_int tmp_o2;
191 register u_int tmp_o3;
199 addxcc %1, %3, %1 ; \ 201 addxcc %1, %2, %1 ; \ 202 addxcc %1, %3, %1 ; \ 211 " :
"=r" (ip),
"=r" (sum),
"=r" (tmp_o2),
"=r" (tmp_o3)
212 :
"0" (ip),
"1" (sum),
"m"(*ip)
217 #define in_cksum_update(ip) \ 220 __tmpsum = (int)ntohs(ip->ip_sum) + 256; \ 221 ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); \ 227 #elif defined ( __GNUC__ ) && defined ( __nios2__ ) 229 static inline uint32_t _NIOS2_Add_ones_complement (
const uint32_t a,
236 " cmpltu %1, %0, %2 \n" 238 :
"=&r"(sum),
"=&r"(C)
244 static inline uint16_t _NIOS2_Add_ones_complement_word_halves
250 " roli %1, %2, 16 \n" 252 " srli %0, %1, 16 \n" 253 :
"=&r"(sum),
"=&r"(tmp)
259 static __inline u_int in_cksum_hdr (
const struct ip * pHdrIP )
261 const uint32_t *
const pWd = (
const uint32_t * ) pHdrIP;
262 uint32_t sum = pWd[0];
263 sum = _NIOS2_Add_ones_complement ( sum, pWd[1] );
264 sum = _NIOS2_Add_ones_complement ( sum, pWd[2] );
265 sum = _NIOS2_Add_ones_complement ( sum, pWd[3] );
266 sum = _NIOS2_Add_ones_complement ( sum, pWd[4] );
267 sum = _NIOS2_Add_ones_complement_word_halves ( sum );
272 static __inline
void in_cksum_update (
struct ip * pHdrIP )
274 uint32_t __tmpsum = ntohs ( pHdrIP->ip_sum );
276 __tmpsum += __tmpsum >> 16u;
277 pHdrIP->ip_sum = htons ( ( uint16_t ) __tmpsum );
285 u_int in_cksum_hdr(
const struct ip *);
286 #define in_cksum_update(ip) \ 289 __tmpsum = (int)ntohs(ip->ip_sum) + 256; \ 290 ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); \
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.