summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgkoehler <gkoehler@openbsd.org>2020-11-28 19:49:30 +0000
committergkoehler <gkoehler@openbsd.org>2020-11-28 19:49:30 +0000
commit15572fcf8c6bfa0588565cd23f393a5a1499ea57 (patch)
treea41513c79b27dd0f2180dbab6506b34caf86aa35
parentSince our IPI broadcast functions exclude the CPU doing the broadcast, we (diff)
downloadwireguard-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.h10
-rw-r--r--lib/libc/arch/powerpc/string/ffs.S6
-rw-r--r--lib/libc/arch/powerpc/string/memmove.S8
-rw-r--r--lib/libc/arch/powerpc/sys/sigpending.S6
-rw-r--r--lib/libc/arch/powerpc/sys/sigprocmask.S6
-rw-r--r--lib/libc/arch/powerpc/sys/sigsuspend.S6
-rw-r--r--lib/libc/arch/powerpc/sys/tfork_thread.S6
-rw-r--r--libexec/ld.so/powerpc/SYS.h6
-rw-r--r--sys/arch/macppc/macppc/locore.S28
-rw-r--r--sys/arch/macppc/macppc/ofwreal.S18
-rw-r--r--sys/arch/powerpc/include/asm.h31
-rw-r--r--sys/arch/powerpc/powerpc/setjmp.S17
-rw-r--r--sys/lib/libkern/arch/powerpc/ffs.S6
-rw-r--r--sys/lib/libkern/arch/powerpc/memmove.S8
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