diff options
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/include/asm/setjmp.h | 6 | ||||
-rw-r--r-- | arch/arm/lib32/setjmp.S | 8 | ||||
-rw-r--r-- | arch/arm/lib64/setjmp.S | 9 |
4 files changed, 22 insertions, 2 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 8eba19dfae..d2e3661892 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -5,6 +5,7 @@ config ARM select HAVE_CONFIGURABLE_TEXT_BASE if !RELOCATABLE select HAVE_IMAGE_COMPRESSION select HAVE_ARCH_KASAN + select HAS_ARCH_SJLJ select ARM_OPTIMZED_STRING_FUNCTIONS if KASAN default y diff --git a/arch/arm/include/asm/setjmp.h b/arch/arm/include/asm/setjmp.h index 62bac613d6..0cee5bfdda 100644 --- a/arch/arm/include/asm/setjmp.h +++ b/arch/arm/include/asm/setjmp.h @@ -23,7 +23,9 @@ struct jmp_buf_data { typedef struct jmp_buf_data jmp_buf[1]; -int setjmp(jmp_buf jmp); -void longjmp(jmp_buf jmp, int ret); +int setjmp(jmp_buf jmp) __attribute__((returns_twice)); +void longjmp(jmp_buf jmp, int ret) __attribute__((noreturn)); + +int initjmp(jmp_buf jmp, void __attribute__((noreturn)) (*func)(void), void *stack_top); #endif /* _SETJMP_H_ */ diff --git a/arch/arm/lib32/setjmp.S b/arch/arm/lib32/setjmp.S index f0606a7f66..626d915da1 100644 --- a/arch/arm/lib32/setjmp.S +++ b/arch/arm/lib32/setjmp.S @@ -33,4 +33,12 @@ ENTRY(longjmp) 1: bx lr ENDPROC(longjmp) + +.pushsection .text.initjmp, "ax" +ENTRY(initjmp) + str a3, [a1, #32] /* stack pointer */ + str a2, [a1, #36] /* return address */ + mov a1, #0 + bx lr +ENDPROC(initjmp) .popsection diff --git a/arch/arm/lib64/setjmp.S b/arch/arm/lib64/setjmp.S index 0910e2f5a6..80be8cb0f2 100644 --- a/arch/arm/lib64/setjmp.S +++ b/arch/arm/lib64/setjmp.S @@ -36,3 +36,12 @@ ENTRY(longjmp) ret ENDPROC(longjmp) .popsection + +.pushsection .text.initjmp, "ax" +ENTRY(initjmp) + str x2, [x0, #96] /* stack pointer */ + str x1, [x0, #88] /* return address */ + mov x0, #0 + ret +ENDPROC(initjmp) +.popsection |