diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-05-28 06:07:42 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-06-08 13:11:23 +0300 |
commit | 1b8c0128f1d79d69ea0a46b758fef4be8dc0a73e (patch) | |
tree | f7f5a322710d6cd9638444b1130b1662c883f459 /lib | |
parent | 51f0e4a0533fe8b5d713379ab3a6cb676add82da (diff) | |
download | opensbi-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.c | 1 | ||||
-rw-r--r-- | lib/sbi/sbi_illegal_insn.c | 12 | ||||
-rw-r--r-- | lib/sbi/sbi_trap.c | 8 |
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); |