33
33
#define CALIBRATION_ROUNDS 3
35
#define KVM_PIT(obj) OBJECT_CHECK(KVMPITState, (obj), TYPE_KVM_I8254)
36
#define KVM_PIT_CLASS(class) \
37
OBJECT_CLASS_CHECK(KVMPITClass, (class), TYPE_KVM_I8254)
38
#define KVM_PIT_GET_CLASS(obj) \
39
OBJECT_GET_CLASS(KVMPITClass, (obj), TYPE_KVM_I8254)
35
41
typedef struct KVMPITState {
42
PITCommonState parent_obj;
37
44
LostTickPolicy lost_tick_policy;
39
46
int64_t kernel_clock_offset;
49
typedef struct KVMPITClass {
50
PITCommonClass parent_class;
52
DeviceRealize parent_realize;
42
55
static int64_t abs64(int64_t v)
44
57
return v < 0 ? -v : v;
71
84
static void kvm_pit_get(PITCommonState *pit)
73
KVMPITState *s = DO_UPCAST(KVMPITState, pit, pit);
86
KVMPITState *s = KVM_PIT(pit);
74
87
struct kvm_pit_state2 kpit;
75
88
struct kvm_pit_channel_state *kchan;
76
89
struct PITChannelState *sc;
125
138
static void kvm_pit_put(PITCommonState *pit)
127
KVMPITState *s = DO_UPCAST(KVMPITState, pit, pit);
140
KVMPITState *s = KVM_PIT(pit);
128
141
struct kvm_pit_state2 kpit;
129
142
struct kvm_pit_channel_state *kchan;
130
143
struct PITChannelState *sc;
229
242
s->vm_stopped = false;
231
244
kvm_pit_update_clock_offset(s);
232
kvm_pit_get(&s->pit);
245
kvm_pit_get(PIT_COMMON(s));
233
246
s->vm_stopped = true;
237
static int kvm_pit_initfn(PITCommonState *pit)
250
static void kvm_pit_realizefn(DeviceState *dev, Error **errp)
239
KVMPITState *s = DO_UPCAST(KVMPITState, pit, pit);
252
PITCommonState *pit = PIT_COMMON(dev);
253
KVMPITClass *kpc = KVM_PIT_GET_CLASS(dev);
254
KVMPITState *s = KVM_PIT(pit);
240
255
struct kvm_pit_config config = {
248
263
ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT);
251
fprintf(stderr, "Create kernel PIC irqchip failed: %s\n",
266
error_setg(errp, "Create kernel PIC irqchip failed: %s",
255
270
switch (s->lost_tick_policy) {
256
271
case LOST_TICK_DELAY:
262
277
ret = kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control);
265
"Can't disable in-kernel PIT reinjection: %s\n",
280
"Can't disable in-kernel PIT reinjection: %s",
287
error_setg(errp, "Lost tick policy not supported.");
275
memory_region_init_reservation(&pit->ioports, "kvm-pit", 4);
291
memory_region_init_reservation(&pit->ioports, NULL, "kvm-pit", 4);
277
qdev_init_gpio_in(&pit->dev.qdev, kvm_pit_irq_control, 1);
293
qdev_init_gpio_in(dev, kvm_pit_irq_control, 1);
279
295
qemu_add_vm_change_state_handler(kvm_pit_vm_state_change, s);
297
kpc->parent_realize(dev, errp);
284
300
static Property kvm_pit_properties[] = {
285
DEFINE_PROP_HEX32("iobase", KVMPITState, pit.iobase, -1),
301
DEFINE_PROP_HEX32("iobase", PITCommonState, iobase, -1),
286
302
DEFINE_PROP_LOSTTICKPOLICY("lost_tick_policy", KVMPITState,
287
303
lost_tick_policy, LOST_TICK_DELAY),
288
304
DEFINE_PROP_END_OF_LIST(),
291
307
static void kvm_pit_class_init(ObjectClass *klass, void *data)
309
KVMPITClass *kpc = KVM_PIT_CLASS(klass);
293
310
PITCommonClass *k = PIT_COMMON_CLASS(klass);
294
311
DeviceClass *dc = DEVICE_CLASS(klass);
296
k->init = kvm_pit_initfn;
313
kpc->parent_realize = dc->realize;
314
dc->realize = kvm_pit_realizefn;
297
315
k->set_channel_gate = kvm_pit_set_gate;
298
316
k->get_channel_info = kvm_pit_get_channel_info;
299
317
k->pre_save = kvm_pit_get;
305
323
static const TypeInfo kvm_pit_info = {
324
.name = TYPE_KVM_I8254,
307
325
.parent = TYPE_PIT_COMMON,
308
326
.instance_size = sizeof(KVMPITState),
309
327
.class_init = kvm_pit_class_init,
328
.class_size = sizeof(KVMPITClass),
312
331
static void kvm_pit_register(void)