From bbeb8e619d1cc528d2d56531512d6ea406f9738b Mon Sep 17 00:00:00 2001 From: Anup Patel <anup.patel@wdc.com> Date: Mon, 15 Apr 2019 11:53:31 +0530 Subject: lib: Extend sbi_trap_redirect() for hypervisor extension When hypervisor extension is available, we can get traps from VS/VU modes. We should be able to force redirect some of these traps to HS-mode. In other words, we should be able forward traps from VS/VU mode to HS-mode using sbi_trap_redirect() hence this patch. Signed-off-by: Atish Patra <atish.patra@wdc.com> Signed-off-by: Anup Patel <anup.patel@wdc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com> --- firmware/fw_base.S | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'firmware') diff --git a/firmware/fw_base.S b/firmware/fw_base.S index f596638..2c198cf 100644 --- a/firmware/fw_base.S +++ b/firmware/fw_base.S @@ -486,6 +486,16 @@ _trap_handler_all_mode: REG_S t0, SBI_TRAP_REGS_OFFSET(mepc)(sp) csrr t0, CSR_MSTATUS REG_S t0, SBI_TRAP_REGS_OFFSET(mstatus)(sp) + REG_S zero, SBI_TRAP_REGS_OFFSET(mstatusH)(sp) +#if __riscv_xlen == 32 + csrr t0, CSR_MISA + srli t0, t0, ('H' - 'A') + andi t0, t0, 0x1 + beq t0, zero, _skip_mstatush_save + csrr t0, CSR_MSTATUSH + REG_S t0, SBI_TRAP_REGS_OFFSET(mstatusH)(sp) +_skip_mstatush_save: +#endif /* Save all general regisers except SP and T0 */ REG_S zero, SBI_TRAP_REGS_OFFSET(zero)(sp) @@ -560,6 +570,15 @@ _trap_handler_all_mode: csrw CSR_MEPC, t0 REG_L t0, SBI_TRAP_REGS_OFFSET(mstatus)(sp) csrw CSR_MSTATUS, t0 +#if __riscv_xlen == 32 + csrr t0, CSR_MISA + srli t0, t0, ('H' - 'A') + andi t0, t0, 0x1 + beq t0, zero, _skip_mstatush_restore + REG_L t0, SBI_TRAP_REGS_OFFSET(mstatusH)(sp) + csrw CSR_MSTATUSH, t0 +_skip_mstatush_restore: +#endif /* Restore T0 */ REG_L t0, SBI_TRAP_REGS_OFFSET(t0)(sp) -- cgit v1.2.3