[PULL,2/5] ps2: correctly handle 'get/set scancode' command
diff mbox

Message ID 1475067272-11714-3-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann Sept. 28, 2016, 12:54 p.m. UTC
From: Hervé Poussineau <hpoussin@reactos.org>

When getting scancode, current scancode must be preceded from reply ack.
When setting scancode, we must reject invalid scancodes.

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
Message-id: 1473969987-5890-3-git-send-email-hpoussin@reactos.org
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/input/ps2.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Patch
diff mbox

diff --git a/hw/input/ps2.c b/hw/input/ps2.c
index 00a1792..2105e51 100644
--- a/hw/input/ps2.c
+++ b/hw/input/ps2.c
@@ -296,16 +296,18 @@  void ps2_write_keyboard(void *opaque, int val)
         break;
     case KBD_CMD_SCANCODE:
         if (val == 0) {
+            ps2_queue(&s->common, KBD_REPLY_ACK);
             if (s->scancode_set == 1)
                 ps2_put_keycode(s, 0x43);
             else if (s->scancode_set == 2)
                 ps2_put_keycode(s, 0x41);
             else if (s->scancode_set == 3)
                 ps2_put_keycode(s, 0x3f);
-        } else {
-            if (val >= 1 && val <= 3)
-                s->scancode_set = val;
+        } else if (val >= 1 && val <= 3) {
+            s->scancode_set = val;
             ps2_queue(&s->common, KBD_REPLY_ACK);
+        } else {
+            ps2_queue(&s->common, KBD_REPLY_RESEND);
         }
         s->common.write_cmd = -1;
         break;