/*
 * QEMU PS/2 keyboard/mouse emulation
 *
 * Copyright (c) 2003 Fabrice Bellard
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#include "qemu/osdep.h"
#include "qemu/log.h"
#include "hw/hw.h"
#include "hw/input/ps2.h"
#include "ui/console.h"
#include "ui/input.h"
#include "sysemu/sysemu.h"

#include "trace.h"

/* debug PC keyboard */
//#define DEBUG_KBD

/* debug PC keyboard : only mouse */
//#define DEBUG_MOUSE

/* Keyboard Commands */
#define KBD_CMD_SET_LEDS	0xED	/* Set keyboard leds */
#define KBD_CMD_ECHO     	0xEE
#define KBD_CMD_SCANCODE	0xF0	/* Get/set scancode set */
#define KBD_CMD_GET_ID 	        0xF2	/* get keyboard ID */
#define KBD_CMD_SET_RATE	0xF3	/* Set typematic rate */
#define KBD_CMD_ENABLE		0xF4	/* Enable scanning */
#define KBD_CMD_RESET_DISABLE	0xF5	/* reset and disable scanning */
#define KBD_CMD_RESET_ENABLE   	0xF6    /* reset and enable scanning */
#define KBD_CMD_RESET		0xFF	/* Reset */

/* Keyboard Replies */
#define KBD_REPLY_POR		0xAA	/* Power on reset */
#define KBD_REPLY_ID		0xAB	/* Keyboard ID */
#define KBD_REPLY_ACK		0xFA	/* Command ACK */
#define KBD_REPLY_RESEND	0xFE	/* Command NACK, send the cmd again */

/* Mouse Commands */
#define AUX_SET_SCALE11		0xE6	/* Set 1:1 scaling */
#define AUX_SET_SCALE21		0xE7	/* Set 2:1 scaling */
#define AUX_SET_RES		0xE8	/* Set resolution */
#define AUX_GET_SCALE		0xE9	/* Get scaling factor */
#define AUX_SET_STREAM		0xEA	/* Set stream mode */
#define AUX_POLL		0xEB	/* Poll */
#define AUX_RESET_WRAP		0xEC	/* Reset wrap mode */
#define AUX_SET_WRAP		0xEE	/* Set wrap mode */
#define AUX_SET_REMOTE		0xF0	/* Set remote mode */
#define AUX_GET_TYPE		0xF2	/* Get type */
#define AUX_SET_SAMPLE		0xF3	/* Set sample rate */
#define AUX_ENABLE_DEV		0xF4	/* Enable aux device */
#define AUX_DISABLE_DEV		0xF5	/* Disable aux device */
#define AUX_SET_DEFAULT		0xF6
#define AUX_RESET		0xFF	/* Reset aux device */
#define AUX_ACK			0xFA	/* Command byte ACK. */

#define MOUSE_STATUS_REMOTE     0x40
#define MOUSE_STATUS_ENABLED    0x20
#define MOUSE_STATUS_SCALE21    0x10

#define PS2_QUEUE_SIZE 16  /* Buffer size required by PS/2 protocol */

typedef struct {
    /* Keep the data array 256 bytes long, which compatibility
     with older qemu versions. */
    uint8_t data[256];
    int rptr, wptr, count;
} PS2Queue;

typedef struct {
    PS2Queue queue;
    int32_t write_cmd;
    void (*update_irq)(void *, int);
    void *update_arg;
} PS2State;

typedef struct {
    PS2State common;
    int scan_enabled;
    int translate;
    int scancode_set; /* 1=XT, 2=AT, 3=PS/2 */
    int ledstate;
    bool need_high_bit;
} PS2KbdState;

typedef struct {
    PS2State common;
    uint8_t mouse_status;
    uint8_t mouse_resolution;
    uint8_t mouse_sample_rate;
    uint8_t mouse_wrap;
    uint8_t mouse_type; /* 0 = PS2, 3 = IMPS/2, 4 = IMEX */
    uint8_t mouse_detect_state;
    int mouse_dx; /* current values, needed for 'poll' mode */
    int mouse_dy;
    int mouse_dz;
    uint8_t mouse_buttons;
} PS2MouseState;

/* Table to convert from QEMU codes to scancodes.  */
static const uint16_t qcode_to_keycode_set1[Q_KEY_CODE__MAX] = {
    [0 ... Q_KEY_CODE__MAX - 1] = 0,

    [Q_KEY_CODE_A] = 0x1e,
    [Q_KEY_CODE_B] = 0x30,
    [Q_KEY_CODE_C] = 0x2e,
    [Q_KEY_CODE_D] = 0x20,
    [Q_KEY_CODE_E] = 0x12,
    [Q_KEY_CODE_F] = 0x21,
    [Q_KEY_CODE_G] = 0x22,
    [Q_KEY_CODE_H] = 0x23,
    [Q_KEY_CODE_I] = 0x17,
    [Q_KEY_CODE_J] = 0x24,
    [Q_KEY_CODE_K] = 0x25,
    [Q_KEY_CODE_L] = 0x26,
    [Q_KEY_CODE_M] = 0x32,
    [Q_KEY_CODE_N] = 0x31,
    [Q_KEY_CODE_O] = 0x18,
    [Q_KEY_CODE_P] = 0x19,
    [Q_KEY_CODE_Q] = 0x10,
    [Q_KEY_CODE_R] = 0x13,
    [Q_KEY_CODE_S] = 0x1f,
    [Q_KEY_CODE_T] = 0x14,
    [Q_KEY_CODE_U] = 0x16,
    [Q_KEY_CODE_V] = 0x2f,
    [Q_KEY_CODE_W] = 0x11,
    [Q_KEY_CODE_X] = 0x2d,
    [Q_KEY_CODE_Y] = 0x15,
    [Q_KEY_CODE_Z] = 0x2c,
    [Q_KEY_CODE_0] = 0x0b,
    [Q_KEY_CODE_1] = 0x02,
    [Q_KEY_CODE_2] = 0x03,
    [Q_KEY_CODE_3] = 0x04,
    [Q_KEY_CODE_4] = 0x05,
    [Q_KEY_CODE_5] = 0x06,
    [Q_KEY_CODE_6] = 0x07,
    [Q_KEY_CODE_7] = 0x08,
    [Q_KEY_CODE_8] = 0x09,
    [Q_KEY_CODE_9] = 0x0a,
    [Q_KEY_CODE_GRAVE_ACCENT] = 0x29,
    [Q_KEY_CODE_MINUS] = 0x0c,
    [Q_KEY_CODE_EQUAL] = 0x0d,
    [Q_KEY_CODE_BACKSLASH] = 0x2b,
    [Q_KEY_CODE_BACKSPACE] = 0x0e,
    [Q_KEY_CODE_SPC] = 0x39,
    [Q_KEY_CODE_TAB] = 0x0f,
    [Q_KEY_CODE_CAPS_LOCK] = 0x3a,
    [Q_KEY_CODE_SHIFT] = 0x2a,
    [Q_KEY_CODE_CTRL] = 0x1d,
    [Q_KEY_CODE_META_L] = 0xe05b,
    [Q_KEY_CODE_ALT] = 0x38,
    [Q_KEY_CODE_SHIFT_R] = 0x36,
    [Q_KEY_CODE_CTRL_R] = 0xe01d,
    [Q_KEY_CODE_META_R] = 0xe05c,
    [Q_KEY_CODE_ALT_R] = 0xe038,
    [Q_KEY_CODE_MENU] = 0xe05d,
    [Q_KEY_CODE_RET] = 0x1c,
    [Q_KEY_CODE_ESC] = 0x01,
    [Q_KEY_CODE_F1] = 0x3b,
    [Q_KEY_CODE_F2] = 0x3c,
    [Q_KEY_CODE_F3] = 0x3d,
    [Q_KEY_CODE_F4] = 0x3e,
    [Q_KEY_CODE_F5] = 0x3f,
    [Q_KEY_CODE_F6] = 0x40,
    [Q_KEY_CODE_F7] = 0x41,
    [Q_KEY_CODE_F8] = 0x42,
    [Q_KEY_CODE_F9] = 0x43,
    [Q_KEY_CODE_F10] = 0x44,
    [Q_KEY_CODE_F11] = 0x57,
    [Q_KEY_CODE_F12] = 0x58,
    /* special handling for Q_KEY_CODE_PRINT */
    [Q_KEY_CODE_SCROLL_LOCK] = 0x46,
    /* special handling for Q_KEY_CODE_PAUSE */
    [Q_KEY_CODE_BRACKET_LEFT] = 0x1a,
    [Q_KEY_CODE_INSERT] = 0xe052,
    [Q_KEY_CODE_HOME] = 0xe047,
    [Q_KEY_CODE_PGUP] = 0xe049,
    [Q_KEY_CODE_DELETE] = 0xe053,
    [Q_KEY_CODE_END] = 0xe04f,
    [Q_KEY_CODE_PGDN] = 0xe051,
    [Q_KEY_CODE_UP] = 0xe048,
    [Q_KEY_CODE_LEFT] = 0xe04b,
    [Q_KEY_CODE_DOWN] = 0xe050,
    [Q_KEY_CODE_RIGHT] = 0xe04d,
    [Q_KEY_CODE_NUM_LOCK] = 0x45,
    [Q_KEY_CODE_KP_DIVIDE] = 0xe035,
    [Q_KEY_CODE_KP_MULTIPLY] = 0x37,
    [Q_KEY_CODE_KP_SUBTRACT] = 0x4a,
    [Q_KEY_CODE_KP_ADD] = 0x4e,
    [Q_KEY_CODE_KP_ENTER] = 0xe01c,
    [Q_KEY_CODE_KP_DECIMAL] = 0x53,
    [Q_KEY_CODE_KP_0] = 0x52,
    [Q_KEY_CODE_KP_1] = 0x4f,
    [Q_KEY_CODE_KP_2] = 0x50,
    [Q_KEY_CODE_KP_3] = 0x51,
    [Q_KEY_CODE_KP_4] = 0x4b,
    [Q_KEY_CODE_KP_5] = 0x4c,
    [Q_KEY_CODE_KP_6] = 0x4d,
    [Q_KEY_CODE_KP_7] = 0x47,
    [Q_KEY_CODE_KP_8] = 0x48,
    [Q_KEY_CODE_KP_9] = 0x49,
    [Q_KEY_CODE_BRACKET_RIGHT] = 0x1b,
    [Q_KEY_CODE_SEMICOLON] = 0x27,
    [Q_KEY_CODE_APOSTROPHE] = 0x28,
    [Q_KEY_CODE_COMMA] = 0x33,
    [Q_KEY_CODE_DOT] = 0x34,
    [Q_KEY_CODE_SLASH] = 0x35,

#if 0
    [Q_KEY_CODE_POWER] = 0x0e5e,
    [Q_KEY_CODE_SLEEP] = 0x0e5f,
    [Q_KEY_CODE_WAKE] = 0x0e63,

    [Q_KEY_CODE_AUDIONEXT] = 0xe019,
    [Q_KEY_CODE_AUDIOPREV] = 0xe010,
    [Q_KEY_CODE_AUDIOSTOP] = 0xe024,
    [Q_KEY_CODE_AUDIOPLAY] = 0xe022,
    [Q_KEY_CODE_AUDIOMUTE] = 0xe020,
    [Q_KEY_CODE_VOLUMEUP] = 0xe030,
    [Q_KEY_CODE_VOLUMEDOWN] = 0xe02e,
    [Q_KEY_CODE_MEDIASELECT] = 0xe06d,
    [Q_KEY_CODE_MAIL] = 0xe06c,
    [Q_KEY_CODE_CALCULATOR] = 0xe021,
    [Q_KEY_CODE_COMPUTER] = 0xe06b,
    [Q_KEY_CODE_AC_SEARCH] = 0xe065,
    [Q_KEY_CODE_AC_HOME] = 0xe032,
    [Q_KEY_CODE_AC_BACK] = 0xe06a,
    [Q_KEY_CODE_AC_FORWARD] = 0xe069,
    [Q_KEY_CODE_AC_STOP] = 0xe068,
    [Q_KEY_CODE_AC_REFRESH] = 0xe067,
    [Q_KEY_CODE_AC_BOOKMARKS] = 0xe066,
#endif

    [Q_KEY_CODE_ASTERISK] = 0x37,
    [Q_KEY_CODE_LESS] = 0x56,
    [Q_KEY_CODE_RO] = 0x73,
    [Q_KEY_CODE_KP_COMMA] = 0x7e,
};

static const uint16_t qcode_to_keycode_set2[Q_KEY_CODE__MAX] = {
    [0 ... Q_KEY_CODE__MAX - 1] = 0,

    [Q_KEY_CODE_A] = 0x1c,
    [Q_KEY_CODE_B] = 0x32,
    [Q_KEY_CODE_C] = 0x21,
    [Q_KEY_CODE_D] = 0x23,
    [Q_KEY_CODE_E] = 0x24,
    [Q_KEY_CODE_F] = 0x2b,
    [Q_KEY_CODE_G] = 0x34,
    [Q_KEY_CODE_H] = 0x33,
    [Q_KEY_CODE_I] = 0x43,
    [Q_KEY_CODE_J] = 0x3b,
    [Q_KEY_CODE_K] = 0x42,
    [Q_KEY_CODE_L] = 0x4b,
    [Q_KEY_CODE_M] = 0x3a,
    [Q_KEY_CODE_N] = 0x31,
    [Q_KEY_CODE_O] = 0x44,
    [Q_KEY_CODE_P] = 0x4d,
    [Q_KEY_CODE_Q] = 0x15,
    [Q_KEY_CODE_R] = 0x2d,
    [Q_KEY_CODE_S] = 0x1b,
    [Q_KEY_CODE_T] = 0x2c,
    [Q_KEY_CODE_U] = 0x3c,
    [Q_KEY_CODE_V] = 0x2a,
    [Q_KEY_CODE_W] = 0x1d,
    [Q_KEY_CODE_X] = 0x22,
    [Q_KEY_CODE_Y] = 0x35,
    [Q_KEY_CODE_Z] = 0x1a,
    [Q_KEY_CODE_0] = 0x45,
    [Q_KEY_CODE_1] = 0x16,
    [Q_KEY_CODE_2] = 0x1e,
    [Q_KEY_CODE_3] = 0x26,
    [Q_KEY_CODE_4] = 0x25,
    [Q_KEY_CODE_5] = 0x2e,
    [Q_KEY_CODE_6] = 0x36,
    [Q_KEY_CODE_7] = 0x3d,
    [Q_KEY_CODE_8] = 0x3e,
    [Q_KEY_CODE_9] = 0x46,
    [Q_KEY_CODE_GRAVE_ACCENT] = 0x0e,
    [Q_KEY_CODE_MINUS] = 0x4e,
    [Q_KEY_CODE_EQUAL] = 0x55,
    [Q_KEY_CODE_BACKSLASH] = 0x5d,
    [Q_KEY_CODE_BACKSPACE] = 0x66,
    [Q_KEY_CODE_SPC] = 0x29,
    [Q_KEY_CODE_TAB] = 0x0d,
    [Q_KEY_CODE_CAPS_LOCK] = 0x58,
    [Q_KEY_CODE_SHIFT] = 0x12,
    [Q_KEY_CODE_CTRL] = 0x14,
    [Q_KEY_CODE_META_L] = 0xe01f,
    [Q_KEY_CODE_ALT] = 0x11,
    [Q_KEY_CODE_SHIFT_R] = 0x59,
    [Q_KEY_CODE_CTRL_R] = 0xe014,
    [Q_KEY_CODE_META_R] = 0xe027,
    [Q_KEY_CODE_ALT_R] = 0xe011,
    [Q_KEY_CODE_MENU] = 0xe02f,
    [Q_KEY_CODE_RET] = 0x5a,
    [Q_KEY_CODE_ESC] = 0x76,
    [Q_KEY_CODE_F1] = 0x05,
    [Q_KEY_CODE_F2] = 0x06,
    [Q_KEY_CODE_F3] = 0x04,
    [Q_KEY_CODE_F4] = 0x0c,
    [Q_KEY_CODE_F5] = 0x03,
    [Q_KEY_CODE_F6] = 0x0b,
    [Q_KEY_CODE_F7] = 0x83,
    [Q_KEY_CODE_F8] = 0x0a,
    [Q_KEY_CODE_F9] = 0x01,
    [Q_KEY_CODE_F10] = 0x09,
    [Q_KEY_CODE_F11] = 0x78,
    [Q_KEY_CODE_F12] = 0x07,
    /* special handling for Q_KEY_CODE_PRINT */
    [Q_KEY_CODE_SCROLL_LOCK] = 0x7e,
    /* special handling for Q_KEY_CODE_PAUSE */
    [Q_KEY_CODE_BRACKET_LEFT] = 0x54,
    [Q_KEY_CODE_INSERT] = 0xe070,
    [Q_KEY_CODE_HOME] = 0xe06c,
    [Q_KEY_CODE_PGUP] = 0xe07d,
    [Q_KEY_CODE_DELETE] = 0xe071,
    [Q_KEY_CODE_END] = 0xe069,
    [Q_KEY_CODE_PGDN] = 0xe07a,
    [Q_KEY_CODE_UP] = 0xe075,
    [Q_KEY_CODE_LEFT] = 0xe06b,
    [Q_KEY_CODE_DOWN] = 0xe072,
    [Q_KEY_CODE_RIGHT] = 0xe074,
    [Q_KEY_CODE_NUM_LOCK] = 0x77,
    [Q_KEY_CODE_KP_DIVIDE] = 0xe04a,
    [Q_KEY_CODE_KP_MULTIPLY] = 0x7c,
    [Q_KEY_CODE_KP_SUBTRACT] = 0x7b,
    [Q_KEY_CODE_KP_ADD] = 0x79,
    [Q_KEY_CODE_KP_ENTER] = 0xe05a,
    [Q_KEY_CODE_KP_DECIMAL] = 0x71,
    [Q_KEY_CODE_KP_0] = 0x70,
    [Q_KEY_CODE_KP_1] = 0x69,
    [Q_KEY_CODE_KP_2] = 0x72,
    [Q_KEY_CODE_KP_3] = 0x7a,
    [Q_KEY_CODE_KP_4] = 0x6b,
    [Q_KEY_CODE_KP_5] = 0x73,
    [Q_KEY_CODE_KP_6] = 0x74,
    [Q_KEY_CODE_KP_7] = 0x6c,
    [Q_KEY_CODE_KP_8] = 0x75,
    [Q_KEY_CODE_KP_9] = 0x7d,
    [Q_KEY_CODE_BRACKET_RIGHT] = 0x5b,
    [Q_KEY_CODE_SEMICOLON] = 0x4c,
    [Q_KEY_CODE_APOSTROPHE] = 0x52,
    [Q_KEY_CODE_COMMA] = 0x41,
    [Q_KEY_CODE_DOT] = 0x49,
    [Q_KEY_CODE_SLASH] = 0x4a,

#if 0
    [Q_KEY_CODE_POWER] = 0x0e37,
    [Q_KEY_CODE_SLEEP] = 0x0e3f,
    [Q_KEY_CODE_WAKE] = 0x0e5e,

    [Q_KEY_CODE_AUDIONEXT] = 0xe04d,
    [Q_KEY_CODE_AUDIOPREV] = 0xe015,
    [Q_KEY_CODE_AUDIOSTOP] = 0xe03b,
    [Q_KEY_CODE_AUDIOPLAY] = 0xe034,
    [Q_KEY_CODE_AUDIOMUTE] = 0xe023,
    [Q_KEY_CODE_VOLUMEUP] = 0xe032,
    [Q_KEY_CODE_VOLUMEDOWN] = 0xe021,
    [Q_KEY_CODE_MEDIASELECT] = 0xe050,
    [Q_KEY_CODE_MAIL] = 0xe048,
    [Q_KEY_CODE_CALCULATOR] = 0xe02b,
    [Q_KEY_CODE_COMPUTER] = 0xe040,
    [Q_KEY_CODE_AC_SEARCH] = 0xe010,
    [Q_KEY_CODE_AC_HOME] = 0xe03a,
    [Q_KEY_CODE_AC_BACK] = 0xe038,
    [Q_KEY_CODE_AC_FORWARD] = 0xe030,
    [Q_KEY_CODE_AC_STOP] = 0xe028,
    [Q_KEY_CODE_AC_REFRESH] = 0xe020,
    [Q_KEY_CODE_AC_BOOKMARKS] = 0xe018,
#endif

    [Q_KEY_CODE_ALTGR] = 0x08,
    [Q_KEY_CODE_ALTGR_R] = 0xe008,
    [Q_KEY_CODE_ASTERISK] = 0x7c,
    [Q_KEY_CODE_LESS] = 0x61,
    [Q_KEY_CODE_SYSRQ] = 0x7f,
    [Q_KEY_CODE_RO] = 0x51,
    [Q_KEY_CODE_KP_COMMA] = 0x6d,
};

static const uint16_t qcode_to_keycode_set3[Q_KEY_CODE__MAX] = {
    [0 ... Q_KEY_CODE__MAX - 1] = 0,

    [Q_KEY_CODE_A] = 0x1c,
    [Q_KEY_CODE_B] = 0x32,
    [Q_KEY_CODE_C] = 0x21,
    [Q_KEY_CODE_D] = 0x23,
    [Q_KEY_CODE_E] = 0x24,
    [Q_KEY_CODE_F] = 0x2b,
    [Q_KEY_CODE_G] = 0x34,
    [Q_KEY_CODE_H] = 0x33,
    [Q_KEY_CODE_I] = 0x43,
    [Q_KEY_CODE_J] = 0x3b,
    [Q_KEY_CODE_K] = 0x42,
    [Q_KEY_CODE_L] = 0x4b,
    [Q_KEY_CODE_M] = 0x3a,
    [Q_KEY_CODE_N] = 0x31,
    [Q_KEY_CODE_O] = 0x44,
    [Q_KEY_CODE_P] = 0x4d,
    [Q_KEY_CODE_Q] = 0x15,
    [Q_KEY_CODE_R] = 0x2d,
    [Q_KEY_CODE_S] = 0x1b,
    [Q_KEY_CODE_T] = 0x2c,
    [Q_KEY_CODE_U] = 0x3c,
    [Q_KEY_CODE_V] = 0x2a,
    [Q_KEY_CODE_W] = 0x1d,
    [Q_KEY_CODE_X] = 0x22,
    [Q_KEY_CODE_Y] = 0x35,
    [Q_KEY_CODE_Z] = 0x1a,
    [Q_KEY_CODE_0] = 0x45,
    [Q_KEY_CODE_1] = 0x16,
    [Q_KEY_CODE_2] = 0x1e,
    [Q_KEY_CODE_3] = 0x26,
    [Q_KEY_CODE_4] = 0x25,
    [Q_KEY_CODE_5] = 0x2e,
    [Q_KEY_CODE_6] = 0x36,
    [Q_KEY_CODE_7] = 0x3d,
    [Q_KEY_CODE_8] = 0x3e,
    [Q_KEY_CODE_9] = 0x46,
    [Q_KEY_CODE_GRAVE_ACCENT] = 0x0e,
    [Q_KEY_CODE_MINUS] = 0x4e,
    [Q_KEY_CODE_EQUAL] = 0x55,
    [Q_KEY_CODE_BACKSLASH] = 0x5c,
    [Q_KEY_CODE_BACKSPACE] = 0x66,
    [Q_KEY_CODE_SPC] = 0x29,
    [Q_KEY_CODE_TAB] = 0x0d,
    [Q_KEY_CODE_CAPS_LOCK] = 0x14,
    [Q_KEY_CODE_SHIFT] = 0x12,
    [Q_KEY_CODE_CTRL] = 0x11,
    [Q_KEY_CODE_META_L] = 0x8b,
    [Q_KEY_CODE_ALT] = 0x19,
    [Q_KEY_CODE_SHIFT_R] = 0x59,
    [Q_KEY_CODE_CTRL_R] = 0x58,
    [Q_KEY_CODE_META_R] = 0x8c,
    [Q_KEY_CODE_ALT_R] = 0x39,
    [Q_KEY_CODE_MENU] = 0x8d,
    [Q_KEY_CODE_RET] = 0x5a,
    [Q_KEY_CODE_ESC] = 0x08,
    [Q_KEY_CODE_F1] = 0x07,
    [Q_KEY_CODE_F2] = 0x0f,
    [Q_KEY_CODE_F3] = 0x17,
    [Q_KEY_CODE_F4] = 0x1f,
    [Q_KEY_CODE_F5] = 0x27,
    [Q_KEY_CODE_F6] = 0x2f,
    [Q_KEY_CODE_F7] = 0x37,
    [Q_KEY_CODE_F8] = 0x3f,
    [Q_KEY_CODE_F9] = 0x47,
    [Q_KEY_CODE_F10] = 0x4f,
    [Q_KEY_CODE_F11] = 0x56,
    [Q_KEY_CODE_F12] = 0x5e,
    [Q_KEY_CODE_PRINT] = 0x57,
    [Q_KEY_CODE_SCROLL_LOCK] = 0x5f,
    [Q_KEY_CODE_PAUSE] = 0x62,
    [Q_KEY_CODE_BRACKET_LEFT] = 0x54,
    [Q_KEY_CODE_INSERT] = 0x67,
    [Q_KEY_CODE_HOME] = 0x6e,
    [Q_KEY_CODE_PGUP] = 0x6f,
    [Q_KEY_CODE_DELETE] = 0x64,
    [Q_KEY_CODE_END] = 0x65,
    [Q_KEY_CODE_PGDN] = 0x6d,
    [Q_KEY_CODE_UP] = 0x63,
    [Q_KEY_CODE_LEFT] = 0x61,
    [Q_KEY_CODE_DOWN] = 0x60,
    [Q_KEY_CODE_RIGHT] = 0x6a,
    [Q_KEY_CODE_NUM_LOCK] = 0x76,
    [Q_KEY_CODE_KP_DIVIDE] = 0x4a,
    [Q_KEY_CODE_KP_MULTIPLY] = 0x7e,
    [Q_KEY_CODE_KP_SUBTRACT] = 0x4e,
    [Q_KEY_CODE_KP_ADD] = 0x7c,
    [Q_KEY_CODE_KP_ENTER] = 0x79,
    [Q_KEY_CODE_KP_DECIMAL] = 0x71,
    [Q_KEY_CODE_KP_0] = 0x70,
    [Q_KEY_CODE_KP_1] = 0x69,
    [Q_KEY_CODE_KP_2] = 0x72,
    [Q_KEY_CODE_KP_3] = 0x7a,
    [Q_KEY_CODE_KP_4] = 0x6b,
    [Q_KEY_CODE_KP_5] = 0x73,
    [Q_KEY_CODE_KP_6] = 0x74,
    [Q_KEY_CODE_KP_7] = 0x6c,
    [Q_KEY_CODE_KP_8] = 0x75,
    [Q_KEY_CODE_KP_9] = 0x7d,
    [Q_KEY_CODE_BRACKET_RIGHT] = 0x5b,
    [Q_KEY_CODE_SEMICOLON] = 0x4c,
    [Q_KEY_CODE_APOSTROPHE] = 0x52,
    [Q_KEY_CODE_COMMA] = 0x41,
    [Q_KEY_CODE_DOT] = 0x49,
    [Q_KEY_CODE_SLASH] = 0x4a,
};

static uint8_t translate_table[256] = {
    0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58,
    0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59,
    0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a,
    0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b,
    0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c,
    0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d,
    0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e,
    0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f,
    0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60,
    0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61,
    0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e,
    0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76,
    0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b,
    0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f,
    0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45,
    0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54,
    0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87,
    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
    0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
    0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
    0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
};

void ps2_queue(void *opaque, int b)
{
    PS2State *s = (PS2State *)opaque;
    PS2Queue *q = &s->queue;

    if (q->count >= PS2_QUEUE_SIZE - 1)
        return;
    q->data[q->wptr] = b;
    if (++q->wptr == PS2_QUEUE_SIZE)
        q->wptr = 0;
    q->count++;
    s->update_irq(s->update_arg, 1);
}

/* keycode is the untranslated scancode in the current scancode set. */
static void ps2_put_keycode(void *opaque, int keycode)
{
    PS2KbdState *s = opaque;

    trace_ps2_put_keycode(opaque, keycode);
    qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);

    if (s->translate) {
        if (keycode == 0xf0) {
            s->need_high_bit = true;
        } else if (s->need_high_bit) {
            ps2_queue(&s->common, translate_table[keycode] | 0x80);
            s->need_high_bit = false;
        } else {
            ps2_queue(&s->common, translate_table[keycode]);
        }
    } else {
        ps2_queue(&s->common, keycode);
    }
}

static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
                               InputEvent *evt)
{
    PS2KbdState *s = (PS2KbdState *)dev;
    InputKeyEvent *key = evt->u.key.data;
    int qcode;
    uint16_t keycode;

    qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
    assert(evt->type == INPUT_EVENT_KIND_KEY);
    qcode = qemu_input_key_value_to_qcode(key->key);

    if (s->scancode_set == 1) {
        if (qcode == Q_KEY_CODE_PAUSE) {
            if (key->down) {
                ps2_put_keycode(s, 0xe1);
                ps2_put_keycode(s, 0x1d);
                ps2_put_keycode(s, 0x45);
                ps2_put_keycode(s, 0x91);
                ps2_put_keycode(s, 0x9d);
                ps2_put_keycode(s, 0xc5);
            }
        } else if (qcode == Q_KEY_CODE_PRINT) {
            if (key->down) {
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0x2a);
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0x37);
            } else {
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0xb7);
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0xaa);
            }
        } else {
            keycode = qcode_to_keycode_set1[qcode];
            if (keycode) {
                if (keycode & 0xff00) {
                    ps2_put_keycode(s, keycode >> 8);
                }
                if (!key->down) {
                    keycode |= 0x80;
                }
                ps2_put_keycode(s, keycode & 0xff);
            } else {
                qemu_log_mask(LOG_UNIMP,
                              "ps2: ignoring key with qcode %d\n", qcode);
            }
        }
    } else if (s->scancode_set == 2) {
        if (qcode == Q_KEY_CODE_PAUSE) {
            if (key->down) {
                ps2_put_keycode(s, 0xe1);
                ps2_put_keycode(s, 0x14);
                ps2_put_keycode(s, 0x77);
                ps2_put_keycode(s, 0xe1);
                ps2_put_keycode(s, 0xf0);
                ps2_put_keycode(s, 0x14);
                ps2_put_keycode(s, 0xf0);
                ps2_put_keycode(s, 0x77);
            }
        } else if (qcode == Q_KEY_CODE_PRINT) {
            if (key->down) {
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0x12);
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0x7c);
            } else {
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0xf0);
                ps2_put_keycode(s, 0x7c);
                ps2_put_keycode(s, 0xe0);
                ps2_put_keycode(s, 0xf0);
                ps2_put_keycode(s, 0x12);
            }
        } else {
            keycode = qcode_to_keycode_set2[qcode];
            if (keycode) {
                if (keycode & 0xff00) {
                    ps2_put_keycode(s, keycode >> 8);
                }
                if (!key->down) {
                    ps2_put_keycode(s, 0xf0);
                }
                ps2_put_keycode(s, keycode & 0xff);
            } else {
                qemu_log_mask(LOG_UNIMP,
                              "ps2: ignoring key with qcode %d\n", qcode);
            }
        }
    } else if (s->scancode_set == 3) {
        keycode = qcode_to_keycode_set3[qcode];
        if (keycode) {
            /* FIXME: break code should be configured on a key by key basis */
            if (!key->down) {
                ps2_put_keycode(s, 0xf0);
            }
            ps2_put_keycode(s, keycode);
        } else {
            qemu_log_mask(LOG_UNIMP,
                          "ps2: ignoring key with qcode %d\n", qcode);
        }
    }
}

uint32_t ps2_read_data(void *opaque)
{
    PS2State *s = (PS2State *)opaque;
    PS2Queue *q;
    int val, index;

    trace_ps2_read_data(opaque);
    q = &s->queue;
    if (q->count == 0) {
        /* NOTE: if no data left, we return the last keyboard one
           (needed for EMM386) */
        /* XXX: need a timer to do things correctly */
        index = q->rptr - 1;
        if (index < 0)
            index = PS2_QUEUE_SIZE - 1;
        val = q->data[index];
    } else {
        val = q->data[q->rptr];
        if (++q->rptr == PS2_QUEUE_SIZE)
            q->rptr = 0;
        q->count--;
        /* reading deasserts IRQ */
        s->update_irq(s->update_arg, 0);
        /* reassert IRQs if data left */
        s->update_irq(s->update_arg, q->count != 0);
    }
    return val;
}

static void ps2_set_ledstate(PS2KbdState *s, int ledstate)
{
    trace_ps2_set_ledstate(s, ledstate);
    s->ledstate = ledstate;
    kbd_put_ledstate(ledstate);
}

static void ps2_reset_keyboard(PS2KbdState *s)
{
    trace_ps2_reset_keyboard(s);
    s->scan_enabled = 1;
    s->scancode_set = 2;
    ps2_set_ledstate(s, 0);
}

void ps2_write_keyboard(void *opaque, int val)
{
    PS2KbdState *s = (PS2KbdState *)opaque;

    trace_ps2_write_keyboard(opaque, val);
    switch(s->common.write_cmd) {
    default:
    case -1:
        switch(val) {
        case 0x00:
            ps2_queue(&s->common, KBD_REPLY_ACK);
            break;
        case 0x05:
            ps2_queue(&s->common, KBD_REPLY_RESEND);
            break;
        case KBD_CMD_GET_ID:
            ps2_queue(&s->common, KBD_REPLY_ACK);
            /* We emulate a MF2 AT keyboard here */
            ps2_queue(&s->common, KBD_REPLY_ID);
            if (s->translate)
                ps2_queue(&s->common, 0x41);
            else
                ps2_queue(&s->common, 0x83);
            break;
        case KBD_CMD_ECHO:
            ps2_queue(&s->common, KBD_CMD_ECHO);
            break;
        case KBD_CMD_ENABLE:
            s->scan_enabled = 1;
            ps2_queue(&s->common, KBD_REPLY_ACK);
            break;
        case KBD_CMD_SCANCODE:
        case KBD_CMD_SET_LEDS:
        case KBD_CMD_SET_RATE:
            s->common.write_cmd = val;
            ps2_queue(&s->common, KBD_REPLY_ACK);
            break;
        case KBD_CMD_RESET_DISABLE:
            ps2_reset_keyboard(s);
            s->scan_enabled = 0;
            ps2_queue(&s->common, KBD_REPLY_ACK);
            break;
        case KBD_CMD_RESET_ENABLE:
            ps2_reset_keyboard(s);
            s->scan_enabled = 1;
            ps2_queue(&s->common, KBD_REPLY_ACK);
            break;
        case KBD_CMD_RESET:
            ps2_reset_keyboard(s);
            ps2_queue(&s->common, KBD_REPLY_ACK);
            ps2_queue(&s->common, KBD_REPLY_POR);
            break;
        default:
            ps2_queue(&s->common, KBD_REPLY_RESEND);
            break;
        }
        break;
    case KBD_CMD_SCANCODE:
        if (val == 0) {
            ps2_queue(&s->common, KBD_REPLY_ACK);
            ps2_put_keycode(s, s->scancode_set);
        } 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;
    case KBD_CMD_SET_LEDS:
        ps2_set_ledstate(s, val);
        ps2_queue(&s->common, KBD_REPLY_ACK);
        s->common.write_cmd = -1;
        break;
    case KBD_CMD_SET_RATE:
        ps2_queue(&s->common, KBD_REPLY_ACK);
        s->common.write_cmd = -1;
        break;
    }
}

/* Set the scancode translation mode.
   0 = raw scancodes.
   1 = translated scancodes (used by qemu internally).  */

void ps2_keyboard_set_translation(void *opaque, int mode)
{
    PS2KbdState *s = (PS2KbdState *)opaque;
    trace_ps2_keyboard_set_translation(opaque, mode);
    s->translate = mode;
}

static void ps2_mouse_send_packet(PS2MouseState *s)
{
    unsigned int b;
    int dx1, dy1, dz1;

    dx1 = s->mouse_dx;
    dy1 = s->mouse_dy;
    dz1 = s->mouse_dz;
    /* XXX: increase range to 8 bits ? */
    if (dx1 > 127)
        dx1 = 127;
    else if (dx1 < -127)
        dx1 = -127;
    if (dy1 > 127)
        dy1 = 127;
    else if (dy1 < -127)
        dy1 = -127;
    b = 0x08 | ((dx1 < 0) << 4) | ((dy1 < 0) << 5) | (s->mouse_buttons & 0x07);
    ps2_queue(&s->common, b);
    ps2_queue(&s->common, dx1 & 0xff);
    ps2_queue(&s->common, dy1 & 0xff);
    /* extra byte for IMPS/2 or IMEX */
    switch(s->mouse_type) {
    default:
        break;
    case 3:
        if (dz1 > 127)
            dz1 = 127;
        else if (dz1 < -127)
                dz1 = -127;
        ps2_queue(&s->common, dz1 & 0xff);
        break;
    case 4:
        if (dz1 > 7)
            dz1 = 7;
        else if (dz1 < -7)
            dz1 = -7;
        b = (dz1 & 0x0f) | ((s->mouse_buttons & 0x18) << 1);
        ps2_queue(&s->common, b);
        break;
    }

    trace_ps2_mouse_send_packet(s, dx1, dy1, dz1, b);
    /* update deltas */
    s->mouse_dx -= dx1;
    s->mouse_dy -= dy1;
    s->mouse_dz -= dz1;
}

static void ps2_mouse_event(DeviceState *dev, QemuConsole *src,
                            InputEvent *evt)
{
    static const int bmap[INPUT_BUTTON__MAX] = {
        [INPUT_BUTTON_LEFT]   = MOUSE_EVENT_LBUTTON,
        [INPUT_BUTTON_MIDDLE] = MOUSE_EVENT_MBUTTON,
        [INPUT_BUTTON_RIGHT]  = MOUSE_EVENT_RBUTTON,
    };
    PS2MouseState *s = (PS2MouseState *)dev;
    InputMoveEvent *move;
    InputBtnEvent *btn;

    /* check if deltas are recorded when disabled */
    if (!(s->mouse_status & MOUSE_STATUS_ENABLED))
        return;

    switch (evt->type) {
    case INPUT_EVENT_KIND_REL:
        move = evt->u.rel.data;
        if (move->axis == INPUT_AXIS_X) {
            s->mouse_dx += move->value;
        } else if (move->axis == INPUT_AXIS_Y) {
            s->mouse_dy -= move->value;
        }
        break;

    case INPUT_EVENT_KIND_BTN:
        btn = evt->u.btn.data;
        if (btn->down) {
            s->mouse_buttons |= bmap[btn->button];
            if (btn->button == INPUT_BUTTON_WHEEL_UP) {
                s->mouse_dz--;
            } else if (btn->button == INPUT_BUTTON_WHEEL_DOWN) {
                s->mouse_dz++;
            }
        } else {
            s->mouse_buttons &= ~bmap[btn->button];
        }
        break;

    default:
        /* keep gcc happy */
        break;
    }
}

static void ps2_mouse_sync(DeviceState *dev)
{
    PS2MouseState *s = (PS2MouseState *)dev;

    if (s->mouse_buttons) {
        qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
    }
    if (!(s->mouse_status & MOUSE_STATUS_REMOTE)) {
        while (s->common.queue.count < PS2_QUEUE_SIZE - 4) {
            /* if not remote, send event. Multiple events are sent if
               too big deltas */
            ps2_mouse_send_packet(s);
            if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0)
                break;
        }
    }
}

void ps2_mouse_fake_event(void *opaque)
{
    PS2MouseState *s = opaque;
    trace_ps2_mouse_fake_event(opaque);
    s->mouse_dx++;
    ps2_mouse_sync(opaque);
}

void ps2_write_mouse(void *opaque, int val)
{
    PS2MouseState *s = (PS2MouseState *)opaque;

    trace_ps2_write_mouse(opaque, val);
#ifdef DEBUG_MOUSE
    printf("kbd: write mouse 0x%02x\n", val);
#endif
    switch(s->common.write_cmd) {
    default:
    case -1:
        /* mouse command */
        if (s->mouse_wrap) {
            if (val == AUX_RESET_WRAP) {
                s->mouse_wrap = 0;
                ps2_queue(&s->common, AUX_ACK);
                return;
            } else if (val != AUX_RESET) {
                ps2_queue(&s->common, val);
                return;
            }
        }
        switch(val) {
        case AUX_SET_SCALE11:
            s->mouse_status &= ~MOUSE_STATUS_SCALE21;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_SET_SCALE21:
            s->mouse_status |= MOUSE_STATUS_SCALE21;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_SET_STREAM:
            s->mouse_status &= ~MOUSE_STATUS_REMOTE;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_SET_WRAP:
            s->mouse_wrap = 1;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_SET_REMOTE:
            s->mouse_status |= MOUSE_STATUS_REMOTE;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_GET_TYPE:
            ps2_queue(&s->common, AUX_ACK);
            ps2_queue(&s->common, s->mouse_type);
            break;
        case AUX_SET_RES:
        case AUX_SET_SAMPLE:
            s->common.write_cmd = val;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_GET_SCALE:
            ps2_queue(&s->common, AUX_ACK);
            ps2_queue(&s->common, s->mouse_status);
            ps2_queue(&s->common, s->mouse_resolution);
            ps2_queue(&s->common, s->mouse_sample_rate);
            break;
        case AUX_POLL:
            ps2_queue(&s->common, AUX_ACK);
            ps2_mouse_send_packet(s);
            break;
        case AUX_ENABLE_DEV:
            s->mouse_status |= MOUSE_STATUS_ENABLED;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_DISABLE_DEV:
            s->mouse_status &= ~MOUSE_STATUS_ENABLED;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_SET_DEFAULT:
            s->mouse_sample_rate = 100;
            s->mouse_resolution = 2;
            s->mouse_status = 0;
            ps2_queue(&s->common, AUX_ACK);
            break;
        case AUX_RESET:
            s->mouse_sample_rate = 100;
            s->mouse_resolution = 2;
            s->mouse_status = 0;
            s->mouse_type = 0;
            ps2_queue(&s->common, AUX_ACK);
            ps2_queue(&s->common, 0xaa);
            ps2_queue(&s->common, s->mouse_type);
            break;
        default:
            break;
        }
        break;
    case AUX_SET_SAMPLE:
        s->mouse_sample_rate = val;
        /* detect IMPS/2 or IMEX */
        switch(s->mouse_detect_state) {
        default:
        case 0:
            if (val == 200)
                s->mouse_detect_state = 1;
            break;
        case 1:
            if (val == 100)
                s->mouse_detect_state = 2;
            else if (val == 200)
                s->mouse_detect_state = 3;
            else
                s->mouse_detect_state = 0;
            break;
        case 2:
            if (val == 80)
                s->mouse_type = 3; /* IMPS/2 */
            s->mouse_detect_state = 0;
            break;
        case 3:
            if (val == 80)
                s->mouse_type = 4; /* IMEX */
            s->mouse_detect_state = 0;
            break;
        }
        ps2_queue(&s->common, AUX_ACK);
        s->common.write_cmd = -1;
        break;
    case AUX_SET_RES:
        s->mouse_resolution = val;
        ps2_queue(&s->common, AUX_ACK);
        s->common.write_cmd = -1;
        break;
    }
}

static void ps2_common_reset(PS2State *s)
{
    PS2Queue *q;
    s->write_cmd = -1;
    q = &s->queue;
    q->rptr = 0;
    q->wptr = 0;
    q->count = 0;
    s->update_irq(s->update_arg, 0);
}

static void ps2_common_post_load(PS2State *s)
{
    PS2Queue *q = &s->queue;
    int size;
    int i;
    int tmp_data[PS2_QUEUE_SIZE];

    /* set the useful data buffer queue size, < PS2_QUEUE_SIZE */
    size = q->count > PS2_QUEUE_SIZE ? 0 : q->count;

    /* move the queue elements to the start of data array */
    if (size > 0) {
        for (i = 0; i < size; i++) {
            /* move the queue elements to the temporary buffer */
            tmp_data[i] = q->data[q->rptr];
            if (++q->rptr == 256) {
                q->rptr = 0;
            }
        }
        memcpy(q->data, tmp_data, size);
    }
    /* reset rptr/wptr/count */
    q->rptr = 0;
    q->wptr = size;
    q->count = size;
    s->update_irq(s->update_arg, q->count != 0);
}

static void ps2_kbd_reset(void *opaque)
{
    PS2KbdState *s = (PS2KbdState *) opaque;

    trace_ps2_kbd_reset(opaque);
    ps2_common_reset(&s->common);
    s->scan_enabled = 0;
    s->translate = 0;
    s->scancode_set = 2;
}

static void ps2_mouse_reset(void *opaque)
{
    PS2MouseState *s = (PS2MouseState *) opaque;

    trace_ps2_mouse_reset(opaque);
    ps2_common_reset(&s->common);
    s->mouse_status = 0;
    s->mouse_resolution = 0;
    s->mouse_sample_rate = 0;
    s->mouse_wrap = 0;
    s->mouse_type = 0;
    s->mouse_detect_state = 0;
    s->mouse_dx = 0;
    s->mouse_dy = 0;
    s->mouse_dz = 0;
    s->mouse_buttons = 0;
}

static const VMStateDescription vmstate_ps2_common = {
    .name = "PS2 Common State",
    .version_id = 3,
    .minimum_version_id = 2,
    .fields = (VMStateField[]) {
        VMSTATE_INT32(write_cmd, PS2State),
        VMSTATE_INT32(queue.rptr, PS2State),
        VMSTATE_INT32(queue.wptr, PS2State),
        VMSTATE_INT32(queue.count, PS2State),
        VMSTATE_BUFFER(queue.data, PS2State),
        VMSTATE_END_OF_LIST()
    }
};

static bool ps2_keyboard_ledstate_needed(void *opaque)
{
    PS2KbdState *s = opaque;

    return s->ledstate != 0; /* 0 is default state */
}

static int ps2_kbd_ledstate_post_load(void *opaque, int version_id)
{
    PS2KbdState *s = opaque;

    kbd_put_ledstate(s->ledstate);
    return 0;
}

static const VMStateDescription vmstate_ps2_keyboard_ledstate = {
    .name = "ps2kbd/ledstate",
    .version_id = 3,
    .minimum_version_id = 2,
    .post_load = ps2_kbd_ledstate_post_load,
    .needed = ps2_keyboard_ledstate_needed,
    .fields = (VMStateField[]) {
        VMSTATE_INT32(ledstate, PS2KbdState),
        VMSTATE_END_OF_LIST()
    }
};

static bool ps2_keyboard_need_high_bit_needed(void *opaque)
{
    PS2KbdState *s = opaque;
    return s->need_high_bit != 0; /* 0 is the usual state */
}

static const VMStateDescription vmstate_ps2_keyboard_need_high_bit = {
    .name = "ps2kbd/need_high_bit",
    .version_id = 1,
    .minimum_version_id = 1,
    .needed = ps2_keyboard_need_high_bit_needed,
    .fields = (VMStateField[]) {
        VMSTATE_BOOL(need_high_bit, PS2KbdState),
        VMSTATE_END_OF_LIST()
    }
};

static int ps2_kbd_post_load(void* opaque, int version_id)
{
    PS2KbdState *s = (PS2KbdState*)opaque;
    PS2State *ps2 = &s->common;

    if (version_id == 2)
        s->scancode_set=2;

    ps2_common_post_load(ps2);

    return 0;
}

static void ps2_kbd_pre_save(void *opaque)
{
    PS2KbdState *s = (PS2KbdState *)opaque;
    PS2State *ps2 = &s->common;

    ps2_common_post_load(ps2);
}

static const VMStateDescription vmstate_ps2_keyboard = {
    .name = "ps2kbd",
    .version_id = 3,
    .minimum_version_id = 2,
    .post_load = ps2_kbd_post_load,
    .pre_save = ps2_kbd_pre_save,
    .fields = (VMStateField[]) {
        VMSTATE_STRUCT(common, PS2KbdState, 0, vmstate_ps2_common, PS2State),
        VMSTATE_INT32(scan_enabled, PS2KbdState),
        VMSTATE_INT32(translate, PS2KbdState),
        VMSTATE_INT32_V(scancode_set, PS2KbdState,3),
        VMSTATE_END_OF_LIST()
    },
    .subsections = (const VMStateDescription*[]) {
        &vmstate_ps2_keyboard_ledstate,
        &vmstate_ps2_keyboard_need_high_bit,
        NULL
    }
};

static int ps2_mouse_post_load(void *opaque, int version_id)
{
    PS2MouseState *s = (PS2MouseState *)opaque;
    PS2State *ps2 = &s->common;

    ps2_common_post_load(ps2);

    return 0;
}

static void ps2_mouse_pre_save(void *opaque)
{
    PS2MouseState *s = (PS2MouseState *)opaque;
    PS2State *ps2 = &s->common;

    ps2_common_post_load(ps2);
}

static const VMStateDescription vmstate_ps2_mouse = {
    .name = "ps2mouse",
    .version_id = 2,
    .minimum_version_id = 2,
    .post_load = ps2_mouse_post_load,
    .pre_save = ps2_mouse_pre_save,
    .fields = (VMStateField[]) {
        VMSTATE_STRUCT(common, PS2MouseState, 0, vmstate_ps2_common, PS2State),
        VMSTATE_UINT8(mouse_status, PS2MouseState),
        VMSTATE_UINT8(mouse_resolution, PS2MouseState),
        VMSTATE_UINT8(mouse_sample_rate, PS2MouseState),
        VMSTATE_UINT8(mouse_wrap, PS2MouseState),
        VMSTATE_UINT8(mouse_type, PS2MouseState),
        VMSTATE_UINT8(mouse_detect_state, PS2MouseState),
        VMSTATE_INT32(mouse_dx, PS2MouseState),
        VMSTATE_INT32(mouse_dy, PS2MouseState),
        VMSTATE_INT32(mouse_dz, PS2MouseState),
        VMSTATE_UINT8(mouse_buttons, PS2MouseState),
        VMSTATE_END_OF_LIST()
    }
};

static QemuInputHandler ps2_keyboard_handler = {
    .name  = "QEMU PS/2 Keyboard",
    .mask  = INPUT_EVENT_MASK_KEY,
    .event = ps2_keyboard_event,
};

void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg)
{
    PS2KbdState *s = (PS2KbdState *)g_malloc0(sizeof(PS2KbdState));

    trace_ps2_kbd_init(s);
    s->common.update_irq = update_irq;
    s->common.update_arg = update_arg;
    s->scancode_set = 2;
    vmstate_register(NULL, 0, &vmstate_ps2_keyboard, s);
    qemu_input_handler_register((DeviceState *)s,
                                &ps2_keyboard_handler);
    qemu_register_reset(ps2_kbd_reset, s);
    return s;
}

static QemuInputHandler ps2_mouse_handler = {
    .name  = "QEMU PS/2 Mouse",
    .mask  = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_REL,
    .event = ps2_mouse_event,
    .sync  = ps2_mouse_sync,
};

void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
{
    PS2MouseState *s = (PS2MouseState *)g_malloc0(sizeof(PS2MouseState));

    trace_ps2_mouse_init(s);
    s->common.update_irq = update_irq;
    s->common.update_arg = update_arg;
    vmstate_register(NULL, 0, &vmstate_ps2_mouse, s);
    qemu_input_handler_register((DeviceState *)s,
                                &ps2_mouse_handler);
    qemu_register_reset(ps2_mouse_reset, s);
    return s;
}
