diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-04-01 16:36:22 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-04-01 16:36:22 +0000 |
commit | 517660f1922aa1ad33831b08d90359241cb37118 (patch) | |
tree | 1ea29cb5382cea645f583593b4a30595bdb29419 /c/src/libnetworking | |
parent | Disable IXON by default based on comment from Eric Norum (diff) | |
download | rtems-517660f1922aa1ad33831b08d90359241cb37118.tar.bz2 |
Moved sparc specific version of in_cksum_hdr to an inline routine like
the reset of the CPU specific implementations after comment from
Eric Norum.
Diffstat (limited to 'c/src/libnetworking')
-rw-r--r-- | c/src/libnetworking/machine/in_cksum.h | 43 | ||||
-rw-r--r-- | c/src/libnetworking/rtems/rtems_glue.c | 31 |
2 files changed, 43 insertions, 31 deletions
diff --git a/c/src/libnetworking/machine/in_cksum.h b/c/src/libnetworking/machine/in_cksum.h index ba3c3668f6..dd2e01d4de 100644 --- a/c/src/libnetworking/machine/in_cksum.h +++ b/c/src/libnetworking/machine/in_cksum.h @@ -158,6 +158,49 @@ in_cksum_update(struct ip *ip) } /* + * SPARC Version + */ + +#elif (defined(__GNUC__) && defined(sparc)) + +static __inline u_int +in_cksum_hdr(const struct ip *ip) +{ + register u_int sum = 0; + register u_int tmp_o2; + register u_int tmp_o3; + + __asm__ volatile (" + ld [%0], %1 ; \ + ld [%0+4], %2 ; \ + addcc %1, %2, %1 ; \ + ld [%0+8], %2 ; \ + addxcc %1, %2, %1 ; \ + ld [%0+12], %2 ; \ + addxcc %1, %2, %1 ; \ + ld [%0+16], %2 ; \ + addxcc %1, %2, %1 ; \ + set 0x0ffff, %3 ; \ + srl %1, 16, %2 ; \ + and %1, %3, %1 ; \ + addx %1, %2, %1 ; \ + srl %1, 16, %1 ; \ + add %1, %%g0, %1 ; \ + neg %1 ; \ + and %1, %3, %1 ; \ + " : "=r" (ip), "=r" (sum), "=r" (tmp_o2), "=r" (tmp_o3) + : "0" (ip), "1" (sum) + ); + return sum; +} + +#define in_cksum_update(ip) \ + do { \ + int __tmpsum; \ + __tmpsum = (int)ntohs(ip->ip_sum) + 256; \ + ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16)); \ + } while(0) +/* * Here is the generic, portable, inefficient algorithm. */ diff --git a/c/src/libnetworking/rtems/rtems_glue.c b/c/src/libnetworking/rtems/rtems_glue.c index 73bb8c00a5..aa2452d88b 100644 --- a/c/src/libnetworking/rtems/rtems_glue.c +++ b/c/src/libnetworking/rtems/rtems_glue.c @@ -698,35 +698,6 @@ kmem_malloc (vm_map_t *map, vm_size_t size, boolean_t waitflag) * IP header checksum routine for processors which don't have an inline version */ -#if (defined(__GNUC__) && defined(sparc)) - - asm(" - .text - .global _in_cksum_hdr -_in_cksum_hdr: - - ld [%o0], %o1 - ld [%o0+4], %o2 - addcc %o1, %o2, %o1 - ld [%o0+8], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+12], %o2 - addxcc %o1, %o2, %o1 - ld [%o0+16], %o2 - addxcc %o1, %o2, %o1 - set 0x0ffff, %o3 - srl %o1, 16, %o2 - and %o1, %o3, %o1 - addx %o1, %o2, %o1 - srl %o1, 16, %o1 - add %o1, %g0, %o1 - neg %o1 - retl - and %o1, %o3, %o0 - - "); -#else - u_int in_cksum_hdr (const void *ip) { @@ -743,8 +714,6 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } -#endif - /* * Manipulate routing tables */ |