summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorguenther <guenther@openbsd.org>2016-05-08 21:50:58 +0000
committerguenther <guenther@openbsd.org>2016-05-08 21:50:58 +0000
commit9a6f51cb79f3efb6cc03c3c73f3c365a6c9f2a22 (patch)
treee98ed2e1d962ff2e06d89ffdc05cceb450684959 /lib/libc
parentSwitch to getpwnam_shadow() now that getpwnam() no longer opens the shadow (diff)
downloadwireguard-openbsd-9a6f51cb79f3efb6cc03c3c73f3c365a6c9f2a22.tar.xz
wireguard-openbsd-9a6f51cb79f3efb6cc03c3c73f3c365a6c9f2a22.zip
Implement longjmp directly and not on top of sigreturn.
Use the hidden symbols for internal calls to abort, longjmp, etc ok deraadt@
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/arch/mips64/gen/_setjmp.S10
-rw-r--r--lib/libc/arch/mips64/gen/setjmp.S203
-rw-r--r--lib/libc/arch/mips64/gen/sigsetjmp.S10
3 files changed, 125 insertions, 98 deletions
diff --git a/lib/libc/arch/mips64/gen/_setjmp.S b/lib/libc/arch/mips64/gen/_setjmp.S
index 63e6d478fc4..beabc9347d5 100644
--- a/lib/libc/arch/mips64/gen/_setjmp.S
+++ b/lib/libc/arch/mips64/gen/_setjmp.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: _setjmp.S,v 1.4 2005/08/07 16:40:15 espie Exp $ */
+/* $OpenBSD: _setjmp.S,v 1.5 2016/05/08 21:50:58 guenther Exp $ */
/*
* Copyright (c) 2002 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -29,7 +29,7 @@
*
*/
-#include <machine/asm.h>
+#include "SYS.h"
#include <machine/regnum.h>
#include <machine/signal.h>
@@ -101,7 +101,7 @@ LEAF(_setjmp, FRAMESZ)
PTR_ADDU sp, FRAMESZ
j ra
move v0, zero
-END(_setjmp)
+END_STRONG(_setjmp)
LEAF(_longjmp, FRAMESZ)
PTR_SUBU sp, FRAMESZ
@@ -159,9 +159,9 @@ LEAF(_longjmp, FRAMESZ)
botch:
jal longjmperror
nop
- jal abort
+ jal _libc_abort
nop
RESTORE_GP64
PTR_ADDU sp, FRAMESZ
-END(_longjmp)
+END_STRONG(_longjmp)
diff --git a/lib/libc/arch/mips64/gen/setjmp.S b/lib/libc/arch/mips64/gen/setjmp.S
index 2d361fb6b59..dbe02d7bcad 100644
--- a/lib/libc/arch/mips64/gen/setjmp.S
+++ b/lib/libc/arch/mips64/gen/setjmp.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: setjmp.S,v 1.8 2015/09/13 07:36:58 guenther Exp $ */
+/* $OpenBSD: setjmp.S,v 1.9 2016/05/08 21:50:58 guenther Exp $ */
/*
* Copyright (c) 2001-2002 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -29,126 +29,153 @@
*
*/
-#include <sys/syscall.h>
-#include <machine/asm.h>
+#include "SYS.h"
#include <machine/regnum.h>
#include <machine/signal.h>
/*
* setjmp, longjmp implementation for libc. this code depends
* on the layout of the struct sigcontext in machine/signal.h.
- *
*/
-FRAMESZ= MKFSIZ(2,6)
-A0OFF= FRAMESZ-3*REGSZ
+FRAMESZ= MKFSIZ(0,4)
GPOFF= FRAMESZ-2*REGSZ
-RAOFF= FRAMESZ-1*REGSZ
-NON_LEAF(setjmp, FRAMESZ, ra)
- .mask 0x80000000, RAOFF
- PTR_SUBU sp, FRAMESZ # allocate stack frame
+LEAF(setjmp, FRAMESZ)
+ PTR_SUBU sp, FRAMESZ
SETUP_GP64(GPOFF, setjmp)
- .set reorder
- REG_S ra, RAOFF(sp) # save state
- REG_S a0, A0OFF(sp)
-
- move a0, zero # get current signal mask
- jal _libc_sigblock
+ .set noreorder
- REG_L v1, A0OFF(sp) # v1 = jmpbuf
- REG_S v0, SC_MASK(v1) # save sc_mask = sigblock(0)
+ move a2, a0 # save jmpbuf
+ li a0, 1 # how = SIG_BLOCK
+ move a1, zero # get current signal mask
+ li v0, SYS_sigprocmask
+ syscall # mask in v0
+ bne a3, zero, botch
+ REG_S v0, SC_MASK(a2) # save sc_mask
- move a0, zero
- PTR_ADD a1, sp, 0 # pointer to struct sigaltstack
- jal _thread_sys_sigaltstack
-
- REG_L a0, A0OFF(sp) # restore jmpbuf
- ld v1, REGSZ(sp) # get old ss_onstack
- and v1, v1, 1 # extract onstack flag
- REG_S v1, SC_ONSTACK(a0) # save it in sc_onstack
- REG_L ra, RAOFF(sp)
- blt v0, zero, botch # check for sigaltstack() error
- REG_S ra, SC_PC(a0) # sc_pc = return address
#if defined(__mips64)
dli v0, 0xACEDBADE # sigcontext magic number
#else
li v0, 0xACEDBADE # sigcontext magic number
#endif
- REG_S v0, SC_REGS+ZERO*REGSZ(a0)
- REG_S s0, SC_REGS+S0*REGSZ(a0)
- REG_S s1, SC_REGS+S1*REGSZ(a0)
- REG_S s2, SC_REGS+S2*REGSZ(a0)
- REG_S s3, SC_REGS+S3*REGSZ(a0)
- REG_S s4, SC_REGS+S4*REGSZ(a0)
- REG_S s5, SC_REGS+S5*REGSZ(a0)
- REG_S s6, SC_REGS+S6*REGSZ(a0)
- REG_S s7, SC_REGS+S7*REGSZ(a0)
- REG_S s8, SC_REGS+S8*REGSZ(a0)
+ REG_S v0, SC_REGS+ZERO*REGSZ(a2)
+ REG_S s0, SC_REGS+S0*REGSZ(a2)
+ REG_S s1, SC_REGS+S1*REGSZ(a2)
+ REG_S s2, SC_REGS+S2*REGSZ(a2)
+ REG_S s3, SC_REGS+S3*REGSZ(a2)
+ REG_S s4, SC_REGS+S4*REGSZ(a2)
+ REG_S s5, SC_REGS+S5*REGSZ(a2)
+ REG_S s6, SC_REGS+S6*REGSZ(a2)
+ REG_S s7, SC_REGS+S7*REGSZ(a2)
+ REG_S s8, SC_REGS+S8*REGSZ(a2)
REG_L v0, GPOFF(sp)
- REG_S v0, SC_REGS+GP*REGSZ(a0)
+ REG_S v0, SC_REGS+GP*REGSZ(a2)
PTR_ADDU v0, sp, FRAMESZ
- REG_S v0, SC_REGS+SP*REGSZ(a0)
- li v0, 1 # be nice if we could tell
- REG_S v0, SC_FPUSED(a0) # sc_fpused = 1
+ REG_S v0, SC_REGS+SP*REGSZ(a2)
+ REG_S ra, SC_PC(a2)
cfc1 v0, $31
#if _MIPS_FPSET == 32
- sdc1 $f20, SC_FPREGS+((F20-F0)*REGSZ)(a0)
- sdc1 $f21, SC_FPREGS+((F21-F0)*REGSZ)(a0)
- sdc1 $f22, SC_FPREGS+((F22-F0)*REGSZ)(a0)
- sdc1 $f23, SC_FPREGS+((F23-F0)*REGSZ)(a0)
- sdc1 $f24, SC_FPREGS+((F24-F0)*REGSZ)(a0)
- sdc1 $f25, SC_FPREGS+((F25-F0)*REGSZ)(a0)
- sdc1 $f26, SC_FPREGS+((F26-F0)*REGSZ)(a0)
- sdc1 $f27, SC_FPREGS+((F27-F0)*REGSZ)(a0)
- sdc1 $f28, SC_FPREGS+((F28-F0)*REGSZ)(a0)
- sdc1 $f29, SC_FPREGS+((F29-F0)*REGSZ)(a0)
- sdc1 $f30, SC_FPREGS+((F30-F0)*REGSZ)(a0)
- sdc1 $f31, SC_FPREGS+((F31-F0)*REGSZ)(a0)
+ sdc1 $f20, SC_FPREGS+((F20-F0)*REGSZ)(a2)
+ sdc1 $f21, SC_FPREGS+((F21-F0)*REGSZ)(a2)
+ sdc1 $f22, SC_FPREGS+((F22-F0)*REGSZ)(a2)
+ sdc1 $f23, SC_FPREGS+((F23-F0)*REGSZ)(a2)
+ sdc1 $f24, SC_FPREGS+((F24-F0)*REGSZ)(a2)
+ sdc1 $f25, SC_FPREGS+((F25-F0)*REGSZ)(a2)
+ sdc1 $f26, SC_FPREGS+((F26-F0)*REGSZ)(a2)
+ sdc1 $f27, SC_FPREGS+((F27-F0)*REGSZ)(a2)
+ sdc1 $f28, SC_FPREGS+((F28-F0)*REGSZ)(a2)
+ sdc1 $f29, SC_FPREGS+((F29-F0)*REGSZ)(a2)
+ sdc1 $f30, SC_FPREGS+((F30-F0)*REGSZ)(a2)
+ sdc1 $f31, SC_FPREGS+((F31-F0)*REGSZ)(a2)
#else
- swc1 $f20, SC_FPREGS+((F20-F0)*REGSZ)(a0)
- swc1 $f21, SC_FPREGS+((F21-F0)*REGSZ)(a0)
- swc1 $f22, SC_FPREGS+((F22-F0)*REGSZ)(a0)
- swc1 $f23, SC_FPREGS+((F23-F0)*REGSZ)(a0)
- swc1 $f24, SC_FPREGS+((F24-F0)*REGSZ)(a0)
- swc1 $f25, SC_FPREGS+((F25-F0)*REGSZ)(a0)
- swc1 $f26, SC_FPREGS+((F26-F0)*REGSZ)(a0)
- swc1 $f27, SC_FPREGS+((F27-F0)*REGSZ)(a0)
- swc1 $f28, SC_FPREGS+((F28-F0)*REGSZ)(a0)
- swc1 $f29, SC_FPREGS+((F29-F0)*REGSZ)(a0)
- swc1 $f30, SC_FPREGS+((F30-F0)*REGSZ)(a0)
- swc1 $f31, SC_FPREGS+((F31-F0)*REGSZ)(a0)
+ swc1 $f20, SC_FPREGS+((F20-F0)*REGSZ)(a2)
+ swc1 $f21, SC_FPREGS+((F21-F0)*REGSZ)(a2)
+ swc1 $f22, SC_FPREGS+((F22-F0)*REGSZ)(a2)
+ swc1 $f23, SC_FPREGS+((F23-F0)*REGSZ)(a2)
+ swc1 $f24, SC_FPREGS+((F24-F0)*REGSZ)(a2)
+ swc1 $f25, SC_FPREGS+((F25-F0)*REGSZ)(a2)
+ swc1 $f26, SC_FPREGS+((F26-F0)*REGSZ)(a2)
+ swc1 $f27, SC_FPREGS+((F27-F0)*REGSZ)(a2)
+ swc1 $f28, SC_FPREGS+((F28-F0)*REGSZ)(a2)
+ swc1 $f29, SC_FPREGS+((F29-F0)*REGSZ)(a2)
+ swc1 $f30, SC_FPREGS+((F30-F0)*REGSZ)(a2)
+ swc1 $f31, SC_FPREGS+((F31-F0)*REGSZ)(a2)
#endif
- REG_S v0, SC_FPREGS+((FSR-F0)*REGSZ)(a0)
- move v0, zero
+ REG_S v0, SC_FPREGS+((FSR-F0)*REGSZ)(a2)
RESTORE_GP64
PTR_ADDU sp, FRAMESZ
j ra
-
-botch:
- jal longjmperror
- jal abort
- RESTORE_GP64
- PTR_ADDU sp, FRAMESZ
-END(setjmp)
-
-
-FRAMESZ= MKFSIZ(1,1)
-GPOFF= FRAMESZ-2*REGSZ
+ move v0, zero
+END_STRONG(setjmp)
LEAF(longjmp, FRAMESZ)
PTR_SUBU sp, FRAMESZ
SETUP_GP64(GPOFF, longjmp)
- .set reorder
- bne a1, zero, 1f
- li a1, 1 # never return 0!
-1:
- REG_S a1, SC_REGS+V0*REGSZ(a0)
- li v0, SYS_sigreturn
+ .set noreorder
+
+ move a2, a0 # save jmpbuf
+ move a4, a1 # save val
+ REG_L a1, SC_MASK(a2) # load sc_mask
+ li a0, 3 # how = SIG_SETMASK
+ li v0, SYS_sigprocmask
syscall
+ bne a3, zero, botch
+ REG_L v0, SC_REGS+ZERO*REGSZ(a2)
+ bne v0, 0xACEDBADE, botch # jump if error
+ REG_L ra, SC_PC(a2)
+ REG_L v0, SC_FPREGS+((FSR-F0)*REGSZ)(a2)
+ REG_L s0, SC_REGS+S0*REGSZ(a2)
+ REG_L s1, SC_REGS+S1*REGSZ(a2)
+ REG_L s2, SC_REGS+S2*REGSZ(a2)
+ REG_L s3, SC_REGS+S3*REGSZ(a2)
+ REG_L s4, SC_REGS+S4*REGSZ(a2)
+ REG_L s5, SC_REGS+S5*REGSZ(a2)
+ REG_L s6, SC_REGS+S6*REGSZ(a2)
+ REG_L s7, SC_REGS+S7*REGSZ(a2)
+ REG_L s8, SC_REGS+S8*REGSZ(a2)
+ REG_L gp, SC_REGS+GP*REGSZ(a2)
+ REG_L sp, SC_REGS+SP*REGSZ(a2)
+ ctc1 v0, $31
+#if _MIPS_FPSET == 32
+ ldc1 $f20, SC_FPREGS+((F20-F0)*REGSZ)(a2)
+ ldc1 $f21, SC_FPREGS+((F21-F0)*REGSZ)(a2)
+ ldc1 $f22, SC_FPREGS+((F22-F0)*REGSZ)(a2)
+ ldc1 $f23, SC_FPREGS+((F23-F0)*REGSZ)(a2)
+ ldc1 $f24, SC_FPREGS+((F24-F0)*REGSZ)(a2)
+ ldc1 $f25, SC_FPREGS+((F25-F0)*REGSZ)(a2)
+ ldc1 $f26, SC_FPREGS+((F26-F0)*REGSZ)(a2)
+ ldc1 $f27, SC_FPREGS+((F27-F0)*REGSZ)(a2)
+ ldc1 $f28, SC_FPREGS+((F28-F0)*REGSZ)(a2)
+ ldc1 $f29, SC_FPREGS+((F29-F0)*REGSZ)(a2)
+ ldc1 $f30, SC_FPREGS+((F30-F0)*REGSZ)(a2)
+ ldc1 $f31, SC_FPREGS+((F31-F0)*REGSZ)(a2)
+#else
+ lwc1 $f20, SC_FPREGS+((F20-F0)*REGSZ)(a2)
+ lwc1 $f21, SC_FPREGS+((F21-F0)*REGSZ)(a2)
+ lwc1 $f22, SC_FPREGS+((F22-F0)*REGSZ)(a2)
+ lwc1 $f23, SC_FPREGS+((F23-F0)*REGSZ)(a2)
+ lwc1 $f24, SC_FPREGS+((F24-F0)*REGSZ)(a2)
+ lwc1 $f25, SC_FPREGS+((F25-F0)*REGSZ)(a2)
+ lwc1 $f26, SC_FPREGS+((F26-F0)*REGSZ)(a2)
+ lwc1 $f27, SC_FPREGS+((F27-F0)*REGSZ)(a2)
+ lwc1 $f28, SC_FPREGS+((F28-F0)*REGSZ)(a2)
+ lwc1 $f29, SC_FPREGS+((F29-F0)*REGSZ)(a2)
+ lwc1 $f30, SC_FPREGS+((F30-F0)*REGSZ)(a2)
+ lwc1 $f31, SC_FPREGS+((F31-F0)*REGSZ)(a2)
+#endif
+ beql a4, zero, 1f
+ li a4, 1 # only executed if branch taken.
+1:
+ j ra
+ move v0, a4
+
+botch:
jal longjmperror
- jal abort
+ nop
+ jal _libc_abort
+ nop
RESTORE_GP64
PTR_ADDU sp, FRAMESZ
-END(longjmp)
+END_STRONG(longjmp)
diff --git a/lib/libc/arch/mips64/gen/sigsetjmp.S b/lib/libc/arch/mips64/gen/sigsetjmp.S
index b05454c2843..a14b88b5eaf 100644
--- a/lib/libc/arch/mips64/gen/sigsetjmp.S
+++ b/lib/libc/arch/mips64/gen/sigsetjmp.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: sigsetjmp.S,v 1.5 2005/08/07 16:40:15 espie Exp $ */
+/* $OpenBSD: sigsetjmp.S,v 1.6 2016/05/08 21:50:58 guenther Exp $ */
/*-
* Copyright (c) 1991, 1993, 1995,
* The Regents of the University of California. All rights reserved.
@@ -48,12 +48,12 @@ LEAF(sigsetjmp, FRAMESZ)
.set reorder
REG_S a1, (_JBLEN*REGSZ)(a0) # save "savemask"
bne a1, 0x0, 1f # do saving of signal mask?
- LA t9, _setjmp
+ LA t9, _libc__setjmp
RESTORE_GP64
PTR_ADDU sp, FRAMESZ
jr t9
-1: LA t9, setjmp
+1: LA t9, _libc_setjmp
RESTORE_GP64
PTR_ADDU sp, FRAMESZ
jr t9
@@ -65,12 +65,12 @@ LEAF(siglongjmp, FRAMESZ)
.set reorder
REG_L t0, (_JBLEN*REGSZ)(a0) # get "savemask"
bne t0, 0x0, 1f # restore signal mask?
- LA t9, _longjmp
+ LA t9, _libc__longjmp
RESTORE_GP64
PTR_ADDU sp, FRAMESZ
jr t9
1:
- LA t9, longjmp
+ LA t9, _libc_longjmp
RESTORE_GP64
PTR_ADDU sp, FRAMESZ
jr t9