diff options
author | Clément Léger <cleger@rivosinc.com> | 2024-10-18 10:40:02 +0200 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2024-10-25 23:52:51 +0530 |
commit | daa282573ffac0f295de7631c98840668f20a568 (patch) | |
tree | 3de7a726113d69a316316abb2ccc71cc684968ec | |
parent | b919daf4958281b94fd2e03e23874b97b4908fc5 (diff) | |
download | opensbi-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.h | 9 | ||||
-rw-r--r-- | lib/sbi/sbi_emulate_csr.c | 12 | ||||
-rw-r--r-- | lib/sbi/sbi_trap.c | 6 |
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; |