aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Léger <cleger@rivosinc.com>2024-10-18 10:40:02 +0200
committerAnup Patel <anup@brainfault.org>2024-10-25 23:52:51 +0530
commitdaa282573ffac0f295de7631c98840668f20a568 (patch)
tree3de7a726113d69a316316abb2ccc71cc684968ec
parentb919daf4958281b94fd2e03e23874b97b4908fc5 (diff)
downloadopensbi-daa282573ffac0f295de7631c98840668f20a568.zip
opensbi-daa282573ffac0f295de7631c98840668f20a568.tar.gz
opensbi-daa282573ffac0f295de7631c98840668f20a568.tar.bz2
lib: sbi: factorize previous virtualization mode read from regs
The same pattern is used at multiple places to verify in which mode the exception was actually taken. Factorize it. Signed-off-by: Clément Léger <cleger@rivosinc.com> Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
-rw-r--r--include/sbi/sbi_trap.h9
-rw-r--r--lib/sbi/sbi_emulate_csr.c12
-rw-r--r--lib/sbi/sbi_trap.c6
3 files changed, 12 insertions, 15 deletions
diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h
index f7c170e..b0c47ce 100644
--- a/include/sbi/sbi_trap.h
+++ b/include/sbi/sbi_trap.h
@@ -236,6 +236,15 @@ static inline unsigned long sbi_regs_gva(const struct sbi_trap_regs *regs)
#endif
}
+static inline bool sbi_regs_from_virt(const struct sbi_trap_regs *regs)
+{
+#if __riscv_xlen == 32
+ return (regs->mstatusH & MSTATUSH_MPV) ? true : false;
+#else
+ return (regs->mstatus & MSTATUS_MPV) ? true : false;
+#endif
+}
+
int sbi_trap_redirect(struct sbi_trap_regs *regs,
const struct sbi_trap_info *trap);
diff --git a/lib/sbi/sbi_emulate_csr.c b/lib/sbi/sbi_emulate_csr.c
index 3adec78..a5a04cd 100644
--- a/lib/sbi/sbi_emulate_csr.c
+++ b/lib/sbi/sbi_emulate_csr.c
@@ -47,11 +47,7 @@ int sbi_emulate_csr_read(int csr_num, struct sbi_trap_regs *regs,
int ret = 0;
struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
ulong prev_mode = (regs->mstatus & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT;
-#if __riscv_xlen == 32
- bool virt = (regs->mstatusH & MSTATUSH_MPV) ? true : false;
-#else
- bool virt = (regs->mstatus & MSTATUS_MPV) ? true : false;
-#endif
+ bool virt = sbi_regs_from_virt(regs);
switch (csr_num) {
case CSR_HTIMEDELTA:
@@ -157,11 +153,7 @@ int sbi_emulate_csr_write(int csr_num, struct sbi_trap_regs *regs,
{
int ret = 0;
ulong prev_mode = (regs->mstatus & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT;
-#if __riscv_xlen == 32
- bool virt = (regs->mstatusH & MSTATUSH_MPV) ? true : false;
-#else
- bool virt = (regs->mstatus & MSTATUS_MPV) ? true : false;
-#endif
+ bool virt = sbi_regs_from_virt(regs);
switch (csr_num) {
case CSR_HTIMEDELTA:
diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c
index 176e174..ff0668e 100644
--- a/lib/sbi/sbi_trap.c
+++ b/lib/sbi/sbi_trap.c
@@ -104,11 +104,7 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
{
ulong hstatus, vsstatus, prev_mode;
bool elp = false;
-#if __riscv_xlen == 32
- bool prev_virt = (regs->mstatusH & MSTATUSH_MPV) ? true : false;
-#else
- bool prev_virt = (regs->mstatus & MSTATUS_MPV) ? true : false;
-#endif
+ bool prev_virt = sbi_regs_from_virt(regs);
/* By default, we redirect to HS-mode */
bool next_virt = false;