The supervisor ecall and breakpoint traps from Guest VS/VU-mode (aka L2/nested guest) should be redirected to Guest HS-mode (aka L1/guest hypervisor).
Signed-off-by: Anup Patel <[email protected]> --- arch/riscv/kvm/vcpu_exit.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/arch/riscv/kvm/vcpu_exit.c b/arch/riscv/kvm/vcpu_exit.c index aeec4c4eee06..6627c2c25a71 100644 --- a/arch/riscv/kvm/vcpu_exit.c +++ b/arch/riscv/kvm/vcpu_exit.c @@ -274,12 +274,18 @@ int kvm_riscv_vcpu_exit(struct kvm_vcpu *vcpu, struct kvm_run *run, ret = gstage_page_fault(vcpu, run, trap); break; case EXC_SUPERVISOR_SYSCALL: - if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV) + if (kvm_riscv_vcpu_nested_virt(vcpu)) + ret = vcpu_redirect(vcpu, trap); + else if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV) ret = kvm_riscv_vcpu_sbi_ecall(vcpu, run); break; case EXC_BREAKPOINT: - run->exit_reason = KVM_EXIT_DEBUG; - ret = 0; + if (kvm_riscv_vcpu_nested_virt(vcpu)) { + ret = vcpu_redirect(vcpu, trap); + } else { + run->exit_reason = KVM_EXIT_DEBUG; + ret = 0; + } break; default: break; -- 2.43.0

