Revision 5122b431 hw/i8254.c
b/hw/i8254.c | ||
---|---|---|
389 | 389 |
pit_irq_timer_update(s, s->next_transition_time); |
390 | 390 |
} |
391 | 391 |
|
392 |
static void pit_save(QEMUFile *f, void *opaque) |
|
393 |
{ |
|
394 |
PITState *pit = opaque; |
|
395 |
PITChannelState *s; |
|
396 |
int i; |
|
397 |
|
|
398 |
for(i = 0; i < 3; i++) { |
|
399 |
s = &pit->channels[i]; |
|
400 |
qemu_put_be32(f, s->count); |
|
401 |
qemu_put_be16s(f, &s->latched_count); |
|
402 |
qemu_put_8s(f, &s->count_latched); |
|
403 |
qemu_put_8s(f, &s->status_latched); |
|
404 |
qemu_put_8s(f, &s->status); |
|
405 |
qemu_put_8s(f, &s->read_state); |
|
406 |
qemu_put_8s(f, &s->write_state); |
|
407 |
qemu_put_8s(f, &s->write_latch); |
|
408 |
qemu_put_8s(f, &s->rw_mode); |
|
409 |
qemu_put_8s(f, &s->mode); |
|
410 |
qemu_put_8s(f, &s->bcd); |
|
411 |
qemu_put_8s(f, &s->gate); |
|
412 |
qemu_put_be64(f, s->count_load_time); |
|
413 |
if (s->irq_timer) { |
|
414 |
qemu_put_be64(f, s->next_transition_time); |
|
415 |
qemu_put_timer(f, s->irq_timer); |
|
416 |
} |
|
392 |
static const VMStateDescription vmstate_pit_channel = { |
|
393 |
.name = "pit channel", |
|
394 |
.version_id = 2, |
|
395 |
.minimum_version_id = 2, |
|
396 |
.minimum_version_id_old = 2, |
|
397 |
.fields = (VMStateField []) { |
|
398 |
VMSTATE_INT32(count, PITChannelState), |
|
399 |
VMSTATE_UINT16(latched_count, PITChannelState), |
|
400 |
VMSTATE_UINT8(count_latched, PITChannelState), |
|
401 |
VMSTATE_UINT8(status_latched, PITChannelState), |
|
402 |
VMSTATE_UINT8(status, PITChannelState), |
|
403 |
VMSTATE_UINT8(read_state, PITChannelState), |
|
404 |
VMSTATE_UINT8(write_state, PITChannelState), |
|
405 |
VMSTATE_UINT8(write_latch, PITChannelState), |
|
406 |
VMSTATE_UINT8(rw_mode, PITChannelState), |
|
407 |
VMSTATE_UINT8(mode, PITChannelState), |
|
408 |
VMSTATE_UINT8(bcd, PITChannelState), |
|
409 |
VMSTATE_UINT8(gate, PITChannelState), |
|
410 |
VMSTATE_INT64(count_load_time, PITChannelState), |
|
411 |
VMSTATE_INT64(next_transition_time, PITChannelState), |
|
412 |
VMSTATE_END_OF_LIST() |
|
417 | 413 |
} |
418 |
} |
|
414 |
};
|
|
419 | 415 |
|
420 |
static int pit_load(QEMUFile *f, void *opaque, int version_id) |
|
416 |
static int pit_load_old(QEMUFile *f, void *opaque, int version_id)
|
|
421 | 417 |
{ |
422 | 418 |
PITState *pit = opaque; |
423 | 419 |
PITChannelState *s; |
... | ... | |
449 | 445 |
return 0; |
450 | 446 |
} |
451 | 447 |
|
448 |
static const VMStateDescription vmstate_pit = { |
|
449 |
.name = "i8254", |
|
450 |
.version_id = 2, |
|
451 |
.minimum_version_id = 2, |
|
452 |
.minimum_version_id_old = 1, |
|
453 |
.load_state_old = pit_load_old, |
|
454 |
.fields = (VMStateField []) { |
|
455 |
VMSTATE_STRUCT_ARRAY(channels, PITState, 3, 2, vmstate_pit_channel, PITChannelState), |
|
456 |
VMSTATE_TIMER(channels[0].irq_timer, PITState), |
|
457 |
VMSTATE_END_OF_LIST() |
|
458 |
} |
|
459 |
}; |
|
460 |
|
|
452 | 461 |
static void pit_reset(void *opaque) |
453 | 462 |
{ |
454 | 463 |
PITState *pit = opaque; |
... | ... | |
495 | 504 |
s->irq_timer = qemu_new_timer(vm_clock, pit_irq_timer, s); |
496 | 505 |
s->irq = irq; |
497 | 506 |
|
498 |
register_savevm("i8254", base, 1, pit_save, pit_load, pit); |
|
499 |
|
|
507 |
vmstate_register(base, &vmstate_pit, pit); |
|
500 | 508 |
qemu_register_reset(pit_reset, pit); |
501 | 509 |
register_ioport_write(base, 4, 1, pit_ioport_write, pit); |
502 | 510 |
register_ioport_read(base, 3, 1, pit_ioport_read, pit); |
Also available in: Unified diff