aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorsten Glaser <tg@mirbsd.org>2012-09-29 19:20:37 +0000
committermaximilian attems <max@stro.at>2012-10-01 14:54:10 +0200
commit9bdffde924573bf1c2f795a4b57a302d9485d248 (patch)
treec17518f1c08fd33142f51d8a48c9cb72629416ca
parent5c04671880a88a706fdbf6218c74737a40ff1f87 (diff)
downloadklibc-9bdffde924573bf1c2f795a4b57a302d9485d248.tar.gz
[klibc] arm: fix trashing of callee-saved registers in thumb setjmp()
fixes http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=634890 (although dynamically-linked binaries seem to have another bug) Signed-off-by: Thorsten Glaser <tg@mirbsd.org> Signed-off-by: maximilian attems <max@stro.at>
-rw-r--r--usr/klibc/arch/arm/setjmp.S3
1 files changed, 3 insertions, 0 deletions
diff --git a/usr/klibc/arch/arm/setjmp.S b/usr/klibc/arch/arm/setjmp.S
index d351e0e2da8f8..92ffc434725b5 100644
--- a/usr/klibc/arch/arm/setjmp.S
+++ b/usr/klibc/arch/arm/setjmp.S
@@ -70,6 +70,7 @@ longjmp:
.type setjmp, #function
.thumb_func
setjmp:
+ mov r2, r0
mov r3, lr
stmia r0!, {r3, r4, r5, r6, r7}
mov r3, r8
@@ -78,6 +79,8 @@ setjmp:
mov r6, fp
mov r7, sp
stmia r0!, {r3, r4, r5, r6, r7}
+ /* Do not trash r4 .. r7 */
+ ldmia r2!, {r3, r4, r5, r6, r7}
mov r0, #0
BX(lr)
.size setjmp,.-setjmp