diff mbox series

[committed] hppa: Save return pointer and correct PIC register restore in __getcontext and __setcontext

Message ID DF6DA6BD-A47E-48E7-B519-9A07C8722CB4@bell.net
State New
Headers show
Series [committed] hppa: Save return pointer and correct PIC register restore in __getcontext and __setcontext | expand

Commit Message

John David Anglin Oct. 1, 2017, 4:15 p.m. UTC
In fixing BZ libc/22165, I noticed a couple of issues with __getcontext and __setcontext.  We don't
save the return pointer in either of these routines.  Thus, if the epilogue is entered, we will likely fault
or return to the wrong location.  Secondly, the PIC register, %r19, is restored from the wrong offset
in __setcontext.

The attached patch fixes these issues.  However, stdlib/tst-setcontext2 still fails.

Dave
--
John David Anglin	dave.anglin@bell.net
2017-10-01  John David Anglin  <danglin@gcc.gnu.org>

	* sysdeps/unix/sysv/linux/hppa/getcontext.S (__getcontext): Save return
	pointer in frame.
	* sysdeps/unix/sysv/linux/hppa/setcontext.S (__setcontext): Likewise.
	Correct offset used to restore PIC register.
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/hppa/getcontext.S b/sysdeps/unix/sysv/linux/hppa/getcontext.S
index b201d8fda2..79a59cd557 100644
--- a/sysdeps/unix/sysv/linux/hppa/getcontext.S
+++ b/sysdeps/unix/sysv/linux/hppa/getcontext.S
@@ -129,6 +129,8 @@  ENTRY(__getcontext)
 	fstds	 %fr31, 0(%r1)
 
 	/* Prologue */
+	stw	%r2, -20(%sp)
+	.cfi_offset 2, -20
 	stwm	%r4, 64(%sp)
 	.cfi_def_cfa_offset -64
 	.cfi_offset 4, 0
diff --git a/sysdeps/unix/sysv/linux/hppa/setcontext.S b/sysdeps/unix/sysv/linux/hppa/setcontext.S
index 92cb204f8d..78357941b3 100644
--- a/sysdeps/unix/sysv/linux/hppa/setcontext.S
+++ b/sysdeps/unix/sysv/linux/hppa/setcontext.S
@@ -25,6 +25,8 @@ 
 
 ENTRY(__setcontext)
 	/* Prologue */
+	stw	%r2, -20(%sp)
+	.cfi_offset 2, -20
 	stwm	%r3, 64(%sp)
 	.cfi_def_cfa_offset -64
 	.cfi_offset 3, 0
@@ -151,7 +153,7 @@  ENTRY(__setcontext)
 	/* Epilogue */
 	ldw	-84(%r30), %r2
 #ifdef PIC
-	ldw	-96(%r30), %r19
+	ldw	-32(%r30), %r19
 #endif
 	bv	%r0(%r2)
 	ldwm	-64(%r30), %r3