summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-04-01 16:36:22 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-04-01 16:36:22 +0000
commit517660f1922aa1ad33831b08d90359241cb37118 (patch)
tree1ea29cb5382cea645f583593b4a30595bdb29419
parentDisable IXON by default based on comment from Eric Norum (diff)
downloadrtems-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.
-rw-r--r--c/src/exec/libnetworking/machine/in_cksum.h43
-rw-r--r--c/src/exec/libnetworking/rtems/rtems_glue.c31
-rw-r--r--c/src/lib/libnetworking/machine/in_cksum.h43
-rw-r--r--c/src/lib/libnetworking/rtems/rtems_glue.c31
-rw-r--r--c/src/libnetworking/machine/in_cksum.h43
-rw-r--r--c/src/libnetworking/rtems/rtems_glue.c31
-rw-r--r--cpukit/libnetworking/machine/in_cksum.h43
-rw-r--r--cpukit/libnetworking/rtems/rtems_glue.c31
8 files changed, 172 insertions, 124 deletions
diff --git a/c/src/exec/libnetworking/machine/in_cksum.h b/c/src/exec/libnetworking/machine/in_cksum.h
index ba3c3668f6..dd2e01d4de 100644
--- a/c/src/exec/libnetworking/machine/in_cksum.h
+++ b/c/src/exec/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/exec/libnetworking/rtems/rtems_glue.c b/c/src/exec/libnetworking/rtems/rtems_glue.c
index 73bb8c00a5..aa2452d88b 100644
--- a/c/src/exec/libnetworking/rtems/rtems_glue.c
+++ b/c/src/exec/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
*/
diff --git a/c/src/lib/libnetworking/machine/in_cksum.h b/c/src/lib/libnetworking/machine/in_cksum.h
index ba3c3668f6..dd2e01d4de 100644
--- a/c/src/lib/libnetworking/machine/in_cksum.h
+++ b/c/src/lib/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/lib/libnetworking/rtems/rtems_glue.c b/c/src/lib/libnetworking/rtems/rtems_glue.c
index 73bb8c00a5..aa2452d88b 100644
--- a/c/src/lib/libnetworking/rtems/rtems_glue.c
+++ b/c/src/lib/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
*/
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
*/
diff --git a/cpukit/libnetworking/machine/in_cksum.h b/cpukit/libnetworking/machine/in_cksum.h
index ba3c3668f6..dd2e01d4de 100644
--- a/cpukit/libnetworking/machine/in_cksum.h
+++ b/cpukit/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/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c
index 73bb8c00a5..aa2452d88b 100644
--- a/cpukit/libnetworking/rtems/rtems_glue.c
+++ b/cpukit/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
*/