mips: Remove rt_sigreturn usage on context function

Similar to powerpc, mips also issues rt_sigreturn for setcontext
case the v0 value saved is not the one set by setcontext or
makecontext. As for powerpc, it is intention is no really supported
since setcontext is not async-signal-safe.

Checked the context tests on mips64-linux-gnu and mips-linux-gnu.

	* sysdeps/unix/sysv/linux/mips/getcontext.S (__getcontext): Remove
	the magic flag store.
	* sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext):
	Likewise.
	* sysdeps/unix/sysv/linux/mips/swapcontext.S (__swapcontext):
	Likewise.
	* sysdeps/unix/sysv/linux/mips/setcontext.S (__setcontext):
	Remove rt_sigreturn call.
This commit is contained in:
Adhemerval Zanella 2019-02-15 12:04:45 -02:00
parent ffe8a9a831
commit a3ae315a8f
5 changed files with 9 additions and 53 deletions

View File

@ -1,5 +1,14 @@
2019-04-17 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* sysdeps/unix/sysv/linux/mips/getcontext.S (__getcontext): Remove
the magic flag store.
* sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext):
Likewise.
* sysdeps/unix/sysv/linux/mips/swapcontext.S (__swapcontext):
Likewise.
* sysdeps/unix/sysv/linux/mips/setcontext.S (__setcontext):
Remove rt_sigreturn call.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S:
Remove rt_sigreturn call.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S:

View File

@ -78,11 +78,6 @@ NESTED (__getcontext, FRAMESZ, ra)
.set at
#endif
/* Store a magic flag. */
li v1, 1
/* zero */
REG_S v1, (MCONTEXT_GREGOFF + 0 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
REG_S s0, (MCONTEXT_GREGOFF + 16 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
REG_S s1, (MCONTEXT_GREGOFF + 17 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
REG_S s2, (MCONTEXT_GREGOFF + 18 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)

View File

@ -93,11 +93,6 @@ NESTED (__makecontext, FRAMESZ, ra)
REG_S a7, A7OFF(sp)
#endif
/* Store a magic flag. */
li v1, 1
/* zero */
REG_S v1, (MCONTEXT_GREGOFF + 0 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
/* Set up the stack. */
PTR_L t0, STACK_SP(a0)
PTR_L t2, STACK_SIZE(a0)

View File

@ -77,12 +77,6 @@ NESTED (__setcontext, FRAMESZ, ra)
.set at
#endif
/* Check for the magic flag. */
li v0, 1
/* zero */
REG_L v1, (MCONTEXT_GREGOFF + 0 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
bne v0, v1, 98f
REG_S a0, A0OFF(sp)
/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
@ -154,38 +148,6 @@ NESTED (__setcontext, FRAMESZ, ra)
move v0, zero
jr t9
98:
/* This is a context obtained from a signal handler.
Perform a full restore by pushing the context
passed onto a simulated signal frame on the stack
and call the signal return syscall as if a signal
handler exited normally. */
PTR_ADDIU sp, -((RT_SIGFRAME_SIZE + ALSZ) & ALMASK)
cfi_adjust_cfa_offset ((RT_SIGFRAME_SIZE + ALSZ) & ALMASK)
/* Only ucontext is referred to from rt_sigreturn,
copy it. */
PTR_ADDIU t1, sp, RT_SIGFRAME_UCONTEXT
li t3, ((UCONTEXT_SIZE + SZREG - 1) / SZREG) - 1
0:
REG_L t2, (a0)
PTR_ADDIU a0, SZREG
REG_S t2, (t1)
PTR_ADDIU t1, SZREG
.set noreorder
bgtz t3, 0b
addiu t3, -1
.set reorder
/* rt_sigreturn () -- no arguments, sp points to struct rt_sigframe. */
li v0, SYS_ify (rt_sigreturn)
syscall
/* Restore the stack and fall through to the error
path. Successful rt_sigreturn never returns to
its calling place. */
PTR_ADDIU sp, ((RT_SIGFRAME_SIZE + ALSZ) & ALMASK)
cfi_adjust_cfa_offset (-((RT_SIGFRAME_SIZE + ALSZ) & ALMASK))
99:
#ifdef __PIC__
PTR_LA t9, JUMPTARGET (__syscall_error)

View File

@ -87,11 +87,6 @@ NESTED (__swapcontext, FRAMESZ, ra)
.set at
#endif
/* Store a magic flag. */
li v1, 1
/* zero */
REG_S v1, (MCONTEXT_GREGOFF + 0 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
REG_S s0, (MCONTEXT_GREGOFF + 16 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
REG_S s1, (MCONTEXT_GREGOFF + 17 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
REG_S s2, (MCONTEXT_GREGOFF + 18 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)