Commit ef74679a810fe6858f625b9d52b68cc3fc61eb3d
Committed by
Anthony Liguori
1 parent
0bb05eaf
Initialize PS2 keyboard / mouse state on reset
Currently only common PS2 state is initialized, leaving keyboard and mouse specific state to contain stale values. Signed-off-by: Dinesh Subhraveti <dineshs@us.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
32 additions
and
6 deletions
hw/ps2.c
@@ -488,9 +488,8 @@ void ps2_write_mouse(void *opaque, int val) | @@ -488,9 +488,8 @@ void ps2_write_mouse(void *opaque, int val) | ||
488 | } | 488 | } |
489 | } | 489 | } |
490 | 490 | ||
491 | -static void ps2_reset(void *opaque) | 491 | +static void ps2_common_reset(PS2State *s) |
492 | { | 492 | { |
493 | - PS2State *s = (PS2State *)opaque; | ||
494 | PS2Queue *q; | 493 | PS2Queue *q; |
495 | s->write_cmd = -1; | 494 | s->write_cmd = -1; |
496 | q = &s->queue; | 495 | q = &s->queue; |
@@ -500,6 +499,33 @@ static void ps2_reset(void *opaque) | @@ -500,6 +499,33 @@ static void ps2_reset(void *opaque) | ||
500 | s->update_irq(s->update_arg, 0); | 499 | s->update_irq(s->update_arg, 0); |
501 | } | 500 | } |
502 | 501 | ||
502 | +static void ps2_kbd_reset(void *opaque) | ||
503 | +{ | ||
504 | + PS2KbdState *s = (PS2KbdState *) opaque; | ||
505 | + | ||
506 | + ps2_common_reset(&s->common); | ||
507 | + s->scan_enabled = 0; | ||
508 | + s->translate = 0; | ||
509 | + s->scancode_set = 0; | ||
510 | +} | ||
511 | + | ||
512 | +static void ps2_mouse_reset(void *opaque) | ||
513 | +{ | ||
514 | + PS2MouseState *s = (PS2MouseState *) opaque; | ||
515 | + | ||
516 | + ps2_common_reset(&s->common); | ||
517 | + s->mouse_status = 0; | ||
518 | + s->mouse_resolution = 0; | ||
519 | + s->mouse_sample_rate = 0; | ||
520 | + s->mouse_wrap = 0; | ||
521 | + s->mouse_type = 0; | ||
522 | + s->mouse_detect_state = 0; | ||
523 | + s->mouse_dx = 0; | ||
524 | + s->mouse_dy = 0; | ||
525 | + s->mouse_dz = 0; | ||
526 | + s->mouse_buttons = 0; | ||
527 | +} | ||
528 | + | ||
503 | static void ps2_common_save (QEMUFile *f, PS2State *s) | 529 | static void ps2_common_save (QEMUFile *f, PS2State *s) |
504 | { | 530 | { |
505 | qemu_put_be32 (f, s->write_cmd); | 531 | qemu_put_be32 (f, s->write_cmd); |
@@ -590,10 +616,10 @@ void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg) | @@ -590,10 +616,10 @@ void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg) | ||
590 | s->common.update_irq = update_irq; | 616 | s->common.update_irq = update_irq; |
591 | s->common.update_arg = update_arg; | 617 | s->common.update_arg = update_arg; |
592 | s->scancode_set = 2; | 618 | s->scancode_set = 2; |
593 | - ps2_reset(&s->common); | 619 | + ps2_kbd_reset(s); |
594 | register_savevm("ps2kbd", 0, 3, ps2_kbd_save, ps2_kbd_load, s); | 620 | register_savevm("ps2kbd", 0, 3, ps2_kbd_save, ps2_kbd_load, s); |
595 | qemu_add_kbd_event_handler(ps2_put_keycode, s); | 621 | qemu_add_kbd_event_handler(ps2_put_keycode, s); |
596 | - qemu_register_reset(ps2_reset, &s->common); | 622 | + qemu_register_reset(ps2_kbd_reset, s); |
597 | return s; | 623 | return s; |
598 | } | 624 | } |
599 | 625 | ||
@@ -603,9 +629,9 @@ void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg) | @@ -603,9 +629,9 @@ void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg) | ||
603 | 629 | ||
604 | s->common.update_irq = update_irq; | 630 | s->common.update_irq = update_irq; |
605 | s->common.update_arg = update_arg; | 631 | s->common.update_arg = update_arg; |
606 | - ps2_reset(&s->common); | 632 | + ps2_mouse_reset(s); |
607 | register_savevm("ps2mouse", 0, 2, ps2_mouse_save, ps2_mouse_load, s); | 633 | register_savevm("ps2mouse", 0, 2, ps2_mouse_save, ps2_mouse_load, s); |
608 | qemu_add_mouse_event_handler(ps2_mouse_event, s, 0, "QEMU PS/2 Mouse"); | 634 | qemu_add_mouse_event_handler(ps2_mouse_event, s, 0, "QEMU PS/2 Mouse"); |
609 | - qemu_register_reset(ps2_reset, &s->common); | 635 | + qemu_register_reset(ps2_mouse_reset, s); |
610 | return s; | 636 | return s; |
611 | } | 637 | } |