From b7df5e4392d34d8b8d5290d5b857676e672d4c96 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Tue, 29 Dec 2020 11:39:22 +0530 Subject: lib: sbi: Introduce sbi_trap_exit() API We introduce sbi_trap_exit() API which can help non-firmware (i.e. generic or platform) code to force exit trap/interrupt handling and resume execution at context pointed by parameter "const struct sbi_trap_regs *regs". This new sbi_trap_exit() API will help Keystone Enclave project to resume execution of enclave from custom SBI call handler. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi/sbi_scratch.h | 10 +++++++--- include/sbi/sbi_trap.h | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'include/sbi') diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h index 9f3453d..e7079f5 100644 --- a/include/sbi/sbi_scratch.h +++ b/include/sbi/sbi_scratch.h @@ -30,12 +30,14 @@ #define SBI_SCRATCH_PLATFORM_ADDR_OFFSET (6 * __SIZEOF_POINTER__) /** Offset of hartid_to_scratch member in sbi_scratch */ #define SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET (7 * __SIZEOF_POINTER__) +/** Offset of trap_exit member in sbi_scratch */ +#define SBI_SCRATCH_TRAP_EXIT_OFFSET (8 * __SIZEOF_POINTER__) /** Offset of tmp0 member in sbi_scratch */ -#define SBI_SCRATCH_TMP0_OFFSET (8 * __SIZEOF_POINTER__) +#define SBI_SCRATCH_TMP0_OFFSET (9 * __SIZEOF_POINTER__) /** Offset of options member in sbi_scratch */ -#define SBI_SCRATCH_OPTIONS_OFFSET (9 * __SIZEOF_POINTER__) +#define SBI_SCRATCH_OPTIONS_OFFSET (10 * __SIZEOF_POINTER__) /** Offset of extra space in sbi_scratch */ -#define SBI_SCRATCH_EXTRA_SPACE_OFFSET (10 * __SIZEOF_POINTER__) +#define SBI_SCRATCH_EXTRA_SPACE_OFFSET (11 * __SIZEOF_POINTER__) /** Maximum size of sbi_scratch (4KB) */ #define SBI_SCRATCH_SIZE (0x1000) @@ -63,6 +65,8 @@ struct sbi_scratch { unsigned long platform_addr; /** Address of HART ID to sbi_scratch conversion function */ unsigned long hartid_to_scratch; + /** Address of trap exit function */ + unsigned long trap_exit; /** Temporary storage */ unsigned long tmp0; /** Options for OpenSBI library */ diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h index 5d0962f..04001df 100644 --- a/include/sbi/sbi_trap.h +++ b/include/sbi/sbi_trap.h @@ -207,6 +207,8 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs, void sbi_trap_handler(struct sbi_trap_regs *regs); +void __noreturn sbi_trap_exit(const struct sbi_trap_regs *regs); + #endif #endif -- cgit v1.2.3