From 1efaa8686927cf591a54a820d310ec6e6e7899a3 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Fri, 7 Feb 2020 12:00:49 -0800 Subject: [PATCH] Add longjmp support for Thumb-2 When a Thumb-2 kernel is being used, then longjmp must be implemented using the Thumb-2 instruction set in module/lua/setjmp/setjmp_arm.S. Original-patch-by: @jsrlabs Signed-off-by: Brian Behlendorf Issue #9957 --- module/lua/setjmp/setjmp_arm.S | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/module/lua/setjmp/setjmp_arm.S b/module/lua/setjmp/setjmp_arm.S index 8c08f4e6f2ec..78bc3e0b347d 100644 --- a/module/lua/setjmp/setjmp_arm.S +++ b/module/lua/setjmp/setjmp_arm.S @@ -31,12 +31,19 @@ #if defined(__arm__) && !defined(__aarch64__) +#if defined(__thumb2__) +#define _FUNC_MODE .code 16; .thumb_func +#else +#define _FUNC_MODE .code 32 +#endif + #define ENTRY(x) \ .text; \ + .syntax unified; \ .align 2; \ .global x; \ .type x,#function; \ - .code 32; \ + _FUNC_MODE; \ x: #define END(x) \ @@ -49,13 +56,23 @@ x: * setjump + longjmp */ ENTRY(setjmp) +#if defined(__thumb2__) + mov ip, sp + stmia r0, {r4-r12,r14} +#else stmia r0, {r4-r14} +#endif mov r0, #0x00000000 RET END(setjmp) ENTRY(longjmp) +#if defined(__thumb2__) + ldmia r0, {r4-r12,r14} + mov sp, ip +#else ldmia r0, {r4-r14} +#endif mov r0, #0x00000001 RET END(longjmp)