summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2018-12-27 19:09:13 +0300
committerAnup Patel <anup@brainfault.org>2018-12-31 06:58:26 +0300
commit5959312a5c26df64ebfdd9b4d926e88cf3d87840 (patch)
treef6e7f81f1a8611537c52385a439cbf291ee745be /include
parent56e41f7a8db2c9bcfd1116748d496e5d40d2397b (diff)
downloadopensbi-5959312a5c26df64ebfdd9b4d926e88cf3d87840.tar.xz
lib: Redirect illegal instruction trap to S-mode when not handled
Currently, we fail with error SBI_ENOTSUPP when we are not able to handle illegal instruction trap. Instead, we should just redirect illegal instruction trap to S-mode when not handled. This redirection of illegal instruction trap will help lazy save/restore of floating point registers to work correctly in Linux kernel. Signed-off-by: Anup Patel <anup.patel@wdc.com>
Diffstat (limited to 'include')
-rw-r--r--include/sbi/riscv_encoding.h9
-rw-r--r--include/sbi/sbi_trap.h4
2 files changed, 10 insertions, 3 deletions
diff --git a/include/sbi/riscv_encoding.h b/include/sbi/riscv_encoding.h
index 1adc0c5..381f305 100644
--- a/include/sbi/riscv_encoding.h
+++ b/include/sbi/riscv_encoding.h
@@ -19,12 +19,15 @@
#define MSTATUS_HIE 0x00000004
#define MSTATUS_MIE 0x00000008
#define MSTATUS_UPIE 0x00000010
-#define MSTATUS_SPIE 0x00000020
+#define MSTATUS_SPIE_SHIFT 5
+#define MSTATUS_SPIE (1UL << MSTATUS_SPIE_SHIFT)
#define MSTATUS_HPIE 0x00000040
#define MSTATUS_MPIE 0x00000080
-#define MSTATUS_SPP 0x00000100
+#define MSTATUS_SPP_SHIFT 8
+#define MSTATUS_SPP (1UL << MSTATUS_SPP_SHIFT)
#define MSTATUS_HPP 0x00000600
-#define MSTATUS_MPP 0x00001800
+#define MSTATUS_MPP_SHIFT 11
+#define MSTATUS_MPP (3UL << MSTATUS_MPP_SHIFT)
#define MSTATUS_FS 0x00006000
#define MSTATUS_XS 0x00018000
#define MSTATUS_MPRV 0x00020000
diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h
index a6b22e4..4e5a054 100644
--- a/include/sbi/sbi_trap.h
+++ b/include/sbi/sbi_trap.h
@@ -51,6 +51,10 @@ struct sbi_trap_regs {
struct sbi_scratch;
+int sbi_trap_redirect(struct sbi_trap_regs *regs,
+ struct sbi_scratch *scratch,
+ ulong epc, ulong cause, ulong tval);
+
void sbi_trap_handler(struct sbi_trap_regs *regs,
struct sbi_scratch *scratch);