diff options
author | cognet <cognet@FreeBSD.org> | 2006-03-09 23:33:59 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2006-03-09 23:33:59 +0000 |
commit | b82f657662f73a0abbc224f3b2d85db65f9023ca (patch) | |
tree | 6513122252523498c1b37718a6ab76504c360a89 /sys/arm/include | |
parent | 9dcc540f357c739664c0570ba4e4021a4e46e4cf (diff) | |
download | FreeBSD-src-b82f657662f73a0abbc224f3b2d85db65f9023ca.zip FreeBSD-src-b82f657662f73a0abbc224f3b2d85db65f9023ca.tar.gz |
MFp4: Forget the asm inlined version of in_cksum_hdr(). It doesn't work if
the pointer is unaligned, and it just doesn't worth it.
Diffstat (limited to 'sys/arm/include')
-rw-r--r-- | sys/arm/include/in_cksum.h | 75 |
1 files changed, 1 insertions, 74 deletions
diff --git a/sys/arm/include/in_cksum.h b/sys/arm/include/in_cksum.h index 4bdbdbb..8862f28 100644 --- a/sys/arm/include/in_cksum.h +++ b/sys/arm/include/in_cksum.h @@ -46,80 +46,7 @@ u_short in_cksum(struct mbuf *m, int len); u_short in_addword(u_short sum, u_short b); u_short in_cksum_skip(struct mbuf *m, int len, int skip); u_int do_cksum(const void *, int); -static __inline u_int -in_cksum_hdr(const struct ip *ip) -{ - u_int sum = 0; - u_int tmp1, tmp2, tmp3, tmp4; - - if (((vm_offset_t)ip & 0x03) == 0) - __asm __volatile ( - "adds %0, %0, %1\n" - "adcs %0, %0, %2\n" - "adcs %0, %0, %3\n" - "adcs %0, %0, %4\n" - "adcs %0, %0, %5\n" - "adc %0, %0, #0\n" - : "+r" (sum) - : "r" (((const u_int32_t *)ip)[0]), - "r" (((const u_int32_t *)ip)[1]), - "r" (((const u_int32_t *)ip)[2]), - "r" (((const u_int32_t *)ip)[3]), - "r" (((const u_int32_t *)ip)[4]) - ); - else - __asm __volatile ( - "and %1, %5, #3\n" - "cmp %1, #0x02\n" - "ldrb %2, [%5], #0x01\n" - "ldrgeb %3, [%5], #0x01\n" - "movlt %3, #0\n" - "ldrgtb %4, [%5], #0x01\n" - "movle %4, #0x00\n" -#ifdef __ARMEB__ - "orreq %0, %3, %2, lsl #8\n" - "orreq %0, %0, %4, lsl #24\n" - "orrne %0, %0, %3, lsl #8\n" - "orrne %0, %0, %4, lsl #16\n" -#else - "orreq %0, %2, %3, lsl #8\n" - "orreq %0, %0, %4, lsl #16\n" - "orrne %0, %3, %2, lsl #8\n" - "orrne %0, %0, %4, lsl #24\n" -#endif - "ldmia %5, {%2, %3, %4}\n" - "adcs %0, %0, %2\n" - "adcs %0, %0, %3\n" - "adcs %0, %0, %4\n" - "ldrb %2, [%5]\n" - "cmp %1, #0x02\n" - "ldrgeb %3, [%5, #0x01]\n" - "movlt %3, #0x00\n" - "ldrgtb %4, [%5, #0x02]\n" - "movle %4, #0x00\n" - "tst %5, #0x01\n" -#ifdef __ARMEB__ - "orreq %2, %3, %2, lsl #8\n" - "orreq %2, %2, %4, lsl #24\n" - "orrne %2, %2, %3, lsl #8\n" - "orrne %2, %2, %4, lsl #16\n" -#else - "orreq %2, %2, %3, lsl #8\n" - "orreq %2, %2, %4, lsl #16\n" - "orrne %2, %3, %2, lsl #8\n" - "orrne %2, %2, %4, lsl #24\n" -#endif - "adds %0, %0, %2\n" - "adc %0, %0, #0\n" - : "+r" (sum), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), - "=r" (tmp4) - : "r" (ip)); - - sum = (sum & 0xffff) + (sum >> 16); - if (sum > 0xffff) - sum -= 0xffff; - return (~sum & 0xffff); -} +u_int in_cksum_hdr(const struct ip *); static __inline u_short in_pseudo(u_int sum, u_int b, u_int c) |