NetBSD Problem Report #14614
Received: (qmail 21265 invoked from network); 17 Nov 2001 14:31:03 -0000
Message-Id: <200111171431.fAHEV0719994@azenomei.knuffel.net>
Date: Sat, 17 Nov 2001 15:31:00 +0100 (CET)
From: Rhialto <rhialto@azenomei.knuffel.net>
Reply-To: rhialto@azenomei.knuffel.net
To: gnats-bugs@gnats.netbsd.org
Cc: rhialto@azenomei.knuffel.net
Subject: VAX assembly in vax/in{4,}_cksum.c broken.
X-Send-Pr-Version: 3.95
>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: closed
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Nov 17 14:32:01 +0000 2001
>Closed-Date: Sun Dec 31 10:54:25 +0000 2006
>Last-Modified: Thu Jan 04 19:40:01 +0000 2007
>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 wiþh -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:
State-Changed-From-To: open->closed
State-Changed-By: ragge@netbsd.org
State-Changed-When: Sun, 31 Dec 2006 10:54:25 +0000
State-Changed-Why:
Bugfix provided in the PR solved the problem.
From: Anders Magnusson <ragge@netbsd.org>
To: gnats-bugs@NetBSD.org
Cc:
Subject: PR/14614 CVS commit: src/sys/arch/vax/vax
Date: Sun, 31 Dec 2006 10:52:52 +0000 (UTC)
Module Name: src
Committed By: ragge
Date: Sun Dec 31 10:52:52 UTC 2006
Modified Files:
src/sys/arch/vax/vax: in4_cksum.c in_cksum.c
Log Message:
GCC constraints error for inline assembler, causing in_cksum to calculate
the checksum wrong in the non-optimized case. Fix provided in PR#14614
by Rhialto, so this solves this PR.
To generate a diff of this commit:
cvs rdiff -r1.10 -r1.11 src/sys/arch/vax/vax/in4_cksum.c
cvs rdiff -r1.9 -r1.10 src/sys/arch/vax/vax/in_cksum.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
From: Manuel Bouyer <bouyer@netbsd.org>
To: gnats-bugs@NetBSD.org
Cc:
Subject: PR/14614 CVS commit: [netbsd-4] src/sys/arch/vax/vax
Date: Thu, 4 Jan 2007 19:37:59 +0000 (UTC)
Module Name: src
Committed By: bouyer
Date: Thu Jan 4 19:37:59 UTC 2007
Modified Files:
src/sys/arch/vax/vax [netbsd-4]: in4_cksum.c in_cksum.c
Log Message:
Pull up following revision(s) (requested by ragge in ticket #321):
sys/arch/vax/vax/in4_cksum.c: revision 1.11
sys/arch/vax/vax/in_cksum.c: revision 1.10
GCC constraints error for inline assembler, causing in_cksum to calculate
the checksum wrong in the non-optimized case. Fix provided in PR#14614
by Rhialto, so this solves this PR.
To generate a diff of this commit:
cvs rdiff -r1.10 -r1.10.24.1 src/sys/arch/vax/vax/in4_cksum.c
cvs rdiff -r1.9 -r1.9.24.1 src/sys/arch/vax/vax/in_cksum.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
>Unformatted:
(Contact us)
$NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.