Message ID | 20240329101954.3954987-2-zhao1.liu@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/i386/kvm: Cleanup the kvmclock feature name | expand |
On 3/29/2024 6:19 PM, Zhao Liu wrote: > From: Zhao Liu <zhao1.liu@intel.com> > > Add feature definiations for KVM_CPUID_FEATURES in CPUID ( > CPUID[4000_0001].EAX and CPUID[4000_0001].EDX), to get rid of lots of > offset calculations. > > Signed-off-by: Zhao Liu <zhao1.liu@intel.com> > --- > hw/i386/kvm/clock.c | 5 ++--- > target/i386/cpu.h | 23 +++++++++++++++++++++++ > target/i386/kvm/kvm.c | 28 ++++++++++++++-------------- > 3 files changed, 39 insertions(+), 17 deletions(-) > > diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c > index 40aa9a32c32c..7c9752d5036f 100644 > --- a/hw/i386/kvm/clock.c > +++ b/hw/i386/kvm/clock.c > @@ -27,7 +27,6 @@ > #include "qapi/error.h" > > #include <linux/kvm.h> > -#include "standard-headers/asm-x86/kvm_para.h" > #include "qom/object.h" > > #define TYPE_KVM_CLOCK "kvmclock" > @@ -334,8 +333,8 @@ void kvmclock_create(bool create_always) > > assert(kvm_enabled()); > if (create_always || > - cpu->env.features[FEAT_KVM] & ((1ULL << KVM_FEATURE_CLOCKSOURCE) | > - (1ULL << KVM_FEATURE_CLOCKSOURCE2))) { > + cpu->env.features[FEAT_KVM] & (CPUID_FEAT_KVM_CLOCK | > + CPUID_FEAT_KVM_CLOCK2)) { > sysbus_create_simple(TYPE_KVM_CLOCK, -1, NULL); > } > } > diff --git a/target/i386/cpu.h b/target/i386/cpu.h > index 83e473584517..b1b8d11cb0fe 100644 > --- a/target/i386/cpu.h > +++ b/target/i386/cpu.h > @@ -27,6 +27,7 @@ > #include "qapi/qapi-types-common.h" > #include "qemu/cpu-float.h" > #include "qemu/timer.h" > +#include "standard-headers/asm-x86/kvm_para.h" > > #define XEN_NR_VIRQS 24 > > @@ -951,6 +952,28 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w, > /* Packets which contain IP payload have LIP values */ > #define CPUID_14_0_ECX_LIP (1U << 31) > > +/* (Old) KVM paravirtualized clocksource */ > +#define CPUID_FEAT_KVM_CLOCK (1U << KVM_FEATURE_CLOCKSOURCE) we can drop the _FEAT_, just name it as CPUID_KVM_CLOCK > +/* (New) KVM specific paravirtualized clocksource */ > +#define CPUID_FEAT_KVM_CLOCK2 (1U << KVM_FEATURE_CLOCKSOURCE2) > +/* KVM asynchronous page fault */ > +#define CPUID_FEAT_KVM_ASYNCPF (1U << KVM_FEATURE_ASYNC_PF) > +/* KVM stolen (when guest vCPU is not running) time accounting */ > +#define CPUID_FEAT_KVM_STEAL_TIME (1U << KVM_FEATURE_STEAL_TIME) > +/* KVM paravirtualized end-of-interrupt signaling */ > +#define CPUID_FEAT_KVM_PV_EOI (1U << KVM_FEATURE_PV_EOI) > +/* KVM paravirtualized spinlocks support */ > +#define CPUID_FEAT_KVM_PV_UNHALT (1U << KVM_FEATURE_PV_UNHALT) > +/* KVM host-side polling on HLT control from the guest */ > +#define CPUID_FEAT_KVM_POLL_CONTROL (1U << KVM_FEATURE_POLL_CONTROL) > +/* KVM interrupt based asynchronous page fault*/ > +#define CPUID_FEAT_KVM_ASYNCPF_INT (1U << KVM_FEATURE_ASYNC_PF_INT) > +/* KVM 'Extended Destination ID' support for external interrupts */ > +#define CPUID_FEAT_KVM_MSI_EXT_DEST_ID (1U << KVM_FEATURE_MSI_EXT_DEST_ID) > + > +/* Hint to KVM that vCPUs expect never preempted for an unlimited time */ > +#define CPUID_FEAT_KVM_HINTS_REALTIME (1U << KVM_HINTS_REALTIME) > + > /* CLZERO instruction */ > #define CPUID_8000_0008_EBX_CLZERO (1U << 0) > /* Always save/restore FP error pointers */ > diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c > index e68cbe929302..2f3c8bc3a4ed 100644 > --- a/target/i386/kvm/kvm.c > +++ b/target/i386/kvm/kvm.c > @@ -481,13 +481,13 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, > * be enabled without the in-kernel irqchip > */ > if (!kvm_irqchip_in_kernel()) { > - ret &= ~(1U << KVM_FEATURE_PV_UNHALT); > + ret &= ~CPUID_FEAT_KVM_PV_UNHALT; > } > if (kvm_irqchip_is_split()) { > - ret |= 1U << KVM_FEATURE_MSI_EXT_DEST_ID; > + ret |= CPUID_FEAT_KVM_MSI_EXT_DEST_ID; > } > } else if (function == KVM_CPUID_FEATURES && reg == R_EDX) { > - ret |= 1U << KVM_HINTS_REALTIME; > + ret |= CPUID_FEAT_KVM_HINTS_REALTIME; > } > > return ret; > @@ -3324,20 +3324,20 @@ static int kvm_put_msrs(X86CPU *cpu, int level) > kvm_msr_entry_add(cpu, MSR_IA32_TSC, env->tsc); > kvm_msr_entry_add(cpu, MSR_KVM_SYSTEM_TIME, env->system_time_msr); > kvm_msr_entry_add(cpu, MSR_KVM_WALL_CLOCK, env->wall_clock_msr); > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF_INT)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF_INT) { > kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_INT, env->async_pf_int_msr); > } > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF) { > kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_EN, env->async_pf_en_msr); > } > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_PV_EOI)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_PV_EOI) { > kvm_msr_entry_add(cpu, MSR_KVM_PV_EOI_EN, env->pv_eoi_en_msr); > } > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_STEAL_TIME)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_STEAL_TIME) { > kvm_msr_entry_add(cpu, MSR_KVM_STEAL_TIME, env->steal_time_msr); > } > > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_POLL_CONTROL)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_POLL_CONTROL) { > kvm_msr_entry_add(cpu, MSR_KVM_POLL_CONTROL, env->poll_control_msr); > } > > @@ -3789,19 +3789,19 @@ static int kvm_get_msrs(X86CPU *cpu) > #endif > kvm_msr_entry_add(cpu, MSR_KVM_SYSTEM_TIME, 0); > kvm_msr_entry_add(cpu, MSR_KVM_WALL_CLOCK, 0); > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF_INT)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF_INT) { > kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_INT, 0); > } > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF) { > kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_EN, 0); > } > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_PV_EOI)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_PV_EOI) { > kvm_msr_entry_add(cpu, MSR_KVM_PV_EOI_EN, 0); > } > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_STEAL_TIME)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_STEAL_TIME) { > kvm_msr_entry_add(cpu, MSR_KVM_STEAL_TIME, 0); > } > - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_POLL_CONTROL)) { > + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_POLL_CONTROL) { > kvm_msr_entry_add(cpu, MSR_KVM_POLL_CONTROL, 1); > } > if (has_architectural_pmu_version > 0) { > @@ -5434,7 +5434,7 @@ uint64_t kvm_swizzle_msi_ext_dest_id(uint64_t address) > return address; > } > env = &X86_CPU(first_cpu)->env; > - if (!(env->features[FEAT_KVM] & (1 << KVM_FEATURE_MSI_EXT_DEST_ID))) { > + if (!(env->features[FEAT_KVM] & CPUID_FEAT_KVM_MSI_EXT_DEST_ID)) { > return address; > } >
diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c index 40aa9a32c32c..7c9752d5036f 100644 --- a/hw/i386/kvm/clock.c +++ b/hw/i386/kvm/clock.c @@ -27,7 +27,6 @@ #include "qapi/error.h" #include <linux/kvm.h> -#include "standard-headers/asm-x86/kvm_para.h" #include "qom/object.h" #define TYPE_KVM_CLOCK "kvmclock" @@ -334,8 +333,8 @@ void kvmclock_create(bool create_always) assert(kvm_enabled()); if (create_always || - cpu->env.features[FEAT_KVM] & ((1ULL << KVM_FEATURE_CLOCKSOURCE) | - (1ULL << KVM_FEATURE_CLOCKSOURCE2))) { + cpu->env.features[FEAT_KVM] & (CPUID_FEAT_KVM_CLOCK | + CPUID_FEAT_KVM_CLOCK2)) { sysbus_create_simple(TYPE_KVM_CLOCK, -1, NULL); } } diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 83e473584517..b1b8d11cb0fe 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -27,6 +27,7 @@ #include "qapi/qapi-types-common.h" #include "qemu/cpu-float.h" #include "qemu/timer.h" +#include "standard-headers/asm-x86/kvm_para.h" #define XEN_NR_VIRQS 24 @@ -951,6 +952,28 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w, /* Packets which contain IP payload have LIP values */ #define CPUID_14_0_ECX_LIP (1U << 31) +/* (Old) KVM paravirtualized clocksource */ +#define CPUID_FEAT_KVM_CLOCK (1U << KVM_FEATURE_CLOCKSOURCE) +/* (New) KVM specific paravirtualized clocksource */ +#define CPUID_FEAT_KVM_CLOCK2 (1U << KVM_FEATURE_CLOCKSOURCE2) +/* KVM asynchronous page fault */ +#define CPUID_FEAT_KVM_ASYNCPF (1U << KVM_FEATURE_ASYNC_PF) +/* KVM stolen (when guest vCPU is not running) time accounting */ +#define CPUID_FEAT_KVM_STEAL_TIME (1U << KVM_FEATURE_STEAL_TIME) +/* KVM paravirtualized end-of-interrupt signaling */ +#define CPUID_FEAT_KVM_PV_EOI (1U << KVM_FEATURE_PV_EOI) +/* KVM paravirtualized spinlocks support */ +#define CPUID_FEAT_KVM_PV_UNHALT (1U << KVM_FEATURE_PV_UNHALT) +/* KVM host-side polling on HLT control from the guest */ +#define CPUID_FEAT_KVM_POLL_CONTROL (1U << KVM_FEATURE_POLL_CONTROL) +/* KVM interrupt based asynchronous page fault*/ +#define CPUID_FEAT_KVM_ASYNCPF_INT (1U << KVM_FEATURE_ASYNC_PF_INT) +/* KVM 'Extended Destination ID' support for external interrupts */ +#define CPUID_FEAT_KVM_MSI_EXT_DEST_ID (1U << KVM_FEATURE_MSI_EXT_DEST_ID) + +/* Hint to KVM that vCPUs expect never preempted for an unlimited time */ +#define CPUID_FEAT_KVM_HINTS_REALTIME (1U << KVM_HINTS_REALTIME) + /* CLZERO instruction */ #define CPUID_8000_0008_EBX_CLZERO (1U << 0) /* Always save/restore FP error pointers */ diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index e68cbe929302..2f3c8bc3a4ed 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -481,13 +481,13 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, * be enabled without the in-kernel irqchip */ if (!kvm_irqchip_in_kernel()) { - ret &= ~(1U << KVM_FEATURE_PV_UNHALT); + ret &= ~CPUID_FEAT_KVM_PV_UNHALT; } if (kvm_irqchip_is_split()) { - ret |= 1U << KVM_FEATURE_MSI_EXT_DEST_ID; + ret |= CPUID_FEAT_KVM_MSI_EXT_DEST_ID; } } else if (function == KVM_CPUID_FEATURES && reg == R_EDX) { - ret |= 1U << KVM_HINTS_REALTIME; + ret |= CPUID_FEAT_KVM_HINTS_REALTIME; } return ret; @@ -3324,20 +3324,20 @@ static int kvm_put_msrs(X86CPU *cpu, int level) kvm_msr_entry_add(cpu, MSR_IA32_TSC, env->tsc); kvm_msr_entry_add(cpu, MSR_KVM_SYSTEM_TIME, env->system_time_msr); kvm_msr_entry_add(cpu, MSR_KVM_WALL_CLOCK, env->wall_clock_msr); - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF_INT)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF_INT) { kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_INT, env->async_pf_int_msr); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF) { kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_EN, env->async_pf_en_msr); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_PV_EOI)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_PV_EOI) { kvm_msr_entry_add(cpu, MSR_KVM_PV_EOI_EN, env->pv_eoi_en_msr); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_STEAL_TIME)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_STEAL_TIME) { kvm_msr_entry_add(cpu, MSR_KVM_STEAL_TIME, env->steal_time_msr); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_POLL_CONTROL)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_POLL_CONTROL) { kvm_msr_entry_add(cpu, MSR_KVM_POLL_CONTROL, env->poll_control_msr); } @@ -3789,19 +3789,19 @@ static int kvm_get_msrs(X86CPU *cpu) #endif kvm_msr_entry_add(cpu, MSR_KVM_SYSTEM_TIME, 0); kvm_msr_entry_add(cpu, MSR_KVM_WALL_CLOCK, 0); - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF_INT)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF_INT) { kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_INT, 0); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_ASYNC_PF)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_ASYNCPF) { kvm_msr_entry_add(cpu, MSR_KVM_ASYNC_PF_EN, 0); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_PV_EOI)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_PV_EOI) { kvm_msr_entry_add(cpu, MSR_KVM_PV_EOI_EN, 0); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_STEAL_TIME)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_STEAL_TIME) { kvm_msr_entry_add(cpu, MSR_KVM_STEAL_TIME, 0); } - if (env->features[FEAT_KVM] & (1 << KVM_FEATURE_POLL_CONTROL)) { + if (env->features[FEAT_KVM] & CPUID_FEAT_KVM_POLL_CONTROL) { kvm_msr_entry_add(cpu, MSR_KVM_POLL_CONTROL, 1); } if (has_architectural_pmu_version > 0) { @@ -5434,7 +5434,7 @@ uint64_t kvm_swizzle_msi_ext_dest_id(uint64_t address) return address; } env = &X86_CPU(first_cpu)->env; - if (!(env->features[FEAT_KVM] & (1 << KVM_FEATURE_MSI_EXT_DEST_ID))) { + if (!(env->features[FEAT_KVM] & CPUID_FEAT_KVM_MSI_EXT_DEST_ID)) { return address; }