]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RISC-V: KVM: Update firmware counters for various events
authorAtish Patra <atishp@rivosinc.com>
Tue, 24 Dec 2024 21:04:54 +0000 (13:04 -0800)
committerAnup Patel <anup@brainfault.org>
Mon, 30 Dec 2024 08:31:02 +0000 (14:01 +0530)
SBI PMU specification defines few firmware counters which can be
used by the guests to collect the statstics about various traps
occurred in the host.

Update these counters whenever a corresponding trap is taken

Reviewed-by: Anup Patel <anup@brainfault.org>
Signed-off-by: Atish Patra <atishp@rivosinc.com>
Link: https://lore.kernel.org/r/20241224-kvm_guest_stat-v2-2-08a77ac36b02@rivosinc.com
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/kvm/vcpu_exit.c

index c9f8b2094554381bcda42216bc58e5c6f252ba13..acdcd619797ee82b5247c069c8011149e3493275 100644 (file)
@@ -165,6 +165,17 @@ void kvm_riscv_vcpu_trap_redirect(struct kvm_vcpu *vcpu,
        vcpu->arch.guest_context.sstatus |= SR_SPP;
 }
 
+static inline int vcpu_redirect(struct kvm_vcpu *vcpu, struct kvm_cpu_trap *trap)
+{
+       int ret = -EFAULT;
+
+       if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV) {
+               kvm_riscv_vcpu_trap_redirect(vcpu, trap);
+               ret = 1;
+       }
+       return ret;
+}
+
 /*
  * Return > 0 to return to guest, < 0 on error, 0 (and set exit_reason) on
  * proper exit to userspace.
@@ -183,15 +194,27 @@ 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:
+               kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_ILLEGAL_INSN);
+               ret = vcpu_redirect(vcpu, trap);
+               break;
        case EXC_LOAD_MISALIGNED:
+               kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_MISALIGNED_LOAD);
+               ret = vcpu_redirect(vcpu, trap);
+               break;
        case EXC_STORE_MISALIGNED:
+               kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_MISALIGNED_STORE);
+               ret = vcpu_redirect(vcpu, trap);
+               break;
        case EXC_LOAD_ACCESS:
+               kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_ACCESS_LOAD);
+               ret = vcpu_redirect(vcpu, trap);
+               break;
        case EXC_STORE_ACCESS:
+               kvm_riscv_vcpu_pmu_incr_fw(vcpu, SBI_PMU_FW_ACCESS_STORE);
+               ret = vcpu_redirect(vcpu, trap);
+               break;
        case EXC_INST_ACCESS:
-               if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV) {
-                       kvm_riscv_vcpu_trap_redirect(vcpu, trap);
-                       ret = 1;
-               }
+               ret = vcpu_redirect(vcpu, trap);
                break;
        case EXC_VIRTUAL_INST_FAULT:
                if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV)