summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-05-28 06:07:42 +0300
committerAnup Patel <anup@brainfault.org>2020-06-08 13:11:23 +0300
commit1b8c0128f1d79d69ea0a46b758fef4be8dc0a73e (patch)
treef7f5a322710d6cd9638444b1130b1662c883f459 /lib
parent51f0e4a0533fe8b5d713379ab3a6cb676add82da (diff)
downloadopensbi-1b8c0128f1d79d69ea0a46b758fef4be8dc0a73e.tar.xz
lib: Add RISC-V hypervisor v0.6.1 support
To support RISC-V hypervisor v0.6.1, we: 1. Don't need to explicitly forward WFI traps from VS/VU-mode 2. Have to delegate virtual instruction trap to HS-mode 3. Have to update trap redirection for changes in HSTATUS CSR Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_hart.c1
-rw-r--r--lib/sbi/sbi_illegal_insn.c12
-rw-r--r--lib/sbi/sbi_trap.c8
3 files changed, 5 insertions, 16 deletions
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index 5fa30f3..88d0ac8 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -110,6 +110,7 @@ static int delegate_traps(struct sbi_scratch *scratch, u32 hartid)
exceptions |= (1U << CAUSE_SUPERVISOR_ECALL);
exceptions |= (1U << CAUSE_FETCH_GUEST_PAGE_FAULT);
exceptions |= (1U << CAUSE_LOAD_GUEST_PAGE_FAULT);
+ exceptions |= (1U << CAUSE_VIRTUAL_INST_FAULT);
exceptions |= (1U << CAUSE_STORE_GUEST_PAGE_FAULT);
}
diff --git a/lib/sbi/sbi_illegal_insn.c b/lib/sbi/sbi_illegal_insn.c
index 1b17487..0e5523f 100644
--- a/lib/sbi/sbi_illegal_insn.c
+++ b/lib/sbi/sbi_illegal_insn.c
@@ -38,17 +38,7 @@ static int system_opcode_insn(ulong insn, struct sbi_trap_regs *regs)
int csr_num = (u32)insn >> 20;
ulong csr_val, new_csr_val;
- /*
- * WFI always traps as illegal instruction when executed from
- * VS/VU mode so we just forward it to HS-mode.
- */
-#if __riscv_xlen == 32
- if ((regs->mstatusH & MSTATUSH_MPV) &&
-#else
- if ((regs->mstatus & MSTATUS_MPV) &&
-#endif
- (insn & INSN_MASK_WFI) == INSN_MATCH_WFI)
- return truly_illegal_insn(insn, regs);
+ /* TODO: Ensure that we got CSR read/write instruction */
if (sbi_emulate_csr_read(csr_num, regs, &csr_val))
return truly_illegal_insn(insn, regs);
diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c
index d482ad5..930119d 100644
--- a/lib/sbi/sbi_trap.c
+++ b/lib/sbi/sbi_trap.c
@@ -120,12 +120,10 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
/* Update HSTATUS for VS/VU-mode to HS-mode transition */
if (misa_extension('H') && prev_virt && !next_virt) {
- /* Update HSTATUS SP2P, SP2V, and SPV bits */
+ /* Update HSTATUS SPVP and SPV bits */
hstatus = csr_read(CSR_HSTATUS);
- hstatus &= ~HSTATUS_SP2P;
- hstatus |= (regs->mstatus & MSTATUS_SPP) ? HSTATUS_SP2P : 0;
- hstatus &= ~HSTATUS_SP2V;
- hstatus |= (hstatus & HSTATUS_SPV) ? HSTATUS_SP2V : 0;
+ hstatus &= ~HSTATUS_SPVP;
+ hstatus |= (regs->mstatus & MSTATUS_SPP) ? HSTATUS_SPVP : 0;
hstatus &= ~HSTATUS_SPV;
hstatus |= (prev_virt) ? HSTATUS_SPV : 0;
csr_write(CSR_HSTATUS, hstatus);