36 #include <sys/param.h> 39 #if defined(__mcoldfire__) 40 # define IS_COLDFIRE 1 42 # define IS_COLDFIRE 0 45 #define REDUCE { sum = (sum & 0xFFFF) + (sum >> 16); if (sum > 0xFFFF) sum -= 0xFFFF; } 54 in_cksum(
struct mbuf *m,
58 unsigned long sum = 0;
66 for ( ; m && len ; m = m->m_next) {
69 w = mtod(m, u_short *);
79 s_util.c[1] = *(
char *)w;
81 w = (u_short *)((
char *)w + 1);
95 if ((1 & (
int) w) && (mlen > 0)) {
97 s_util.c[0] = *(u_char *)w;
98 w = (u_short *)((
char *)w + 1);
102 if ((2 & (
int) w) && (mlen >= 2)) {
114 unsigned long tcnt = mlen, t1;
117 "lsrl #6,%2 | count/64 = # loop traversals\n\t" 118 "andl #0x3c,%3 | Then find fractions of a chunk\n\t" 119 "negl %3\n\t | Each long uses 4 instruction bytes\n\t" 121 "addql #1,%2 | Clear X (extended carry flag)\n\t" 124 "andi #0xf,%%cc | Clear X (extended carry flag)\n\t" 126 "jmp %%pc@(2f-.-2:b,%3) | Jump into loop\n" 127 "1: | Begin inner loop...\n\t" 128 "movel %1@+,%3 | 0: Fetch 32-bit word\n\t" 129 "addxl %3,%0 | Add word + previous carry\n\t" 130 "movel %1@+,%3 | 1: Fetch 32-bit word\n\t" 131 "addxl %3,%0 | Add word + previous carry\n\t" 132 "movel %1@+,%3 | 2: Fetch 32-bit word\n\t" 133 "addxl %3,%0 | Add word + previous carry\n\t" 134 "movel %1@+,%3 | 3: Fetch 32-bit word\n\t" 135 "addxl %3,%0 | Add word + previous carry\n\t" 136 "movel %1@+,%3 | 4: Fetch 32-bit word\n\t" 137 "addxl %3,%0 | Add word + previous carry\n\t" 138 "movel %1@+,%3 | 5: Fetch 32-bit word\n\t" 139 "addxl %3,%0 | Add word + previous carry\n\t" 140 "movel %1@+,%3 | 6: Fetch 32-bit word\n\t" 141 "addxl %3,%0 | Add word + previous carry\n\t" 142 "movel %1@+,%3 | 7: Fetch 32-bit word\n\t" 143 "addxl %3,%0 | Add word + previous carry\n\t" 144 "movel %1@+,%3 | 8: Fetch 32-bit word\n\t" 145 "addxl %3,%0 | Add word + previous carry\n\t" 146 "movel %1@+,%3 | 9: Fetch 32-bit word\n\t" 147 "addxl %3,%0 | Add word + previous carry\n\t" 148 "movel %1@+,%3 | A: Fetch 32-bit word\n\t" 149 "addxl %3,%0 | Add word + previous carry\n\t" 150 "movel %1@+,%3 | B: Fetch 32-bit word\n\t" 151 "addxl %3,%0 | Add word + previous carry\n\t" 152 "movel %1@+,%3 | C: Fetch 32-bit word\n\t" 153 "addxl %3,%0 | Add word + previous carry\n\t" 154 "movel %1@+,%3 | D: Fetch 32-bit word\n\t" 155 "addxl %3,%0 | Add word + previous carry\n\t" 156 "movel %1@+,%3 | E: Fetch 32-bit word\n\t" 157 "addxl %3,%0 | Add word + previous carry\n\t" 158 "movel %1@+,%3 | F: Fetch 32-bit word\n\t" 159 "addxl %3,%0 | Add word + previous carry\n" 160 "2: | End of unrolled loop\n\t" 162 "moveq #0,%3 | Add in last carry\n\t" 164 "subql #1,%2 | Update loop count\n\t" 165 "bplb 1b | Loop (with X clear) if not done\n\t" 166 "movel #0xffff,%2 | Get word mask\n\t" 167 "movel %0,%3 | Fold 32 bit sum to 16 bits\n\t" 169 "andl %2,%0 | Mask to 16-bit sum\n\t" 170 "andl %2,%3 | Mask to 16-bit sum\n\t" 172 "movel %0,%3 | Add in last carry\n\t" 175 "andl %2,%0 | Mask to 16-bit sum\n\t" 177 "dbf %2,1b | (NB- dbf doesn't affect X)\n\t" 178 "movel %0,%3 | Fold 32 bit sum to 16 bits\n\t" 179 "swap %3 | (NB- swap doesn't affect X)\n\t" 181 "moveq #0,%3 | Add in last carry\n\t" 183 "andl #0xffff,%0 | Mask to 16-bit sum\n" 186 "=d" (sum),
"=a" (w),
"=d" (tcnt) ,
"=d" (t1) :
187 "0" (sum),
"1" (w),
"2" (tcnt) :
195 while ((mlen -= 2) >= 0)
202 s_util.c[1] = *(
char *)w;
207 }
else if (mlen == -1)
208 s_util.c[0] = *(
char *)w;
220 return (~sum & 0xffff);
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.