summaryrefslogtreecommitdiffstats
path: root/sys/arm/include
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2006-03-09 23:33:59 +0000
committercognet <cognet@FreeBSD.org>2006-03-09 23:33:59 +0000
commitb82f657662f73a0abbc224f3b2d85db65f9023ca (patch)
tree6513122252523498c1b37718a6ab76504c360a89 /sys/arm/include
parent9dcc540f357c739664c0570ba4e4021a4e46e4cf (diff)
downloadFreeBSD-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.h75
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)
OpenPOWER on IntegriCloud