From 1de66d170e71fb94732ffc80dcf4e70e623c4f7a Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Thu, 19 Mar 2020 17:13:16 +0530 Subject: lib: Optimize unpriv load/store implementation This patch optimize unpriv load/store implementation by having dedicated unpriv trap handler (just like KVM RISC-V). As a result of this optimization: 1. We have reduced roughly 13+ instruction in all unpriv load/store functions. The reduced instruction also include two function calls. 2. Per-HART trap info pointer in scratch space is now redundant hence removed. 3. The sbi_trap_handler() is now much cleaner because we don't have to handle unpriv load/store traps. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi/sbi_hart.h | 8 +++++--- include/sbi/sbi_trap.h | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h index fb4a955a..4b83b84b 100644 --- a/include/sbi/sbi_hart.h +++ b/include/sbi/sbi_hart.h @@ -16,9 +16,11 @@ struct sbi_scratch; int sbi_hart_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot); -void *sbi_hart_get_trap_info(struct sbi_scratch *scratch); - -void sbi_hart_set_trap_info(struct sbi_scratch *scratch, void *data); +extern void (*sbi_hart_unpriv_trap)(void); +static inline ulong sbi_hart_unpriv_trap_addr(void) +{ + return (ulong)sbi_hart_unpriv_trap; +} void sbi_hart_delegation_dump(struct sbi_scratch *scratch); void sbi_hart_pmp_dump(struct sbi_scratch *scratch); diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h index 9a35a6e5..b6918e0d 100644 --- a/include/sbi/sbi_trap.h +++ b/include/sbi/sbi_trap.h @@ -85,6 +85,19 @@ /** Last member index in sbi_trap_regs */ #define SBI_TRAP_REGS_last 35 +/** Index of epc member in sbi_trap_info */ +#define SBI_TRAP_INFO_epc 0 +/** Index of cause member in sbi_trap_info */ +#define SBI_TRAP_INFO_cause 1 +/** Index of tval member in sbi_trap_info */ +#define SBI_TRAP_INFO_tval 2 +/** Index of tval2 member in sbi_trap_info */ +#define SBI_TRAP_INFO_tval2 3 +/** Index of tinst member in sbi_trap_info */ +#define SBI_TRAP_INFO_tinst 4 +/** Last member index in sbi_trap_info */ +#define SBI_TRAP_INFO_last 5 + /* clang-format on */ /** Get offset of member with name 'x' in sbi_trap_regs */ @@ -92,6 +105,11 @@ /** Size (in bytes) of sbi_trap_regs */ #define SBI_TRAP_REGS_SIZE SBI_TRAP_REGS_OFFSET(last) +/** Get offset of member with name 'x' in sbi_trap_info */ +#define SBI_TRAP_INFO_OFFSET(x) ((SBI_TRAP_INFO_##x) * __SIZEOF_POINTER__) +/** Size (in bytes) of sbi_trap_info */ +#define SBI_TRAP_INFO_SIZE SBI_TRAP_INFO_OFFSET(last) + #ifndef __ASSEMBLY__ #include -- cgit v1.3.1