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 | } |