diff options
author | 2016-05-08 21:50:58 +0000 | |
---|---|---|
committer | 2016-05-08 21:50:58 +0000 | |
commit | 9a6f51cb79f3efb6cc03c3c73f3c365a6c9f2a22 (patch) | |
tree | e98ed2e1d962ff2e06d89ffdc05cceb450684959 /lib/libc | |
parent | Switch to getpwnam_shadow() now that getpwnam() no longer opens the shadow (diff) | |
download | wireguard-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.S | 10 | ||||
-rw-r--r-- | lib/libc/arch/mips64/gen/setjmp.S | 203 | ||||
-rw-r--r-- | lib/libc/arch/mips64/gen/sigsetjmp.S | 10 |
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 |