mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 12:53:04 -04:00
RISC-V: KVM: add SBI extension reset callback
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>
This commit is contained in:
committed by
Anup Patel
parent
cf648c400f
commit
c046de827c
@@ -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__ */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user