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:
parent
620d9bd002
commit
2698cc7c99
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user