Commit ef74679a810fe6858f625b9d52b68cc3fc61eb3d

Authored by Dinesh Subhraveti
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 }