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 | |
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>
-rw-r--r-- | include/sbi/sbi_trap.h | 18 | ||||
-rw-r--r-- | lib/sbi/sbi_trap.c | 14 |
2 files changed, 19 insertions, 13 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); diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c index 4c1339e..c875c90 100644 --- a/lib/sbi/sbi_trap.c +++ b/lib/sbi/sbi_trap.c @@ -316,19 +316,7 @@ struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs) trap.tval = mtval; trap.tval2 = mtval2; trap.tinst = mtinst; - - /* - * 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 - trap.gva = (regs->mstatusH & MSTATUSH_GVA) ? 1 : 0; -#else - trap.gva = (regs->mstatus & MSTATUS_GVA) ? 1 : 0; -#endif + trap.gva = sbi_regs_gva(regs); rc = sbi_trap_redirect(regs, &trap); break; |