summaryrefslogtreecommitdiff
path: root/src/setjmp/powerpc64/setjmp.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/setjmp/powerpc64/setjmp.s')
-rw-r--r--src/setjmp/powerpc64/setjmp.s21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/setjmp/powerpc64/setjmp.s b/src/setjmp/powerpc64/setjmp.s
index d16d4bae..37683fda 100644
--- a/src/setjmp/powerpc64/setjmp.s
+++ b/src/setjmp/powerpc64/setjmp.s
@@ -1,24 +1,35 @@
- .global ___setjmp
- .hidden ___setjmp
.global __setjmp
.global _setjmp
.global setjmp
.type __setjmp,@function
.type _setjmp,@function
.type setjmp,@function
-___setjmp:
__setjmp:
_setjmp:
setjmp:
+ ld 5, 24(1) # load from the TOC slot in the caller's stack frame
+ b __setjmp_toc
+
+ .localentry __setjmp,.-__setjmp
+ .localentry _setjmp,.-_setjmp
+ .localentry setjmp,.-setjmp
+ mr 5, 2
+
+ .global __setjmp_toc
+ .hidden __setjmp_toc
+ # same as normal setjmp, except TOC pointer to save is provided in r5.
+ # r4 would normally be the 2nd parameter, but we're using r5 to simplify calling from sigsetjmp.
+ # solves the problem of knowing whether to save the TOC pointer from r2 or the caller's stack frame.
+__setjmp_toc:
# 0) store IP into 0, then into the jmpbuf pointed to by r3 (first arg)
mflr 0
std 0, 0*8(3)
# 1) store cr
mfcr 0
std 0, 1*8(3)
- # 2) store r1-r2 (SP and TOC)
+ # 2) store SP and TOC
std 1, 2*8(3)
- std 2, 3*8(3)
+ std 5, 3*8(3)
# 3) store r14-31
std 14, 4*8(3)
std 15, 5*8(3)