mirror of https://github.com/xemu-project/xemu.git
kvm: i8254: require KVM_CAP_PIT2 and KVM_CAP_PIT_STATE2
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
52b04ea49d
commit
39dd3e1f55
|
@ -97,24 +97,12 @@ static void kvm_pit_get(PITCommonState *pit)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_has_pit_state2()) {
|
ret = kvm_vm_ioctl(kvm_state, KVM_GET_PIT2, &kpit);
|
||||||
ret = kvm_vm_ioctl(kvm_state, KVM_GET_PIT2, &kpit);
|
if (ret < 0) {
|
||||||
if (ret < 0) {
|
fprintf(stderr, "KVM_GET_PIT2 failed: %s\n", strerror(-ret));
|
||||||
fprintf(stderr, "KVM_GET_PIT2 failed: %s\n", strerror(-ret));
|
abort();
|
||||||
abort();
|
|
||||||
}
|
|
||||||
pit->channels[0].irq_disabled = kpit.flags & KVM_PIT_FLAGS_HPET_LEGACY;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* kvm_pit_state2 is superset of kvm_pit_state struct,
|
|
||||||
* so we can use it for KVM_GET_PIT as well.
|
|
||||||
*/
|
|
||||||
ret = kvm_vm_ioctl(kvm_state, KVM_GET_PIT, &kpit);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf(stderr, "KVM_GET_PIT failed: %s\n", strerror(-ret));
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
pit->channels[0].irq_disabled = kpit.flags & KVM_PIT_FLAGS_HPET_LEGACY;
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
kchan = &kpit.channels[i];
|
kchan = &kpit.channels[i];
|
||||||
sc = &pit->channels[i];
|
sc = &pit->channels[i];
|
||||||
|
@ -170,12 +158,9 @@ static void kvm_pit_put(PITCommonState *pit)
|
||||||
kchan->count_load_time = sc->count_load_time - s->kernel_clock_offset;
|
kchan->count_load_time = sc->count_load_time - s->kernel_clock_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = kvm_vm_ioctl(kvm_state,
|
ret = kvm_vm_ioctl(kvm_state, KVM_SET_PIT2, &kpit);
|
||||||
kvm_has_pit_state2() ? KVM_SET_PIT2 : KVM_SET_PIT,
|
|
||||||
&kpit);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "%s failed: %s\n",
|
fprintf(stderr, "KVM_SET_PIT2 failed: %s\n",
|
||||||
kvm_has_pit_state2() ? "KVM_SET_PIT2" : "KVM_SET_PIT",
|
|
||||||
strerror(-ret));
|
strerror(-ret));
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
@ -261,11 +246,12 @@ static void kvm_pit_realizefn(DeviceState *dev, Error **errp)
|
||||||
};
|
};
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (kvm_check_extension(kvm_state, KVM_CAP_PIT2)) {
|
if (!kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2) ||
|
||||||
ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT2, &config);
|
!kvm_check_extension(kvm_state, KVM_CAP_PIT2)) {
|
||||||
} else {
|
error_setg(errp, "In-kernel PIT not available");
|
||||||
ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT2, &config);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Create kernel PIC irqchip failed: %s",
|
error_setg(errp, "Create kernel PIC irqchip failed: %s",
|
||||||
strerror(-ret));
|
strerror(-ret));
|
||||||
|
|
|
@ -1214,12 +1214,8 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if an HPET shall be created.
|
* Check if an HPET shall be created.
|
||||||
*
|
|
||||||
* Without KVM_CAP_PIT_STATE2, we cannot switch off the in-kernel PIT
|
|
||||||
* when the HPET wants to take over. Thus we have to disable the latter.
|
|
||||||
*/
|
*/
|
||||||
if (pcms->hpet_enabled && (!kvm_irqchip_in_kernel() ||
|
if (pcms->hpet_enabled) {
|
||||||
kvm_has_pit_state2())) {
|
|
||||||
qemu_irq rtc_irq;
|
qemu_irq rtc_irq;
|
||||||
|
|
||||||
hpet = qdev_try_new(TYPE_HPET);
|
hpet = qdev_try_new(TYPE_HPET);
|
||||||
|
|
|
@ -145,7 +145,6 @@ static uint32_t num_architectural_pmu_fixed_counters;
|
||||||
|
|
||||||
static int has_xsave2;
|
static int has_xsave2;
|
||||||
static int has_xcrs;
|
static int has_xcrs;
|
||||||
static int has_pit_state2;
|
|
||||||
static int has_sregs2;
|
static int has_sregs2;
|
||||||
static int has_exception_payload;
|
static int has_exception_payload;
|
||||||
static int has_triple_fault_event;
|
static int has_triple_fault_event;
|
||||||
|
@ -162,11 +161,6 @@ static KVMMSRHandlers msr_handlers[KVM_MSR_FILTER_MAX_RANGES];
|
||||||
static RateLimit bus_lock_ratelimit_ctrl;
|
static RateLimit bus_lock_ratelimit_ctrl;
|
||||||
static int kvm_get_one_msr(X86CPU *cpu, int index, uint64_t *value);
|
static int kvm_get_one_msr(X86CPU *cpu, int index, uint64_t *value);
|
||||||
|
|
||||||
bool kvm_has_pit_state2(void)
|
|
||||||
{
|
|
||||||
return !!has_pit_state2;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool kvm_has_smm(void)
|
bool kvm_has_smm(void)
|
||||||
{
|
{
|
||||||
return kvm_vm_check_extension(kvm_state, KVM_CAP_X86_SMM);
|
return kvm_vm_check_extension(kvm_state, KVM_CAP_X86_SMM);
|
||||||
|
@ -2543,7 +2537,6 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
has_xcrs = kvm_check_extension(s, KVM_CAP_XCRS);
|
has_xcrs = kvm_check_extension(s, KVM_CAP_XCRS);
|
||||||
has_pit_state2 = kvm_check_extension(s, KVM_CAP_PIT_STATE2);
|
|
||||||
has_sregs2 = kvm_check_extension(s, KVM_CAP_SREGS2) > 0;
|
has_sregs2 = kvm_check_extension(s, KVM_CAP_SREGS2) > 0;
|
||||||
|
|
||||||
hv_vpindex_settable = kvm_check_extension(s, KVM_CAP_HYPERV_VP_INDEX);
|
hv_vpindex_settable = kvm_check_extension(s, KVM_CAP_HYPERV_VP_INDEX);
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
bool kvm_has_smm(void);
|
bool kvm_has_smm(void);
|
||||||
bool kvm_enable_x2apic(void);
|
bool kvm_enable_x2apic(void);
|
||||||
bool kvm_hv_vpindex_settable(void);
|
bool kvm_hv_vpindex_settable(void);
|
||||||
bool kvm_has_pit_state2(void);
|
|
||||||
|
|
||||||
bool kvm_enable_sgx_provisioning(KVMState *s);
|
bool kvm_enable_sgx_provisioning(KVMState *s);
|
||||||
bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp);
|
bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp);
|
||||||
|
|
Loading…
Reference in New Issue