diff options
author | 2020-11-28 19:49:30 +0000 | |
---|---|---|
committer | 2020-11-28 19:49:30 +0000 | |
commit | 15572fcf8c6bfa0588565cd23f393a5a1499ea57 (patch) | |
tree | a41513c79b27dd0f2180dbab6506b34caf86aa35 | |
parent | Since our IPI broadcast functions exclude the CPU doing the broadcast, we (diff) | |
download | wireguard-openbsd-15572fcf8c6bfa0588565cd23f393a5a1499ea57.tar.xz wireguard-openbsd-15572fcf8c6bfa0588565cd23f393a5a1499ea57.zip |
Add retguard to macppc kernel locore.S, ofwreal.S, setjmp.S
This changes RETGUARD_SETUP(ffs) to RETGUARD_SETUP(ffs, %r11, %r12)
and RETGUARD_CHECK(ffs) to RETGUARD_CHECK(ffs, %r11, %r12)
to show that r11 and r12 are in use between setup and check, and to
pick registers other than r11 and r12 in some kernel functions.
ok mortimer@ deraadt@
-rw-r--r-- | lib/libc/arch/powerpc/SYS.h | 10 | ||||
-rw-r--r-- | lib/libc/arch/powerpc/string/ffs.S | 6 | ||||
-rw-r--r-- | lib/libc/arch/powerpc/string/memmove.S | 8 | ||||
-rw-r--r-- | lib/libc/arch/powerpc/sys/sigpending.S | 6 | ||||
-rw-r--r-- | lib/libc/arch/powerpc/sys/sigprocmask.S | 6 | ||||
-rw-r--r-- | lib/libc/arch/powerpc/sys/sigsuspend.S | 6 | ||||
-rw-r--r-- | lib/libc/arch/powerpc/sys/tfork_thread.S | 6 | ||||
-rw-r--r-- | libexec/ld.so/powerpc/SYS.h | 6 | ||||
-rw-r--r-- | sys/arch/macppc/macppc/locore.S | 28 | ||||
-rw-r--r-- | sys/arch/macppc/macppc/ofwreal.S | 18 | ||||
-rw-r--r-- | sys/arch/powerpc/include/asm.h | 31 | ||||
-rw-r--r-- | sys/arch/powerpc/powerpc/setjmp.S | 17 | ||||
-rw-r--r-- | sys/lib/libkern/arch/powerpc/ffs.S | 6 | ||||
-rw-r--r-- | sys/lib/libkern/arch/powerpc/memmove.S | 8 |
14 files changed, 97 insertions, 65 deletions
diff --git a/lib/libc/arch/powerpc/SYS.h b/lib/libc/arch/powerpc/SYS.h index 8705241b48a..053728a6395 100644 --- a/lib/libc/arch/powerpc/SYS.h +++ b/lib/libc/arch/powerpc/SYS.h @@ -1,4 +1,4 @@ -/* $OpenBSD: SYS.h,v 1.24 2020/10/26 22:07:05 gkoehler Exp $ */ +/* $OpenBSD: SYS.h,v 1.25 2020/11/28 19:49:30 gkoehler Exp $ */ /*- * Copyright (c) 1994 * Andrew Cagney. All rights reserved. @@ -84,15 +84,15 @@ #define __END(x) __END_HIDDEN(x); END(x) #define PSEUDO_NOERROR(x,y) SYSENTRY(x) \ - RETGUARD_SETUP(x); \ + RETGUARD_SETUP(x, %r11, %r12); \ li %r0, SYS_ ## y ; \ sc; \ - RETGUARD_CHECK(x); \ + RETGUARD_CHECK(x, %r11, %r12); \ blr; \ __END(x) #define PSEUDO_HIDDEN(x,y) SYSENTRY_HIDDEN(x) \ - RETGUARD_SETUP(x); \ + RETGUARD_SETUP(x, %r11, %r12); \ li %r0, SYS_ ## y; \ sc; \ cmpwi %r0, 0; \ @@ -101,7 +101,7 @@ li %r3, -1; \ li %r4, -1; /* for __syscall(lseek) */ \ .L_ret: \ - RETGUARD_CHECK(x); \ + RETGUARD_CHECK(x, %r11, %r12); \ blr; \ __END_HIDDEN(x) diff --git a/lib/libc/arch/powerpc/string/ffs.S b/lib/libc/arch/powerpc/string/ffs.S index c8a6eacc128..4d6410ebd49 100644 --- a/lib/libc/arch/powerpc/string/ffs.S +++ b/lib/libc/arch/powerpc/string/ffs.S @@ -1,4 +1,4 @@ -/* $OpenBSD: ffs.S,v 1.2 2020/10/26 22:07:05 gkoehler Exp $ */ +/* $OpenBSD: ffs.S,v 1.3 2020/11/28 19:49:30 gkoehler Exp $ */ /* * Written by Christian Weisgerber <naddy@openbsd.org>. * Public domain. @@ -7,12 +7,12 @@ #include "SYS.h" ENTRY(ffs) - RETGUARD_SETUP(ffs) + RETGUARD_SETUP(ffs, %r11, %r12) neg %r4, %r3 and %r3, %r3, %r4 cntlzw %r3, %r3 subfic %r3, %r3, 32 - RETGUARD_CHECK(ffs) + RETGUARD_CHECK(ffs, %r11, %r12) blr END(ffs) .protected diff --git a/lib/libc/arch/powerpc/string/memmove.S b/lib/libc/arch/powerpc/string/memmove.S index 4b6ba3cc82b..1aa29c3f544 100644 --- a/lib/libc/arch/powerpc/string/memmove.S +++ b/lib/libc/arch/powerpc/string/memmove.S @@ -1,4 +1,4 @@ -/* $OpenBSD: memmove.S,v 1.3 2020/10/26 22:07:05 gkoehler Exp $ */ +/* $OpenBSD: memmove.S,v 1.4 2020/11/28 19:49:30 gkoehler Exp $ */ /* $NetBSD: memmove.S,v 1.3 2011/01/15 07:31:12 matt Exp $ */ /* stropt/memmove.S, pl_string_common, pl_linux 10/11/04 11:45:37 @@ -46,7 +46,7 @@ /* void *memcpy(void *to, const void *from, size_t len) */ #if 0 ENTRY(memcpy) - RETGUARD_SETUP(memmove) + RETGUARD_SETUP(memmove, %r11, %r12) mr %r8, %r3 /* Save dst (return value) */ b fwd #endif @@ -59,7 +59,7 @@ ENTRY(bcopy) /* void *memmove(void *, const void *, size_t) */ ENTRY(memmove) - RETGUARD_SETUP(memmove) + RETGUARD_SETUP(memmove, %r11, %r12) mr %r8, %r3 /* Save dst (return value) */ cmpw %r4, %r8 /* Branch to reverse if */ @@ -169,7 +169,7 @@ rlast2: bdnz+ rlast2 /* Dec ctr, and branch if more */ /* bytes left */ done: - RETGUARD_CHECK(memmove) + RETGUARD_CHECK(memmove, %r11, %r12) blr END_STRONG(memmove) END_WEAK(bcopy) diff --git a/lib/libc/arch/powerpc/sys/sigpending.S b/lib/libc/arch/powerpc/sys/sigpending.S index 0136633fef5..fa41751497e 100644 --- a/lib/libc/arch/powerpc/sys/sigpending.S +++ b/lib/libc/arch/powerpc/sys/sigpending.S @@ -1,4 +1,4 @@ -/* $OpenBSD: sigpending.S,v 1.7 2020/10/26 22:07:05 gkoehler Exp $ */ +/* $OpenBSD: sigpending.S,v 1.8 2020/11/28 19:49:30 gkoehler Exp $ */ /* * Copyright (c) 2012 Mark Kettenis * @@ -21,12 +21,12 @@ .text SYSENTRY(sigpending) - RETGUARD_SETUP(sigpending) + RETGUARD_SETUP(sigpending, %r11, %r12) mr %r5, %r3 li %r0, SYS_sigpending sc stw %r3, 0(%r5) li %r3, 0 - RETGUARD_CHECK(sigpending) + RETGUARD_CHECK(sigpending, %r11, %r12) blr SYSCALL_END(sigpending) diff --git a/lib/libc/arch/powerpc/sys/sigprocmask.S b/lib/libc/arch/powerpc/sys/sigprocmask.S index 57b0987b542..bb21c0ca741 100644 --- a/lib/libc/arch/powerpc/sys/sigprocmask.S +++ b/lib/libc/arch/powerpc/sys/sigprocmask.S @@ -1,4 +1,4 @@ -/* $OpenBSD: sigprocmask.S,v 1.13 2020/10/26 22:07:06 gkoehler Exp $ */ +/* $OpenBSD: sigprocmask.S,v 1.14 2020/11/28 19:49:30 gkoehler Exp $ */ /* * Copyright (c) 1996 Dale Rahn @@ -31,7 +31,7 @@ .text SYSENTRY_HIDDEN(sigprocmask) - RETGUARD_SETUP(sigprocmask) + RETGUARD_SETUP(sigprocmask, %r11, %r12) stwu 1, -16(1) stw 5, 12(1) @@ -64,6 +64,6 @@ SYSENTRY_HIDDEN(sigprocmask) li 3, 0 addi 1, 1, 16 .L_end: - RETGUARD_CHECK(sigprocmask) + RETGUARD_CHECK(sigprocmask, %r11, %r12) blr SYSCALL_END_HIDDEN(sigprocmask) diff --git a/lib/libc/arch/powerpc/sys/sigsuspend.S b/lib/libc/arch/powerpc/sys/sigsuspend.S index 822345dd448..1c0f2372fff 100644 --- a/lib/libc/arch/powerpc/sys/sigsuspend.S +++ b/lib/libc/arch/powerpc/sys/sigsuspend.S @@ -1,4 +1,4 @@ -/* $OpenBSD: sigsuspend.S,v 1.6 2020/10/26 22:07:06 gkoehler Exp $ */ +/* $OpenBSD: sigsuspend.S,v 1.7 2020/11/28 19:49:30 gkoehler Exp $ */ /* * Copyright (c) 1996 Dale Rahn @@ -31,7 +31,7 @@ .text SYSENTRY_HIDDEN(sigsuspend) - RETGUARD_SETUP(sigsuspend) + RETGUARD_SETUP(sigsuspend, %r11, %r12) li %r0, SYS_sigsuspend lwz %r3, 0(%r3) /* load the mask */ @@ -42,6 +42,6 @@ SYSENTRY_HIDDEN(sigsuspend) stw %r0, R2_OFFSET_ERRNO(2) li %r3, -1 .L_ret: - RETGUARD_CHECK(sigsuspend) + RETGUARD_CHECK(sigsuspend, %r11, %r12) blr SYSCALL_END_HIDDEN(sigsuspend) diff --git a/lib/libc/arch/powerpc/sys/tfork_thread.S b/lib/libc/arch/powerpc/sys/tfork_thread.S index b33ef21c937..a90bd4ec390 100644 --- a/lib/libc/arch/powerpc/sys/tfork_thread.S +++ b/lib/libc/arch/powerpc/sys/tfork_thread.S @@ -1,4 +1,4 @@ -/* $OpenBSD: tfork_thread.S,v 1.9 2020/10/26 22:07:06 gkoehler Exp $ */ +/* $OpenBSD: tfork_thread.S,v 1.10 2020/11/28 19:49:30 gkoehler Exp $ */ /* * Copyright (c) 2005 Tim Wiess <tim@nop.cx> @@ -19,7 +19,7 @@ #include "SYS.h" ENTRY(__tfork_thread) - RETGUARD_SETUP(__tfork_thread) + RETGUARD_SETUP(__tfork_thread, %r11, %r12) /* call __tfork */ li %r0, SYS___tfork sc @@ -45,6 +45,6 @@ ENTRY(__tfork_thread) stw 0, R2_OFFSET_ERRNO(%r2) li %r3, -1 9: - RETGUARD_CHECK(__tfork_thread) + RETGUARD_CHECK(__tfork_thread, %r11, %r12) blr END(__tfork_thread) diff --git a/libexec/ld.so/powerpc/SYS.h b/libexec/ld.so/powerpc/SYS.h index 4a585e2597f..7e1a7962e63 100644 --- a/libexec/ld.so/powerpc/SYS.h +++ b/libexec/ld.so/powerpc/SYS.h @@ -1,4 +1,4 @@ -/* $OpenBSD: SYS.h,v 1.3 2020/10/26 22:07:06 gkoehler Exp $ */ +/* $OpenBSD: SYS.h,v 1.4 2020/11/28 19:49:30 gkoehler Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -31,12 +31,12 @@ #define DL_SYSCALL(n) \ ENTRY(_dl_##n) \ - RETGUARD_SETUP(_dl_##n) ;\ + RETGUARD_SETUP(_dl_##n, %r11, %r12) ;\ li 0, SYS_##n ;\ sc ;\ cmpwi 0, 0 ;\ beq+ .L_end##n ;\ neg 3, 3 ;\ .L_end##n: ;\ - RETGUARD_CHECK(_dl_##n) ;\ + RETGUARD_CHECK(_dl_##n, %r11, %r12) ;\ blr diff --git a/sys/arch/macppc/macppc/locore.S b/sys/arch/macppc/macppc/locore.S index d6ffdd21be9..63911eba2fa 100644 --- a/sys/arch/macppc/macppc/locore.S +++ b/sys/arch/macppc/macppc/locore.S @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.S,v 1.57 2019/09/03 14:34:53 kettenis Exp $ */ +/* $OpenBSD: locore.S,v 1.58 2020/11/28 19:49:30 gkoehler Exp $ */ /* $NetBSD: locore.S,v 1.2 1996/10/16 19:33:09 ws Exp $ */ /* @@ -66,9 +66,9 @@ _ENTRY(_C_LABEL(cpu_spinup_trampoline)) _ENTRY(_C_LABEL(cpu_switchto_asm)) mflr %r0 /* save lr */ stw %r0,4(%r1) - stwu %r1,-16(%r1) - stw %r31,12(%r1) - stw %r30,8(%r1) + stwu %r1,(-SFRAMELEN - 16)(%r1) + stw %r31,(SFRAMELEN + 12)(%r1) + stw %r30,(SFRAMELEN + 8)(%r1) /* * r3 - old proc @@ -86,7 +86,6 @@ _ENTRY(_C_LABEL(cpu_switchto_asm)) mfsr %r10,PPC_USER_SR /* save PPC_USER_SR for copyin/copyout*/ mfcr %r11 /* save cr */ mr %r12,%r2 /* save r2 */ - stwu %r1,-SFRAMELEN(%r1) /* still running on old stack */ stmw %r10,8(%r1) lwz %r31,P_ADDR(%r3) stw %r1,PCB_SP(%r31) /* save SP */ @@ -117,26 +116,28 @@ switch_exited: li %r5,0 lwz %r1,PCB_SP(%r31) /* get new procs SP */ + lwz %r0,(SFRAMELEN + 16 + 4)(%r1) + RETGUARD_SETUP_LATE(cpu_switchto_asm, %r9, %r0) ori %r30,%r30,PSL_EE /* interrupts are okay again */ mtmsr %r30 lmw %r10,8(%r1) /* get other regs */ - lwz %r1,0(%r1) /* get saved SP */ mr %r2,%r12 /* get saved r2 */ mtcr %r11 /* get saved cr */ isync mtsr PPC_USER_SR,%r10 /* get saved PPC_USER_SR */ isync - lwz %r31,12(%r1) - lwz %r30,8(%r1) - addi %r1,%r1,16 - lwz %r0,4(%r1) + lwz %r31,(SFRAMELEN + 12)(%r1) + lwz %r30,(SFRAMELEN + 8)(%r1) + addi %r1,%r1,SFRAMELEN + 16 mtlr %r0 + RETGUARD_CHECK(cpu_switchto_asm, %r9, %r0) blr _ENTRY(_C_LABEL(cpu_idle_enter)) + RETGUARD_SETUP(cpu_idle_enter, %r11, %r12) lis %r4, _C_LABEL(ppc_cpuidle)@ha lwz %r4, _C_LABEL(ppc_cpuidle)@l(%r4) cmpwi %r4, 0 @@ -147,9 +148,11 @@ _ENTRY(_C_LABEL(cpu_idle_enter)) mtmsr %r3 isync 1: + RETGUARD_CHECK(cpu_idle_enter, %r11, %r12) blr _ENTRY(_C_LABEL(cpu_idle_cycle)) + RETGUARD_SETUP(cpu_idle_cycle, %r11, %r12) lis %r4, _C_LABEL(ppc_cpuidle)@ha lwz %r4, _C_LABEL(ppc_cpuidle)@l(%r4) cmpwi %r4, 0 @@ -187,9 +190,11 @@ _ENTRY(_C_LABEL(cpu_idle_cycle)) andi. %r6,%r6,~CI_FLAGS_SLEEPING@l stw %r6,CI_FLAGS(%r4) idledone: + RETGUARD_CHECK(cpu_idle_cycle, %r11, %r12) blr _ENTRY(_C_LABEL(cpu_idle_leave)) + RETGUARD_SETUP(cpu_idle_leave, %r11, %r12) lis %r4, _C_LABEL(ppc_cpuidle)@ha lwz %r4, _C_LABEL(ppc_cpuidle)@l(%r4) cmpwi %r4, 0 @@ -199,6 +204,7 @@ _ENTRY(_C_LABEL(cpu_idle_leave)) ori %r3,%r3,PSL_EE@l mtmsr %r3 1: + RETGUARD_CHECK(cpu_idle_leave, %r11, %r12) blr /* @@ -1110,6 +1116,7 @@ decrintr: .type _C_LABEL(setfault),@function _C_LABEL(setfault): mflr %r0 + RETGUARD_SETUP_LATE(setfault, %r11, %r0) mfcr %r12 GET_CPUINFO(%r4) lwz %r4,CI_CURPCB(%r4) @@ -1118,6 +1125,7 @@ _C_LABEL(setfault): stw %r1,4(%r3) stmw %r12,8(%r3) li %r3,0 + RETGUARD_CHECK(setfault, %r11, %r0) blr /* diff --git a/sys/arch/macppc/macppc/ofwreal.S b/sys/arch/macppc/macppc/ofwreal.S index 61d703b23c3..fbf1e6cdcd7 100644 --- a/sys/arch/macppc/macppc/ofwreal.S +++ b/sys/arch/macppc/macppc/ofwreal.S @@ -1,4 +1,4 @@ -/* $OpenBSD: ofwreal.S,v 1.6 2020/04/02 19:27:51 gkoehler Exp $ */ +/* $OpenBSD: ofwreal.S,v 1.7 2020/11/28 19:49:30 gkoehler Exp $ */ /* $NetBSD: ofwreal.S,v 1.1 1996/09/30 16:34:51 ws Exp $ */ /* @@ -124,7 +124,7 @@ _ENTRY(_C_LABEL(ofw_init)) */ .type savemmu,@function savemmu: - + RETGUARD_SETUP(savemmu, %r11, %r12) mr %r6,%r4 /* r4 holds pointer to BAT save area */ li %r4,0 /* save SRs */ @@ -188,6 +188,7 @@ savemmu: sync isync + RETGUARD_CHECK(savemmu, %r11, %r12) blr /* @@ -196,7 +197,7 @@ savemmu: */ .type restoremmu,@function restoremmu: - + RETGUARD_SETUP(restoremmu, %r11, %r12) li %r0,0 mtmsr %r0 mr %r6,%r4 /* pointer to sr to restore */ @@ -301,14 +302,17 @@ restoremmu: mtmsr %r4 isync + RETGUARD_CHECK(restoremmu, %r11, %r12) blr _ENTRY(_C_LABEL(fwentry)) - stwu %r1,-16(%r1) mflr %r4 + RETGUARD_SETUP_LATE(fwentry, %r11, %r4) + stwu %r1,-16(%r1) stw %r4,20(%r1) stw %r3,12(%r1) /* save arg */ + RETGUARD_SAVE(%r11, 8(%r1)) lis %r3,clsave@ha /* save mmu values of client */ addi %r3,%r3,clsave@l @@ -350,9 +354,11 @@ _ENTRY(_C_LABEL(fwentry)) lwz %r4,20(%r1) lwz %r3,12(%r1) /* restore return value */ + RETGUARD_LOAD(%r11, 8(%r1)) mtlr %r4 addi %r1,%r1,16 + RETGUARD_CHECK(fwentry, %r11, %r4) blr .lcomm firmstk,NBPG,16 @@ -366,12 +372,14 @@ _ENTRY(_C_LABEL(fwentry)) */ _ENTRY(_C_LABEL(openfirmware)) mflr %r0 + RETGUARD_SETUP_LATE(openfirmware, %r11, %r0) stw %r0,4(%r1) /* save return address */ /* switch to OpenFirmware real mode stack */ lis %r7,firmstk+NBPG-16@ha addi %r7,%r7,firmstk+NBPG-16@l stw %r1,0(%r7) + RETGUARD_SAVE(%r11, 8(%r7)) mr %r1,%r7 lis %r4,fwcall@ha @@ -380,7 +388,9 @@ _ENTRY(_C_LABEL(openfirmware)) mtctr %r4 bctrl + RETGUARD_LOAD(%r11, 8(%r1)) lwz %r1,0(%r1) /* get callers original stack pointer */ lwz %r0,4(%r1) mtlr %r0 + RETGUARD_CHECK(openfirmware, %r11, %r0) blr diff --git a/sys/arch/powerpc/include/asm.h b/sys/arch/powerpc/include/asm.h index 60fbac38f17..2e0a7707730 100644 --- a/sys/arch/powerpc/include/asm.h +++ b/sys/arch/powerpc/include/asm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: asm.h,v 1.15 2020/10/26 22:07:06 gkoehler Exp $ */ +/* $OpenBSD: asm.h,v 1.16 2020/11/28 19:49:30 gkoehler Exp $ */ /* $NetBSD: asm.h,v 1.1 1996/09/30 16:34:20 ws Exp $ */ /* @@ -109,16 +109,22 @@ _TMP_LABEL(y):; \ lis reg, (__retguard_ ## x)@ha; \ lwz reg, ((__retguard_ ## x)@l)(reg) # endif -# define RETGUARD_SETUP(x) \ +# define RETGUARD_SETUP(x, reg, retreg) \ + mflr retreg; \ + RETGUARD_SETUP_LATE(x, reg, retreg) +# define RETGUARD_SETUP_LATE(x, reg, retreg) \ RETGUARD_SYMBOL(x); \ - mflr %r12; \ - RETGUARD_LOAD_RANDOM(x, %r11); \ - xor %r11, %r11, %r12 -# define RETGUARD_CHECK(x) \ - xor %r11, %r11, %r12; \ + RETGUARD_LOAD_RANDOM(x, reg); \ + xor reg, reg, retreg +# define RETGUARD_CHECK(x, reg, retreg) \ + xor reg, reg, retreg; \ RETGUARD_LOAD_RANDOM(x, %r10); \ - mtlr %r12; \ - twne %r11, %r10 + mtlr retreg; \ + twne reg, %r10 +# define RETGUARD_SAVE(reg, loc) \ + stw reg, loc +# define RETGUARD_LOAD(reg, loc) \ + lwz reg, loc # define RETGUARD_SYMBOL(x) \ .ifndef __retguard_ ## x; \ .hidden __retguard_ ## x; \ @@ -133,8 +139,11 @@ _TMP_LABEL(y):; \ .endif #else # define RETGUARD_LOAD_RANDOM(x, reg) -# define RETGUARD_SETUP(x) -# define RETGUARD_CHECK(x) +# define RETGUARD_SETUP(x, reg, retreg) +# define RETGUARD_SETUP_LATE(x, reg, retreg) +# define RETGUARD_CHECK(x, reg, retreg) +# define RETGUARD_SAVE(reg, loc) +# define RETGUARD_LOAD(reg, loc) # define RETGUARD_SYMBOL(x) #endif diff --git a/sys/arch/powerpc/powerpc/setjmp.S b/sys/arch/powerpc/powerpc/setjmp.S index c8f067c1254..b3fa03d0b90 100644 --- a/sys/arch/powerpc/powerpc/setjmp.S +++ b/sys/arch/powerpc/powerpc/setjmp.S @@ -1,4 +1,4 @@ -/* $OpenBSD: setjmp.S,v 1.9 2008/05/21 19:42:07 miod Exp $ */ +/* $OpenBSD: setjmp.S,v 1.10 2020/11/28 19:49:30 gkoehler Exp $ */ /* kernel version of this file, does not have signal goop */ /* int setjmp(jmp_buf env) */ @@ -56,6 +56,8 @@ ENTRY(_C_LABEL(setjmp)) + mflr %r12 + RETGUARD_SETUP_LATE(setjmp, %r11, %r12) stw %r31, JMP_r31(%r3) /* r1, r14-r30 */ stw %r1, JMP_r1 (%r3) @@ -79,18 +81,22 @@ ENTRY(_C_LABEL(setjmp)) /* cr, lr, ctr, xer */ mfcr %r0 stw %r0, JMP_cr(%r3) - mflr %r0 - stw %r0, JMP_lr(%r3) + stw %r12, JMP_lr(%r3) mfctr %r0 stw %r0, JMP_ctr(%r3) mfxer %r0 stw %r0, JMP_xer(%r3) /* f14-f31, fpscr */ li %r3, 0 + RETGUARD_CHECK(setjmp, %r11, %r12) blr ENTRY(_C_LABEL(longjmp)) + /* lr, r31 */ + lwz %r12, JMP_lr(%r3) + RETGUARD_SETUP_LATE(longjmp, %r11, %r12) + mtlr %r12 lwz %r31, JMP_r31(%r3) /* r1, r14-r30 */ lwz %r1, JMP_r1 (%r3) @@ -111,15 +117,14 @@ ENTRY(_C_LABEL(longjmp)) lwz %r28, JMP_r28(%r3) lwz %r29, JMP_r29(%r3) lwz %r30, JMP_r30(%r3) - /* cr, lr, ctr, xer */ + /* cr, ctr, xer */ lwz %r0, JMP_cr(%r3) mtcr %r0 - lwz %r0, JMP_lr(%r3) - mtlr %r0 lwz %r0, JMP_ctr(%r3) mtctr %r0 lwz %r0, JMP_xer(%r3) mtxer %r0 /* f14-f31, fpscr */ li %r3, 1 + RETGUARD_CHECK(longjmp, %r11, %r12) blr diff --git a/sys/lib/libkern/arch/powerpc/ffs.S b/sys/lib/libkern/arch/powerpc/ffs.S index 5e0e64c53aa..7fba3b0c3c1 100644 --- a/sys/lib/libkern/arch/powerpc/ffs.S +++ b/sys/lib/libkern/arch/powerpc/ffs.S @@ -1,4 +1,4 @@ -/* $OpenBSD: ffs.S,v 1.2 2020/10/27 01:26:53 gkoehler Exp $ */ +/* $OpenBSD: ffs.S,v 1.3 2020/11/28 19:49:30 gkoehler Exp $ */ /* * Written by Christian Weisgerber <naddy@openbsd.org>. * Public domain. @@ -7,11 +7,11 @@ #include <machine/asm.h> ENTRY(ffs) - RETGUARD_SETUP(ffs) + RETGUARD_SETUP(ffs, %r11, %r12) neg %r4, %r3 and %r3, %r3, %r4 cntlzw %r3, %r3 subfic %r3, %r3, 32 - RETGUARD_CHECK(ffs) + RETGUARD_CHECK(ffs, %r11, %r12) blr END(ffs) diff --git a/sys/lib/libkern/arch/powerpc/memmove.S b/sys/lib/libkern/arch/powerpc/memmove.S index 4633cd0beac..dc0782ebb40 100644 --- a/sys/lib/libkern/arch/powerpc/memmove.S +++ b/sys/lib/libkern/arch/powerpc/memmove.S @@ -1,4 +1,4 @@ -/* $OpenBSD: memmove.S,v 1.5 2020/10/27 01:26:53 gkoehler Exp $ */ +/* $OpenBSD: memmove.S,v 1.6 2020/11/28 19:49:30 gkoehler Exp $ */ /* $NetBSD: memmove.S,v 1.3 2011/01/15 07:31:12 matt Exp $ */ /* stropt/memmove.S, pl_string_common, pl_linux 10/11/04 11:45:37 @@ -45,7 +45,7 @@ /* void *memcpy(void *to, const void *from, size_t len) */ ENTRY(memcpy) - RETGUARD_SETUP(memmove) + RETGUARD_SETUP(memmove, %r11, %r12) mr %r8, %r3 /* Save dst (return value) */ b fwd @@ -57,7 +57,7 @@ ENTRY(bcopy) /* void *memmove(void *, const void *, size_t) */ ENTRY(memmove) - RETGUARD_SETUP(memmove) + RETGUARD_SETUP(memmove, %r11, %r12) mr %r8, %r3 /* Save dst (return value) */ cmpw %r4, %r8 /* Branch to reverse if */ @@ -167,5 +167,5 @@ rlast2: bdnz+ rlast2 /* Dec ctr, and branch if more */ /* bytes left */ done: - RETGUARD_CHECK(memmove) + RETGUARD_CHECK(memmove, %r11, %r12) blr |