ARM: libroot: fix setjmp/longjmp implementation.
Just a couple of lines of code, but a head full of pain ;-) Finally got it right and now KDL can properly recover from invalid accesses.
This commit is contained in:
@@ -5,16 +5,13 @@
|
||||
|
||||
#include <asm_defs.h>
|
||||
|
||||
//#include "setjmp_internal.h"
|
||||
|
||||
/* int __siglongjmp(jmp_buf buffer, int value) */
|
||||
FUNCTION(siglongjmp):
|
||||
FUNCTION(longjmp):
|
||||
FUNCTION(_longjmp):
|
||||
str r1,[r0]
|
||||
ldmia r0,{r0-r14}
|
||||
bx lr
|
||||
// bl __longjmp_return
|
||||
str r1, [r0, #4]
|
||||
ldmia r0, {r0-r14}
|
||||
b __longjmp_return
|
||||
FUNCTION_END(siglongjmp)
|
||||
FUNCTION_END(longjmp)
|
||||
FUNCTION_END(_longjmp)
|
||||
|
||||
@@ -5,33 +5,25 @@
|
||||
|
||||
#include <asm_defs.h>
|
||||
|
||||
//#include "setjmp_internal.h"
|
||||
|
||||
/* int sigsetjmp(jmp_buf buffer, int saveMask) */
|
||||
FUNCTION(__sigsetjmp):
|
||||
FUNCTION(sigsetjmp):
|
||||
stmdb sp!, {r4, lr}
|
||||
stmia r0, {r0-r14}
|
||||
str lr,[r0, #60]
|
||||
mrs r1,cpsr
|
||||
str r1,[r0,#64]
|
||||
ldr r1,[r0,#4]
|
||||
mov r0, #0
|
||||
|
||||
bl __setjmp_save_sigs
|
||||
ldmia sp!, {r4, pc}
|
||||
FUNCTION_END(__sigsetjmp)
|
||||
stmia r0, {r0-r14}
|
||||
mrs r1, cpsr
|
||||
str r1, [r0, #64]
|
||||
ldr r1, [r0, #4]
|
||||
b __setjmp_save_sigs
|
||||
FUNCTION_END(sigsetjmp)
|
||||
FUNCTION_END(__sigsetjmp)
|
||||
|
||||
|
||||
/* int setjmp(jmp_buf buffer) */
|
||||
FUNCTION(setjmp):
|
||||
stmia r0, {r0-r14}
|
||||
str lr,[r0, #60]
|
||||
mrs r1,cpsr
|
||||
str r1,[r0,#64]
|
||||
ldr r1,[r0,#4]
|
||||
mov r0, #0
|
||||
stmia r0, {r0-r14}
|
||||
mrs r1, cpsr
|
||||
str r1, [r0, #64]
|
||||
ldr r1, [r0, #4]
|
||||
mov r0, #0
|
||||
bx lr
|
||||
FUNCTION_END(setjmp)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user