diff options
author | Vivian Wang <dramforever@live.com> | 2022-09-02 18:48:34 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2022-09-13 14:12:59 +0300 |
commit | 37a0d83b6d5a06fd740fcdfb5e4074c33e472a2d (patch) | |
tree | 910ce508d5ec8d28117c93980425df93da20e25f /include | |
parent | 19664f67579181d370621338f96307775add2bf9 (diff) | |
download | opensbi-37a0d83b6d5a06fd740fcdfb5e4074c33e472a2d.tar.xz |
lib: sbi_trap: Add helper to get GVA in sbi_trap_regs
The GVA bit is in mstatus on RV64, and in mstatush in RV32. Refactor
code handling this in sbi_trap_handler into a helper function to extract
GVA from sbi_trap_regs, so that future code accessing GVA can be
XLEN-agnostic.
Signed-off-by: Vivian Wang <dramforever@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/sbi/sbi_trap.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h index fe3640a..a562b95 100644 --- a/include/sbi/sbi_trap.h +++ b/include/sbi/sbi_trap.h @@ -10,6 +10,8 @@ #ifndef __SBI_TRAP_H__ #define __SBI_TRAP_H__ +#include <sbi/riscv_encoding.h> + /* clang-format off */ /** Index of zero member in sbi_trap_regs */ @@ -206,6 +208,22 @@ struct sbi_trap_info { unsigned long gva; }; +static inline unsigned long sbi_regs_gva(const struct sbi_trap_regs *regs) +{ + /* + * If the hypervisor extension is not implemented, mstatus[h].GVA is a + * WPRI field, which is guaranteed to read as zero. In addition, in this + * case we don't read mstatush and instead pretend it is zero, which + * handles privileged spec version < 1.12. + */ + +#if __riscv_xlen == 32 + return (regs->mstatusH & MSTATUSH_GVA) ? 1 : 0; +#else + return (regs->mstatus & MSTATUS_GVA) ? 1 : 0; +#endif +} + int sbi_trap_redirect(struct sbi_trap_regs *regs, struct sbi_trap_info *trap); |