This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Bug fixes for ____longjmp_chk on sparc


With this, and an upstream kernel bug fix I'm about to push upstream,
the tst-longjmp_chk2 test finally passes on sparc.

Committed to master.

diff --git a/ChangeLog b/ChangeLog
index fadf296..6ebab02 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-08-20  David S. Miller  <davem@davemloft.net>
+
+	* sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S: Fix
+	sigaltstack check, add missing cfi directives.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S: Add
+	missing cfi directives, and sigaltstack handling.
+
 2011-08-20  Ulrich Drepper  <drepper@gmail.com>
 
 	* nss/nss_files/files-alias.c (get_next_alias): Use feof_unlocked
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
index 0ecd7dd..bbb9eaa 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S
@@ -41,10 +41,14 @@ ENTRY (____longjmp_chk)
 	 nop
 
 	save	%sp, -80, %sp
+	cfi_remember_state
+	cfi_def_cfa_register(%fp)
+	cfi_window_save
+	cfi_register(%o7, %i7)
 
 	clr	%o0
 	add	%sp, 64, %o1
-	set	__NR_sigaltstack, %g1
+	LOADSYSCALL(sigaltstack)
 	ta	0x10
 	bcs	.Lok
 	 ld	[%sp + 64 + 4], %o2
@@ -54,8 +58,8 @@ ENTRY (____longjmp_chk)
 
 	ld	[%sp + 64 + 8], %o1
 	add	%o0, %o1, %o0
-	sub	%o0, %g3, %o0
-	cmp	%o1, %o0
+	sub	%o0, %g5, %o0
+	cmp	%o0, %o1
 	bgeu	.Lok
 	 nop
 
@@ -76,6 +80,7 @@ ENTRY (____longjmp_chk)
 
 .Lok:
 	restore
+	cfi_restore_state
 
 .Lok_norestore:
 	ld	ENV(o0,JB_FP), %g3	/* Cache target FP in register %g3.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S
index 9a4c8fe..836e62e 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S
@@ -40,8 +40,29 @@ ENTRY (____longjmp_chk)
 	bleu,pt	%xcc, .Lok
 	 nop
 
-	save	%sp, -128, %sp
+	save	%sp, -208, %sp
+	cfi_remember_state
+	cfi_def_cfa_register(%fp)
+	cfi_window_save
+	cfi_register(%o7, %i7)
+	add	%fp, 2023, %o1
+	clr	%o0
+	LOADSYSCALL(sigaltstack)
+	ta	0x6d
+	bcs,pn	%xcc, .Lok2
+	 lduw	[%fp + 2031], %l2
+	andcc	%l2, 0x1, %g0
+	be,pn	%xcc, .Lfail
+	 ldx	[%fp + 2023], %l0
+	ldx	[%fp + 2039], %l1
+	sub	%l0, STACK_BIAS, %l0
+	add	%l0, %l1, %l0
+	sub	%l0, %i2, %l0
+	cmp	%l0, %l1
+	bgeu,pt	%xcc, .Lok2
+	 nop
 
+.Lfail:
 #ifdef PIC
 1:	call	2f
 	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
@@ -56,7 +77,8 @@ ENTRY (____longjmp_chk)
 	call	HIDDEN_JUMPTARGET(__fortify_fail)
 	 nop
 
-	restore
+.Lok2:	restore
+	cfi_restore_state
 
 .Lok:
 	/* Modify the context with the value we want to return.  */
-- 
1.7.6.401.g6a319


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]