Revision b31442c3
b/hw/ps2.c | ||
---|---|---|
526 | 526 |
s->mouse_buttons = 0; |
527 | 527 |
} |
528 | 528 |
|
529 |
static void ps2_common_save (QEMUFile *f, PS2State *s) |
|
530 |
{ |
|
531 |
qemu_put_be32 (f, s->write_cmd); |
|
532 |
qemu_put_be32 (f, s->queue.rptr); |
|
533 |
qemu_put_be32 (f, s->queue.wptr); |
|
534 |
qemu_put_be32 (f, s->queue.count); |
|
535 |
qemu_put_buffer (f, s->queue.data, sizeof (s->queue.data)); |
|
536 |
} |
|
537 |
|
|
538 |
static void ps2_common_load (QEMUFile *f, PS2State *s) |
|
539 |
{ |
|
540 |
s->write_cmd=qemu_get_be32 (f); |
|
541 |
s->queue.rptr=qemu_get_be32 (f); |
|
542 |
s->queue.wptr=qemu_get_be32 (f); |
|
543 |
s->queue.count=qemu_get_be32 (f); |
|
544 |
qemu_get_buffer (f, s->queue.data, sizeof (s->queue.data)); |
|
545 |
} |
|
546 |
|
|
547 |
static void ps2_kbd_save(QEMUFile* f, void* opaque) |
|
548 |
{ |
|
549 |
PS2KbdState *s = (PS2KbdState*)opaque; |
|
550 |
|
|
551 |
ps2_common_save (f, &s->common); |
|
552 |
qemu_put_be32(f, s->scan_enabled); |
|
553 |
qemu_put_be32(f, s->translate); |
|
554 |
qemu_put_be32(f, s->scancode_set); |
|
555 |
} |
|
556 |
|
|
557 |
static void ps2_mouse_save(QEMUFile* f, void* opaque) |
|
558 |
{ |
|
559 |
PS2MouseState *s = (PS2MouseState*)opaque; |
|
560 |
|
|
561 |
ps2_common_save (f, &s->common); |
|
562 |
qemu_put_8s(f, &s->mouse_status); |
|
563 |
qemu_put_8s(f, &s->mouse_resolution); |
|
564 |
qemu_put_8s(f, &s->mouse_sample_rate); |
|
565 |
qemu_put_8s(f, &s->mouse_wrap); |
|
566 |
qemu_put_8s(f, &s->mouse_type); |
|
567 |
qemu_put_8s(f, &s->mouse_detect_state); |
|
568 |
qemu_put_be32(f, s->mouse_dx); |
|
569 |
qemu_put_be32(f, s->mouse_dy); |
|
570 |
qemu_put_be32(f, s->mouse_dz); |
|
571 |
qemu_put_8s(f, &s->mouse_buttons); |
|
572 |
} |
|
529 |
static const VMStateDescription vmstate_ps2_common = { |
|
530 |
.name = "PS2 Common State", |
|
531 |
.version_id = 3, |
|
532 |
.minimum_version_id = 2, |
|
533 |
.minimum_version_id_old = 2, |
|
534 |
.fields = (VMStateField []) { |
|
535 |
VMSTATE_INT32(write_cmd, PS2State), |
|
536 |
VMSTATE_INT32(queue.rptr, PS2State), |
|
537 |
VMSTATE_INT32(queue.wptr, PS2State), |
|
538 |
VMSTATE_INT32(queue.count, PS2State), |
|
539 |
VMSTATE_BUFFER(queue.data, PS2State), |
|
540 |
VMSTATE_END_OF_LIST() |
|
541 |
} |
|
542 |
}; |
|
573 | 543 |
|
574 |
static int ps2_kbd_load(QEMUFile* f, void* opaque, int version_id) |
|
544 |
static int ps2_kbd_load_old(QEMUFile* f, void* opaque, int version_id)
|
|
575 | 545 |
{ |
576 | 546 |
PS2KbdState *s = (PS2KbdState*)opaque; |
577 | 547 |
|
578 | 548 |
if (version_id != 2 && version_id != 3) |
579 | 549 |
return -EINVAL; |
580 | 550 |
|
581 |
ps2_common_load (f, &s->common);
|
|
551 |
vmstate_load_state(f, &vmstate_ps2_common, &s->common, version_id);
|
|
582 | 552 |
s->scan_enabled=qemu_get_be32(f); |
583 | 553 |
s->translate=qemu_get_be32(f); |
584 | 554 |
if (version_id == 3) |
... | ... | |
588 | 558 |
return 0; |
589 | 559 |
} |
590 | 560 |
|
591 |
static int ps2_mouse_load(QEMUFile* f, void* opaque, int version_id) |
|
592 |
{ |
|
593 |
PS2MouseState *s = (PS2MouseState*)opaque; |
|
594 |
|
|
595 |
if (version_id != 2) |
|
596 |
return -EINVAL; |
|
561 |
static const VMStateDescription vmstate_ps2_keyboard = { |
|
562 |
.name = "ps2kbd", |
|
563 |
.version_id = 3, |
|
564 |
.minimum_version_id = 3, |
|
565 |
.minimum_version_id_old = 2, |
|
566 |
.load_state_old = ps2_kbd_load_old, |
|
567 |
.fields = (VMStateField []) { |
|
568 |
VMSTATE_STRUCT(common, PS2KbdState, 0, vmstate_ps2_common, PS2State), |
|
569 |
VMSTATE_INT32(scan_enabled, PS2KbdState), |
|
570 |
VMSTATE_INT32(translate, PS2KbdState), |
|
571 |
VMSTATE_INT32_V(scancode_set, PS2KbdState,3), |
|
572 |
VMSTATE_END_OF_LIST() |
|
573 |
} |
|
574 |
}; |
|
597 | 575 |
|
598 |
ps2_common_load (f, &s->common); |
|
599 |
qemu_get_8s(f, &s->mouse_status); |
|
600 |
qemu_get_8s(f, &s->mouse_resolution); |
|
601 |
qemu_get_8s(f, &s->mouse_sample_rate); |
|
602 |
qemu_get_8s(f, &s->mouse_wrap); |
|
603 |
qemu_get_8s(f, &s->mouse_type); |
|
604 |
qemu_get_8s(f, &s->mouse_detect_state); |
|
605 |
s->mouse_dx=qemu_get_be32(f); |
|
606 |
s->mouse_dy=qemu_get_be32(f); |
|
607 |
s->mouse_dz=qemu_get_be32(f); |
|
608 |
qemu_get_8s(f, &s->mouse_buttons); |
|
609 |
return 0; |
|
610 |
} |
|
576 |
static const VMStateDescription vmstate_ps2_mouse = { |
|
577 |
.name = "ps2mouse", |
|
578 |
.version_id = 2, |
|
579 |
.minimum_version_id = 2, |
|
580 |
.minimum_version_id_old = 2, |
|
581 |
.fields = (VMStateField []) { |
|
582 |
VMSTATE_STRUCT(common, PS2MouseState, 0, vmstate_ps2_common, PS2State), |
|
583 |
VMSTATE_UINT8(mouse_status, PS2MouseState), |
|
584 |
VMSTATE_UINT8(mouse_resolution, PS2MouseState), |
|
585 |
VMSTATE_UINT8(mouse_sample_rate, PS2MouseState), |
|
586 |
VMSTATE_UINT8(mouse_wrap, PS2MouseState), |
|
587 |
VMSTATE_UINT8(mouse_type, PS2MouseState), |
|
588 |
VMSTATE_UINT8(mouse_detect_state, PS2MouseState), |
|
589 |
VMSTATE_INT32(mouse_dx, PS2MouseState), |
|
590 |
VMSTATE_INT32(mouse_dy, PS2MouseState), |
|
591 |
VMSTATE_INT32(mouse_dz, PS2MouseState), |
|
592 |
VMSTATE_UINT8(mouse_buttons, PS2MouseState), |
|
593 |
VMSTATE_END_OF_LIST() |
|
594 |
} |
|
595 |
}; |
|
611 | 596 |
|
612 | 597 |
void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg) |
613 | 598 |
{ |
... | ... | |
617 | 602 |
s->common.update_arg = update_arg; |
618 | 603 |
s->scancode_set = 2; |
619 | 604 |
ps2_kbd_reset(s); |
620 |
register_savevm("ps2kbd", 0, 3, ps2_kbd_save, ps2_kbd_load, s);
|
|
605 |
vmstate_register(0, &vmstate_ps2_keyboard, s);
|
|
621 | 606 |
qemu_add_kbd_event_handler(ps2_put_keycode, s); |
622 | 607 |
qemu_register_reset(ps2_kbd_reset, s); |
623 | 608 |
return s; |
... | ... | |
630 | 615 |
s->common.update_irq = update_irq; |
631 | 616 |
s->common.update_arg = update_arg; |
632 | 617 |
ps2_mouse_reset(s); |
633 |
register_savevm("ps2mouse", 0, 2, ps2_mouse_save, ps2_mouse_load, s);
|
|
618 |
vmstate_register(0, &vmstate_ps2_mouse, s);
|
|
634 | 619 |
qemu_add_mouse_event_handler(ps2_mouse_event, s, 0, "QEMU PS/2 Mouse"); |
635 | 620 |
qemu_register_reset(ps2_mouse_reset, s); |
636 | 621 |
return s; |
Also available in: Unified diff