Module Name:    src
Committed By:   chs
Date:           Mon Nov 21 16:17:48 UTC 2011

Modified Files:
        src/lib/libc/arch/vax/gen: alloca.S
        src/lib/libc/arch/vax/sys: __vfork14.S getcontext.S

Log Message:
gcc 4.5 on vax creates PLT stubs with an entry mask of 0xffc
rather than 0 like gcc 4.1 did, so the sneaky assembly functions
that "ret" without really returning now clobber their registers.
adjust these functions to avoid this problem.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/arch/vax/gen/alloca.S
cvs rdiff -u -r1.6 -r1.7 src/lib/libc/arch/vax/sys/__vfork14.S
cvs rdiff -u -r1.5 -r1.6 src/lib/libc/arch/vax/sys/getcontext.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/arch/vax/gen/alloca.S
diff -u src/lib/libc/arch/vax/gen/alloca.S:1.4 src/lib/libc/arch/vax/gen/alloca.S:1.5
--- src/lib/libc/arch/vax/gen/alloca.S:1.4	Tue Jan 25 02:38:15 2011
+++ src/lib/libc/arch/vax/gen/alloca.S	Mon Nov 21 16:17:48 2011
@@ -31,17 +31,17 @@
 
 #if defined(LIBC_SCCS) && !defined(lint)
 	/* .asciz "@(#)alloca.s	8.1 (Berkeley) 6/4/93" */
-RCSID("$NetBSD: alloca.S,v 1.4 2011/01/25 02:38:15 matt Exp $")
+RCSID("$NetBSD: alloca.S,v 1.5 2011/11/21 16:17:48 chs Exp $")
 #endif /* LIBC_SCCS and not lint */
 
 ENTRY(alloca, 0)
 	movl	4(%ap),%r0	# get allocation size
-	movl	16(%fp),%r2	# save return address before we smash it
+	movl	16(%fp),%r1	# save return address before we smash it
 	movab	here,16(%fp)
 	ret
 here:
 	subl2	%r0,%sp		# create stack space
 	bicl2	$3,%sp		# align to longword boundary
 	movl	%sp,%r0
-	jmp	(%r2)
+	jmp	(%r1)
 END(alloca)

Index: src/lib/libc/arch/vax/sys/__vfork14.S
diff -u src/lib/libc/arch/vax/sys/__vfork14.S:1.6 src/lib/libc/arch/vax/sys/__vfork14.S:1.7
--- src/lib/libc/arch/vax/sys/__vfork14.S:1.6	Tue Jan 25 02:38:15 2011
+++ src/lib/libc/arch/vax/sys/__vfork14.S	Mon Nov 21 16:17:48 2011
@@ -31,7 +31,7 @@
 
 #if defined(SYSLIBC_SCCS) && !defined(lint)
 	/* .asciz "@(#)Ovfork.s	8.1 (Berkeley) 6/4/93" */
-RCSID("$NetBSD: __vfork14.S,v 1.6 2011/01/25 02:38:15 matt Exp $")
+RCSID("$NetBSD: __vfork14.S,v 1.7 2011/11/21 16:17:48 chs Exp $")
 #endif /* SYSLIBC_SCCS and not lint */
 
 /*
@@ -51,10 +51,11 @@ RCSID("$NetBSD: __vfork14.S,v 1.6 2011/0
  */
 
 ENTRY(__vfork14, 0)
-	movl	16(%fp),%r2	# save return address before we smash it
+	movl	16(%fp),%r0	# save return address before we smash it
 	movab	here,16(%fp)
 	ret
 here:
+	movl	%r0,%r2
 	chmk	$ SYS___vfork14
 	bcs	err		# if failed, set errno and return -1
 	/* this next trick is Chris Torek's fault */

Index: src/lib/libc/arch/vax/sys/getcontext.S
diff -u src/lib/libc/arch/vax/sys/getcontext.S:1.5 src/lib/libc/arch/vax/sys/getcontext.S:1.6
--- src/lib/libc/arch/vax/sys/getcontext.S:1.5	Tue Jan 25 02:38:15 2011
+++ src/lib/libc/arch/vax/sys/getcontext.S	Mon Nov 21 16:17:48 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: getcontext.S,v 1.5 2011/01/25 02:38:15 matt Exp $	*/
+/*	$NetBSD: getcontext.S,v 1.6 2011/11/21 16:17:48 chs Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #include "SYS.h"
 
 #ifdef SYSLIBC_SCCS
-RCSID("$NetBSD: getcontext.S,v 1.5 2011/01/25 02:38:15 matt Exp $")
+RCSID("$NetBSD: getcontext.S,v 1.6 2011/11/21 16:17:48 chs Exp $")
 #endif
 
 #ifdef WEAK_ALIAS
@@ -48,8 +48,8 @@ ENTRY(_getcontext, 0)
 	jcc	1f
 	jmp	CERROR+2		/* badness happened */
 
-1:	movl	4(%ap),%r2		/* ptr to ucontext */
-	movl	16(%fp),%r3		/* PC to return to */
+1:	movl	4(%ap),%r0		/* ptr to ucontext */
+	movl	16(%fp),%r1		/* PC to return to */
 	movab	2f,16(%fp)		/* let's return early */
 	ret
 	/*
@@ -59,8 +59,9 @@ ENTRY(_getcontext, 0)
 	 * the callers state but we still have control.
 	 */
 	_ALIGN_TEXT
-2:	movq	%ap,(36+12*4)(%r2)	/* adjust AP + SP */
-	movl	%fp,(36+14*4)(%r2)	/* adjust FP */
-	movl	%r3,(36+15*4)(%r2)	/* adjust PC */
-	jmp	(%r3)			/* and return */
+2:	movq	%ap,(36+12*4)(%r0)	/* adjust AP + SP */
+	movl	%fp,(36+14*4)(%r0)	/* adjust FP */
+	movl	%r3,(36+15*4)(%r0)	/* adjust PC */
+	clrl	%r0
+	jmp	(%r1)			/* and return */
 END(_getcontext)

Reply via email to