aboutsummaryrefslogtreecommitdiff
path: root/include/sbi/sbi_trap.h
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-03-19 17:13:16 +0530
committerAnup Patel <anup@brainfault.org>2020-03-28 13:31:53 +0530
commit1de66d170e71fb94732ffc80dcf4e70e623c4f7a (patch)
tree8b43a209cd287f5c9cdc0ec5761be6982f1ee664 /include/sbi/sbi_trap.h
parent160c88535f07084051ebba97689fc4a7b2e9037c (diff)
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 <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'include/sbi/sbi_trap.h')
-rw-r--r--include/sbi/sbi_trap.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h
index 9a35a6e..b6918e0 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 <sbi/sbi_types.h>