RISC-V: KVM: Redirect AMO load/store misaligned traps to guest
authorwchen <waylingii@gmail.com>
Sat, 20 May 2023 15:01:16 +0000 (23:01 +0800)
committerAnup Patel <anup@brainfault.org>
Tue, 6 Jun 2023 03:34:11 +0000 (09:04 +0530)
The M-mode redirects an unhandled misaligned trap back
to S-mode when not delegating it to VS-mode(hedeleg).
However, KVM running in HS-mode terminates the VS-mode
software when back from M-mode.
The KVM should redirect the trap back to VS-mode, and
let VS-mode trap handler decide the next step.
Here is a way to handle misaligned traps in KVM,
not only directing them to VS-mode or terminate it.

Signed-off-by: wchen <waylingII@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/include/asm/csr.h
arch/riscv/kvm/vcpu_exit.c

index b6acb7e..917814a 100644 (file)
@@ -82,7 +82,9 @@
 #define EXC_INST_ACCESS                1
 #define EXC_INST_ILLEGAL       2
 #define EXC_BREAKPOINT         3
+#define EXC_LOAD_MISALIGNED    4
 #define EXC_LOAD_ACCESS                5
+#define EXC_STORE_MISALIGNED   6
 #define EXC_STORE_ACCESS       7
 #define EXC_SYSCALL            8
 #define EXC_HYPERVISOR_SYSCALL 9
index 4ea101a..2415722 100644 (file)
@@ -183,6 +183,8 @@ int kvm_riscv_vcpu_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
        run->exit_reason = KVM_EXIT_UNKNOWN;
        switch (trap->scause) {
        case EXC_INST_ILLEGAL:
+       case EXC_LOAD_MISALIGNED:
+       case EXC_STORE_MISALIGNED:
                if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV) {
                        kvm_riscv_vcpu_trap_redirect(vcpu, trap);
                        ret = 1;