target/loongarch: Enable paravirt ipi feature

The similiar with cpucfg register, paravirt ipi feature is set in
function kvm_arch_put_registers(). Instead the paravirt feature can
be enabled only once, it cannot be changed dynamically.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
This commit is contained in:
Bibo Mao 2025-02-17 09:37:11 +08:00
parent 620d9bd002
commit 2698cc7c99

View File

@ -83,6 +83,33 @@ static int kvm_set_stealtime(CPUState *cs)
return 0;
}
static int kvm_set_pv_features(CPUState *cs)
{
CPULoongArchState *env = cpu_env(cs);
int err;
uint64_t val;
struct kvm_device_attr attr = {
.group = KVM_LOONGARCH_VCPU_CPUCFG,
.attr = CPUCFG_KVM_FEATURE,
.addr = (uint64_t)&val,
};
err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr);
if (err) {
return 0;
}
val = env->pv_features;
err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, attr);
if (err) {
error_report("Fail to set pv feature "TARGET_FMT_lx " with error %s",
val, strerror(errno));
return err;
}
return 0;
}
static int kvm_loongarch_get_regs_core(CPUState *cs)
{
int ret = 0;
@ -738,6 +765,7 @@ int kvm_arch_get_registers(CPUState *cs, Error **errp)
int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
{
int ret;
static int once;
ret = kvm_loongarch_put_regs_core(cs);
if (ret) {
@ -764,6 +792,14 @@ int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
return ret;
}
if (!once) {
ret = kvm_set_pv_features(cs);
if (ret) {
return ret;
}
once = 1;
}
if (level >= KVM_PUT_FULL_STATE) {
/*
* only KVM_PUT_FULL_STATE is required, kvm kernel will clear