diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h index f7c170e6..b0c47ce5 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 3adec78d..a5a04cd5 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 176e1740..ff0668e1 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;