[committed] hppa: Save return pointer and correct PIC register restore in __getcontext and __setcontext
Commit Message
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.
@@ -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
@@ -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