X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=hw%2Fi386%2Fkvm%2Fclock.c;h=f25977d3f68075d54981633a02e2759cda7393f2;hb=b77af26e973705e8fd96cff102fc978ee44043da;hp=37f47540e511e6649f77a229e4d4653960becf07;hpb=f00f57f344236bbbe4c20845a0276a490dd5ffea;p=mirror_qemu.git diff --git a/hw/i386/kvm/clock.c b/hw/i386/kvm/clock.c index 37f47540e5..f25977d3f6 100644 --- a/hw/i386/kvm/clock.c +++ b/hw/i386/kvm/clock.c @@ -14,16 +14,15 @@ */ #include "qemu/osdep.h" -#include "cpu.h" #include "qemu/host-utils.h" #include "qemu/module.h" #include "sysemu/kvm.h" #include "sysemu/runstate.h" #include "sysemu/hw_accel.h" -#include "kvm_i386.h" +#include "kvm/kvm_i386.h" #include "migration/vmstate.h" #include "hw/sysbus.h" -#include "hw/kvm/clock.h" +#include "hw/i386/kvm/clock.h" #include "hw/qdev-properties.h" #include "qapi/error.h" @@ -32,9 +31,7 @@ #include "qom/object.h" #define TYPE_KVM_CLOCK "kvmclock" -typedef struct KVMClockState KVMClockState; -DECLARE_INSTANCE_CHECKER(KVMClockState, KVM_CLOCK, - TYPE_KVM_CLOCK) +OBJECT_DECLARE_SIMPLE_TYPE(KVMClockState, KVM_CLOCK) struct KVMClockState { /*< private >*/ @@ -69,7 +66,7 @@ struct pvclock_vcpu_time_info { static uint64_t kvmclock_current_nsec(KVMClockState *s) { CPUState *cpu = first_cpu; - CPUX86State *env = cpu->env_ptr; + CPUX86State *env = cpu_env(cpu); hwaddr kvmclock_struct_pa; uint64_t migration_tsc = env->tsc; struct pvclock_vcpu_time_info time; @@ -108,7 +105,7 @@ static void kvm_update_clock(KVMClockState *s) ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data); if (ret < 0) { - fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret)); + fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(-ret)); abort(); } s->clock = data.clock; @@ -164,7 +161,7 @@ static void do_kvmclock_ctrl(CPUState *cpu, run_on_cpu_data data) } } -static void kvmclock_vm_state_change(void *opaque, int running, +static void kvmclock_vm_state_change(void *opaque, bool running, RunState state) { KVMClockState *s = opaque; @@ -192,7 +189,7 @@ static void kvmclock_vm_state_change(void *opaque, int running, data.clock = s->clock; ret = kvm_vm_ioctl(kvm_state, KVM_SET_CLOCK, &data); if (ret < 0) { - fprintf(stderr, "KVM_SET_CLOCK failed: %s\n", strerror(ret)); + fprintf(stderr, "KVM_SET_CLOCK failed: %s\n", strerror(-ret)); abort(); } @@ -331,11 +328,16 @@ static const TypeInfo kvmclock_info = { }; /* Note: Must be called after VCPU initialization. */ -void kvmclock_create(void) +void kvmclock_create(bool create_always) { X86CPU *cpu = X86_CPU(first_cpu); - if (kvm_enabled() && + assert(kvm_enabled()); + if (!kvm_has_adjust_clock()) { + return; + } + + if (create_always || cpu->env.features[FEAT_KVM] & ((1ULL << KVM_FEATURE_CLOCKSOURCE) | (1ULL << KVM_FEATURE_CLOCKSOURCE2))) { sysbus_create_simple(TYPE_KVM_CLOCK, -1, NULL);