]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RISC-V: KVM: add SBI extension reset callback
authorClément Léger <cleger@rivosinc.com>
Fri, 23 May 2025 10:19:29 +0000 (12:19 +0200)
committerAnup Patel <anup@brainfault.org>
Wed, 23 Jul 2025 11:49:44 +0000 (17:19 +0530)
Currently, only the STA extension needed a reset function but that's
going to be the case for FWFT as well. Add a reset callback that can
be implemented by SBI extensions.

Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Link: https://lore.kernel.org/r/20250523101932.1594077-13-cleger@rivosinc.com
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/include/asm/kvm_host.h
arch/riscv/include/asm/kvm_vcpu_sbi.h
arch/riscv/kvm/vcpu.c
arch/riscv/kvm/vcpu_sbi.c
arch/riscv/kvm/vcpu_sbi_sta.c

index bcbf8b1ec1156176acf8a326fbc5335f29243482..041bbdb36ebcb3c76c7bb33a9d218789563c8ff1 100644 (file)
@@ -415,7 +415,6 @@ void __kvm_riscv_vcpu_power_on(struct kvm_vcpu *vcpu);
 void kvm_riscv_vcpu_power_on(struct kvm_vcpu *vcpu);
 bool kvm_riscv_vcpu_stopped(struct kvm_vcpu *vcpu);
 
-void kvm_riscv_vcpu_sbi_sta_reset(struct kvm_vcpu *vcpu);
 void kvm_riscv_vcpu_record_steal_time(struct kvm_vcpu *vcpu);
 
 #endif /* __RISCV_KVM_HOST_H__ */
index 8ee54f729b3b313179d6fae90081ed9e4402ede0..d678fd7e5973d16aae01e1f20634be1c57febd8e 100644 (file)
@@ -57,6 +57,8 @@ struct kvm_vcpu_sbi_extension {
         */
        int (*init)(struct kvm_vcpu *vcpu);
        void (*deinit)(struct kvm_vcpu *vcpu);
+
+       void (*reset)(struct kvm_vcpu *vcpu);
 };
 
 void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run);
@@ -81,6 +83,7 @@ bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx);
 int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run);
 void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu);
 void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu);
+void kvm_riscv_vcpu_sbi_reset(struct kvm_vcpu *vcpu);
 
 int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long reg_num,
                                   unsigned long *reg_val);
index 549f14df8af8c47593f785a8bb261c7aaa550a9d..3154ca23553d9855cdd15866e6376577fac2a65a 100644 (file)
@@ -111,7 +111,7 @@ static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu, bool kvm_sbi_reset)
        vcpu->arch.hfence_tail = 0;
        memset(vcpu->arch.hfence_queue, 0, sizeof(vcpu->arch.hfence_queue));
 
-       kvm_riscv_vcpu_sbi_sta_reset(vcpu);
+       kvm_riscv_vcpu_sbi_reset(vcpu);
 
        /* Reset the guest CSRs for hotplug usecase */
        if (loaded)
index 2737f42e720c5ff5ecccf929e9279a21636bae57..a56c4959f9adc9a2806e712280b472a376d0abbd 100644 (file)
@@ -564,3 +564,26 @@ void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu)
                ext->deinit(vcpu);
        }
 }
+
+void kvm_riscv_vcpu_sbi_reset(struct kvm_vcpu *vcpu)
+{
+       struct kvm_vcpu_sbi_context *scontext = &vcpu->arch.sbi_context;
+       const struct kvm_riscv_sbi_extension_entry *entry;
+       const struct kvm_vcpu_sbi_extension *ext;
+       int idx, i;
+
+       for (i = 0; i < ARRAY_SIZE(sbi_ext); i++) {
+               entry = &sbi_ext[i];
+               ext = entry->ext_ptr;
+               idx = entry->ext_idx;
+
+               if (idx < 0 || idx >= ARRAY_SIZE(scontext->ext_status))
+                       continue;
+
+               if (scontext->ext_status[idx] != KVM_RISCV_SBI_EXT_STATUS_ENABLED ||
+                   !ext->reset)
+                       continue;
+
+               ext->reset(vcpu);
+       }
+}
index 5f35427114c1da34da5679e2b75f4b456431a825..cc6cb7c8f0e41123166aec83016da60023f21f89 100644 (file)
@@ -16,7 +16,7 @@
 #include <asm/sbi.h>
 #include <asm/uaccess.h>
 
-void kvm_riscv_vcpu_sbi_sta_reset(struct kvm_vcpu *vcpu)
+static void kvm_riscv_vcpu_sbi_sta_reset(struct kvm_vcpu *vcpu)
 {
        vcpu->arch.sta.shmem = INVALID_GPA;
        vcpu->arch.sta.last_steal = 0;
@@ -156,6 +156,7 @@ const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta = {
        .extid_end = SBI_EXT_STA,
        .handler = kvm_sbi_ext_sta_handler,
        .probe = kvm_sbi_ext_sta_probe,
+       .reset = kvm_riscv_vcpu_sbi_sta_reset,
 };
 
 int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu *vcpu,