From: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- arch/riscv/Kconfig | 1 + arch/riscv/include/asm/setjmp.h | 27 +++++++++++++++++++++++++ arch/riscv/lib/Makefile | 2 +- arch/riscv/lib/longjmp.S | 28 ++++++++++++++++++++++++++ arch/riscv/lib/setjmp.S | 35 +++++++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 arch/riscv/include/asm/setjmp.h create mode 100644 arch/riscv/lib/longjmp.S create mode 100644 arch/riscv/lib/setjmp.S diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 16c3eecce6f8..107c24a66d3d 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -8,6 +8,7 @@ config RISCV select COMMON_CLK select COMMON_CLK_OF_PROVIDER select CLKDEV_LOOKUP + select HAS_ARCH_SJLJ config ARCH_TEXT_BASE hex diff --git a/arch/riscv/include/asm/setjmp.h b/arch/riscv/include/asm/setjmp.h new file mode 100644 index 000000000000..7516f6825841 --- /dev/null +++ b/arch/riscv/include/asm/setjmp.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH + * (C) Copyright 2016 Alexander Graf <agraf@xxxxxxx> + */ + +#ifndef _SETJMP_H_ +#define _SETJMP_H_ 1 + +#include <asm/types.h> + +typedef struct __jmp_buf_internal_tag + { + /* Program counter. */ + long int __pc; + /* Callee-saved registers. */ + long int __regs[12]; + /* Stack pointer. */ + long int __sp; +} jmp_buf[1]; + +int setjmp(jmp_buf jmp) __attribute__((returns_twice)); +void longjmp(jmp_buf jmp, int ret) __attribute__((noreturn)); + +int initjmp(jmp_buf jmp, void __noreturn (*func)(void), void *stack_top); + +#endif /* _SETJMP_H_ */ diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index a1df0b7dc78c..ff5751a812c2 100644 --- a/arch/riscv/lib/Makefile +++ b/arch/riscv/lib/Makefile @@ -1,3 +1,3 @@ extra-y += barebox.lds -obj-y += riscv_timer.o +obj-y += riscv_timer.o setjmp.o longjmp.o diff --git a/arch/riscv/lib/longjmp.S b/arch/riscv/lib/longjmp.S new file mode 100644 index 000000000000..7bcb5b30495d --- /dev/null +++ b/arch/riscv/lib/longjmp.S @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/* longjmp, RISC-V version. */ + +#include <linux/linkage.h> +#include <asm/asm.h> + +ENTRY (longjmp) + REG_L ra, 0*SZREG(a0) + REG_L s0, 1*SZREG(a0) + REG_L s1, 2*SZREG(a0) + REG_L s2, 3*SZREG(a0) + REG_L s3, 4*SZREG(a0) + REG_L s4, 5*SZREG(a0) + REG_L s5, 6*SZREG(a0) + REG_L s6, 7*SZREG(a0) + REG_L s7, 8*SZREG(a0) + REG_L s8, 9*SZREG(a0) + REG_L s9, 10*SZREG(a0) + REG_L s10,11*SZREG(a0) + REG_L s11,12*SZREG(a0) + REG_L sp, 13*SZREG(a0) + + seqz a0, a1 + add a0, a0, a1 # a0 = (a1 == 0) ? 1 : a1 + ret + +END (longjmp) diff --git a/arch/riscv/lib/setjmp.S b/arch/riscv/lib/setjmp.S new file mode 100644 index 000000000000..e8ad01635dd3 --- /dev/null +++ b/arch/riscv/lib/setjmp.S @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/* setjmp for RISC-V. */ + +#include <linux/linkage.h> +#include <asm/asm.h> + +ENTRY (setjmp) + REG_S ra, 0*SZREG(a0) + REG_S s0, 1*SZREG(a0) + REG_S s1, 2*SZREG(a0) + REG_S s2, 3*SZREG(a0) + REG_S s3, 4*SZREG(a0) + REG_S s4, 5*SZREG(a0) + REG_S s5, 6*SZREG(a0) + REG_S s6, 7*SZREG(a0) + REG_S s7, 8*SZREG(a0) + REG_S s8, 9*SZREG(a0) + REG_S s9, 10*SZREG(a0) + REG_S s10,11*SZREG(a0) + REG_S s11,12*SZREG(a0) + REG_S sp, 13*SZREG(a0) + + li a0, 0 + ret + +END (setjmp) + +ENTRY (initjmp) + REG_S a1, 0*SZREG(a0) + REG_S a2, 13*SZREG(a0) + li a0, 0 + ret + +END (initjmp) -- 2.29.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox