Subject: port-vax/14614: VAX assembly in vax/in{4,}_cksum.c broken.
To: None <gnats-bugs@gnats.netbsd.org>
From: Rhialto <rhialto@azenomei.knuffel.net>
List: netbsd-bugs
Date: 11/17/2001 15:31:00
>Number:         14614
>Category:       port-vax
>Synopsis:       VAX assembly in vax/in{4,}_cksum.c broken.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    port-vax-maintainer
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Nov 17 06:32:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Rhialto
>Release:        <NetBSD-current source date>
>Organization:
	
>Environment:
	
System: NetBSD azenomei.falu.nl 1.5.1_BETA NetBSD 1.5.1_BETA (AZENOMEI) #0: Sun Apr 22 00:38:14 CEST 2001 rhialto@azenomei.falu.nl:/vol1/rhialto/cvs/netbsd-1-5/syssrc/sys/arch/alpha/compile/AZENOMEI alpha

Really, VAX 1.5.2 and -current

>Description:
	The assembly in /sys/arch/vax/vax/in{4,}_cksum.c is broken.
	It fails to specify the side-effect on variable w.
	And if you lie to the compiler, it will get its revenge.
	In this case, when you don't optimize, it will reload w for
	each use and the side-effect will be lost.
>How-To-Repeat:
	Compile a VAX kernel wih -O0. All network traffic has incorrect
	checksums now.
>Fix:

Index: in4_cksum.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/vax/vax/in4_cksum.c,v
retrieving revision 1.4
diff -u -r1.4 in4_cksum.c
--- in4_cksum.c	2001/05/19 23:47:19	1.4
+++ in4_cksum.c	2001/11/16 02:08:19
@@ -100,8 +100,8 @@
 #define SWAP		{sum <<= 8;}		/* depends on recent REDUCE */
 
 #define Asm     __asm __volatile
-#define ADDL    Asm("addl2 (%2)+,%0" : "=r" (sum) : "0" (sum), "r" (w))
-#define ADWC    Asm("adwc  (%2)+,%0" : "=r" (sum) : "0" (sum), "r" (w))
+#define ADDL    Asm("addl2 (%0)+,%1": "=r" (w), "=r" (sum): "0" (w), "1" (sum))
+#define ADWC    Asm("adwc  (%0)+,%1": "=r" (w), "=r" (sum): "0" (w), "1" (sum))
 #define ADDC    Asm("adwc     $0,%0" : "=r" (sum) : "0" (sum))
 #define UNSWAP  Asm("rotl  $8,%0,%0" : "=r" (sum) : "0" (sum))
 #define ADDBYTE	{sum += *w; SWAP; byte_swapped ^= 1;}
Index: in_cksum.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/vax/vax/in_cksum.c,v
retrieving revision 1.5
diff -u -r1.5 in_cksum.c
--- in_cksum.c	2000/06/07 19:31:33	1.5
+++ in_cksum.c	2001/11/16 02:08:19
@@ -56,8 +56,8 @@
 #define SWAP		{sum <<= 8;}		/* depends on recent REDUCE */
 
 #define Asm     __asm __volatile
-#define ADDL    Asm("addl2 (%2)+,%0" : "=r" (sum) : "0" (sum), "r" (w))
-#define ADWC    Asm("adwc  (%2)+,%0" : "=r" (sum) : "0" (sum), "r" (w))
+#define ADDL    Asm("addl2 (%0)+,%1": "=r" (w), "=r" (sum): "0" (w), "1" (sum))
+#define ADWC    Asm("adwc  (%0)+,%1": "=r" (w), "=r" (sum): "0" (w), "1" (sum))
 #define ADDC    Asm("adwc     $0,%0" : "=r" (sum) : "0" (sum))
 #define UNSWAP  Asm("rotl  $8,%0,%0" : "=r" (sum) : "0" (sum))
 #define ADDBYTE	{sum += *w; SWAP; byte_swapped ^= 1;}

-Olaf.
-- 
___ Olaf 'Rhialto' Seibert - rhialto@     --Soep van de dag, wat zal dat zijn
\X/ xs4all.nl --wat kan dat wezen, beter maar het ergste vrezen -Boy Bensdorp
>Release-Note:
>Audit-Trail:
>Unformatted: