diff options
author | Bibo Mao <maobibo@loongson.cn> | 2025-02-17 09:55:32 +0800 |
---|---|---|
committer | Bibo Mao <maobibo@loongson.cn> | 2025-02-25 16:05:31 +0800 |
commit | 954cc5c311cd4459ce16a3302ff8611d98473d7d (patch) | |
tree | 3b5a59571ba4736689ae355369efe72defe68fe0 | |
parent | 610babce1ed83a0fd3af14f5195114d6c5338610 (diff) | |
download | qemu-954cc5c311cd4459ce16a3302ff8611d98473d7d.zip qemu-954cc5c311cd4459ce16a3302ff8611d98473d7d.tar.gz qemu-954cc5c311cd4459ce16a3302ff8611d98473d7d.tar.bz2 |
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>
-rw-r--r-- | target/loongarch/cpu.h | 1 | ||||
-rw-r--r-- | target/loongarch/kvm/kvm.c | 20 |
2 files changed, 21 insertions, 0 deletions
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h index 3e8a917..83183a3 100644 --- a/target/loongarch/cpu.h +++ b/target/loongarch/cpu.h @@ -288,6 +288,7 @@ enum loongarch_features { LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */ LOONGARCH_FEATURE_PMU, LOONGARCH_FEATURE_PV_IPI, + LOONGARCH_FEATURE_STEALTIME, }; typedef struct LoongArchBT { diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c index def7451..59a5f84 100644 --- a/target/loongarch/kvm/kvm.c +++ b/target/loongarch/kvm/kvm.c @@ -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); 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: return false; } @@ -1042,6 +1048,20 @@ static int kvm_cpu_check_pv_features(CPUState *cs, Error **errp) 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; } |