summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInochi Amaoto <inochiama@gmail.com>2026-07-13 09:02:58 +0800
committerAnup Patel <anup@brainfault.org>2026-07-29 18:33:38 +0530
commit864260d71d823e111fa3e9539cc74e213e43c987 (patch)
tree34624116921596a34807dbadb6e3ec9eb5781217
parent43a8f191171a94b8b9991cd0e587f6154ed1c116 (diff)
downloadlinux-864260d71d823e111fa3e9539cc74e213e43c987.tar.gz
linux-864260d71d823e111fa3e9539cc74e213e43c987.zip
RISC-V: KVM: Handle software-check exits for VCPU
The extension Zicfiss/Zicfilp introduces a software-check exception to the privilege architecture. Redirect this exception to VS mode when VCPU enable Zicfiss/Zicfilp so the CFI violations in VU/VS could be reported. Also, update kvm_riscv_vcpu_trap_redirect() to forward the SPELP state to the VS mode. Assisted-by: YuanSheng:claude-4.7-opus Co-developed-by: Quan Zhou <zhouquan@iscas.ac.cn> Signed-off-by: Quan Zhou <zhouquan@iscas.ac.cn> Signed-off-by: Inochi Amaoto <inochiama@gmail.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260713010302.303278-6-inochiama@gmail.com Signed-off-by: Anup Patel <anup@brainfault.org>
-rw-r--r--arch/riscv/include/asm/csr.h1
-rw-r--r--arch/riscv/kvm/vcpu_exit.c11
2 files changed, 12 insertions, 0 deletions
diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h
index 31b8988f4488..224af9facf1f 100644
--- a/arch/riscv/include/asm/csr.h
+++ b/arch/riscv/include/asm/csr.h
@@ -117,6 +117,7 @@
#define EXC_INST_PAGE_FAULT 12
#define EXC_LOAD_PAGE_FAULT 13
#define EXC_STORE_PAGE_FAULT 15
+#define EXC_SOFTWARE_CHECK 18
#define EXC_INST_GUEST_PAGE_FAULT 20
#define EXC_LOAD_GUEST_PAGE_FAULT 21
#define EXC_VIRTUAL_INST_FAULT 22
diff --git a/arch/riscv/kvm/vcpu_exit.c b/arch/riscv/kvm/vcpu_exit.c
index 6c8530b9f29e..73299770a98a 100644
--- a/arch/riscv/kvm/vcpu_exit.c
+++ b/arch/riscv/kvm/vcpu_exit.c
@@ -173,6 +173,13 @@ void kvm_riscv_vcpu_trap_redirect(struct kvm_vcpu *vcpu,
/* Clear Guest SSTATUS.SIE bit */
vsstatus &= ~SR_SIE;
+ /* Change Guest SSTATUS.SPELP bit */
+ if (vcpu->arch.cfg.henvcfg & ENVCFG_LPE) {
+ vsstatus &= ~SR_SPELP;
+ vsstatus |= vcpu->arch.guest_context.sstatus & SR_SPELP;
+ vcpu->arch.guest_context.sstatus &= ~SR_SPELP;
+ }
+
/* Update Guest SSTATUS */
ncsr_write(CSR_VSSTATUS, vsstatus);
@@ -262,6 +269,10 @@ int kvm_riscv_vcpu_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
run->exit_reason = KVM_EXIT_DEBUG;
ret = 0;
break;
+ case EXC_SOFTWARE_CHECK:
+ if (vcpu->arch.cfg.henvcfg & (ENVCFG_LPE | ENVCFG_SSE))
+ ret = vcpu_redirect(vcpu, trap);
+ break;
default:
break;
}