diff options
author | Anup Patel <anup.patel@wdc.com> | 2018-12-27 19:09:13 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2018-12-31 06:58:26 +0300 |
commit | 5959312a5c26df64ebfdd9b4d926e88cf3d87840 (patch) | |
tree | f6e7f81f1a8611537c52385a439cbf291ee745be /include | |
parent | 56e41f7a8db2c9bcfd1116748d496e5d40d2397b (diff) | |
download | opensbi-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.h | 9 | ||||
-rw-r--r-- | include/sbi/sbi_trap.h | 4 |
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); |