[RFC PATCH 1/4] lib: sbi: factorize previous virtualization mode read from regs
Anup Patel
anup at brainfault.org
Mon Jun 10 03:56:04 PDT 2024
On Thu, Apr 18, 2024 at 7:25 PM Clément Léger <cleger at rivosinc.com> wrote:
>
> 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 at rivosinc.com>
LGTM.
Reviewed-by: Anup Patel <anup at brainfault.org>
Regards,
Anup
> ---
> include/sbi/sbi_trap.h | 9 +++++++++
> lib/sbi/sbi_emulate_csr.c | 12 ++----------
> 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 5f3b111..4036946 100644
> --- a/lib/sbi/sbi_emulate_csr.c
> +++ b/lib/sbi/sbi_emulate_csr.c
> @@ -48,11 +48,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:
> @@ -163,11 +159,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 b4f3a17..8bd2183 100644
> --- a/lib/sbi/sbi_trap.c
> +++ b/lib/sbi/sbi_trap.c
> @@ -103,11 +103,7 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
> const struct sbi_trap_info *trap)
> {
> ulong hstatus, vsstatus, prev_mode;
> -#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;
>
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list