diff options
-rw-r--r-- | c/src/exec/libnetworking/rtems/rtems_glue.c | 32 | ||||
-rw-r--r-- | c/src/lib/libnetworking/rtems/rtems_glue.c | 32 | ||||
-rw-r--r-- | c/src/libnetworking/rtems/rtems_glue.c | 32 | ||||
-rw-r--r-- | cpukit/libnetworking/rtems/rtems_glue.c | 32 |
4 files changed, 128 insertions, 0 deletions
diff --git a/c/src/exec/libnetworking/rtems/rtems_glue.c b/c/src/exec/libnetworking/rtems/rtems_glue.c index ab734c1aca..dae362f735 100644 --- a/c/src/exec/libnetworking/rtems/rtems_glue.c +++ b/c/src/exec/libnetworking/rtems/rtems_glue.c @@ -697,6 +697,36 @@ 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 */ + +#ifdef (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) { @@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } +#endif + /* * Manipulate routing tables */ diff --git a/c/src/lib/libnetworking/rtems/rtems_glue.c b/c/src/lib/libnetworking/rtems/rtems_glue.c index ab734c1aca..dae362f735 100644 --- a/c/src/lib/libnetworking/rtems/rtems_glue.c +++ b/c/src/lib/libnetworking/rtems/rtems_glue.c @@ -697,6 +697,36 @@ 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 */ + +#ifdef (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) { @@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } +#endif + /* * Manipulate routing tables */ diff --git a/c/src/libnetworking/rtems/rtems_glue.c b/c/src/libnetworking/rtems/rtems_glue.c index ab734c1aca..dae362f735 100644 --- a/c/src/libnetworking/rtems/rtems_glue.c +++ b/c/src/libnetworking/rtems/rtems_glue.c @@ -697,6 +697,36 @@ 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 */ + +#ifdef (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) { @@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } +#endif + /* * Manipulate routing tables */ diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c index ab734c1aca..dae362f735 100644 --- a/cpukit/libnetworking/rtems/rtems_glue.c +++ b/cpukit/libnetworking/rtems/rtems_glue.c @@ -697,6 +697,36 @@ 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 */ + +#ifdef (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) { @@ -713,6 +743,8 @@ in_cksum_hdr (const void *ip) return ~sum & 0xFFFF; } +#endif + /* * Manipulate routing tables */ |