mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
riscv: add initjmp()
Implement initjmp() for RISC-V, 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>
This commit is contained in:
committed by
Tom Rini
parent
0245d2ab7d
commit
3691328ef6
@@ -153,6 +153,7 @@ config RISCV
|
||||
bool "RISC-V architecture"
|
||||
select CREATE_ARCH_SYMLINK
|
||||
select HAVE_SETJMP
|
||||
select HAVE_INITJMP
|
||||
select SUPPORT_ACPI
|
||||
select SUPPORT_LITTLE_ENDIAN
|
||||
select SUPPORT_OF_CONTROL
|
||||
|
||||
@@ -59,3 +59,14 @@ ENTRY(longjmp)
|
||||
ret
|
||||
ENDPROC(longjmp)
|
||||
.popsection
|
||||
|
||||
.pushsection .text.initjmp, "ax"
|
||||
ENTRY(initjmp)
|
||||
/* a1: entry point address, a2: stack base, a3: stack size */
|
||||
add a2, a2, a3
|
||||
STORE_IDX(a1, 12)
|
||||
STORE_IDX(a2, 13)
|
||||
li a0, 0
|
||||
ret
|
||||
ENDPROC(initjmp)
|
||||
.popsection
|
||||
|
||||
Reference in New Issue
Block a user