arm: add initjmp()

Implement initjmp() for Arm. a non-standard extension to setjmp()/
longjmp() allowing to initialize a jump buffer with a function pointer
and a stack pointer. This will be useful to later introduce threads.
With this new function it becomes possible to longjmp() to a particular
function pointer (rather than to a point previously reached during
program execution as is the case with setjmp()), and with a custom stack.
Both things are needed to spin off a new thread. Then the usual
setjmp()/longjmp() pair is enough to save and restore a context, i.e.,
switch thread.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
Jerome Forissier
2025-04-18 16:09:30 +02:00
committed by Tom Rini
parent 1c8e166fb5
commit 0245d2ab7d
3 changed files with 23 additions and 0 deletions

View File

@@ -95,6 +95,7 @@ config ARC
config ARM
bool "ARM architecture"
select HAVE_SETJMP
select HAVE_INITJMP
select ARCH_SUPPORTS_LTO
select CREATE_ARCH_SYMLINK
select HAVE_PRIVATE_LIBGCC if !ARM64

View File

@@ -34,3 +34,15 @@ ENTRY(longjmp)
ret lr
ENDPROC(longjmp)
.popsection
.pushsection .text.initjmp, "ax"
ENTRY(initjmp)
stm a1, {v1-v8}
/* a2: entry point address, a3: stack base, a4: stack size */
add a3, a3, a4
str a3, [a1, #32] /* where setjmp would save sp */
str a2, [a1, #36] /* where setjmp would save lr */
mov a1, #0
ret lr
ENDPROC(initjmp)
.popsection

View File

@@ -39,3 +39,13 @@ ENTRY(longjmp)
ret
ENDPROC(longjmp)
.popsection
.pushsection .text.initjmp, "ax"
ENTRY(initjmp)
/* x1: entry point address, x2: stack base, x3: stack size */
add x2, x2, x3
stp x1, x2, [x0,#88]
mov x0, #0
ret
ENDPROC(initjmp)
.popsection