target/loongarch: Add kvm steal time feature detection

Paravirt steal time feature is OnOffAuto type, feature detection is added
to check whether it is supported on KVM host.

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:55:32 +08:00
parent 610babce1e
commit 954cc5c311
2 changed files with 21 additions and 0 deletions

View File

@ -288,6 +288,7 @@ enum loongarch_features {
LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */ LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */
LOONGARCH_FEATURE_PMU, LOONGARCH_FEATURE_PMU,
LOONGARCH_FEATURE_PV_IPI, LOONGARCH_FEATURE_PV_IPI,
LOONGARCH_FEATURE_STEALTIME,
}; };
typedef struct LoongArchBT { typedef struct LoongArchBT {

View File

@ -924,6 +924,12 @@ static bool kvm_feature_supported(CPUState *cs, enum loongarch_features feature)
ret = kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr); ret = kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
return (ret == 0); return (ret == 0);
case LOONGARCH_FEATURE_STEALTIME:
attr.group = KVM_LOONGARCH_VM_FEAT_CTRL;
attr.attr = KVM_LOONGARCH_VM_FEAT_PV_STEALTIME;
ret = kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
return (ret == 0);
default: default:
return false; return false;
} }
@ -1042,6 +1048,20 @@ static int kvm_cpu_check_pv_features(CPUState *cs, Error **errp)
env->pv_features |= BIT(KVM_FEATURE_IPI); env->pv_features |= BIT(KVM_FEATURE_IPI);
} }
kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_STEALTIME);
if (cpu->kvm_steal_time == ON_OFF_AUTO_ON) {
if (!kvm_supported) {
error_setg(errp, "'kvm stealtime' feature not supported by KVM host");
return -ENOTSUP;
}
} else if (cpu->kvm_steal_time != ON_OFF_AUTO_AUTO) {
kvm_supported = false;
}
if (kvm_supported) {
env->pv_features |= BIT(KVM_FEATURE_STEAL_TIME);
}
return 0; return 0;
} }