* [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches @ 2018-01-29 10:23 Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 1/7] input: add mouse side buttons to virtio input Gerd Hoffmann ` (7 more replies) 0 siblings, 8 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann The following changes since commit e607bbee553cfe73072870cef458cfa4e78133e2: Merge remote-tracking branch 'remotes/edgar/tags/edgar/xilinx-next-2018-01-26.for-upstream' into staging (2018-01-26 14:24:25 +0000) are available in the git repository at: git://git.kraxel.org/qemu tags/input-20180129-v2-pull-request for you to fetch changes up to ae6b06ab655b21c19b234ce3422f694d11a013e0: hw: convert virtio-input-hid device to keycodemapdb (2018-01-29 09:35:44 +0100) ---------------------------------------------------------------- input: switch devices to keycodemapdb, bugfixes. ---------------------------------------------------------------- Daniel P. Berrange (4): hw: convert ps2 device to keycodemapdb hw: convert the escc device to keycodemapdb ui: fix alphabetical ordering of keymaps hw: convert virtio-input-hid device to keycodemapdb Miika S (2): input: add mouse side buttons to virtio input input: virtio: don't send mouse wheel event twice Prasad J Pandit (1): ps2: check PS2Queue pointers in post_load routine Makefile | 6 +- include/ui/input.h | 18 +- hw/char/escc.c | 126 +------------ hw/input/ps2.c | 427 ++------------------------------------------ hw/input/virtio-input-hid.c | 144 ++------------- ui/input-keymap.c | 6 +- 6 files changed, 61 insertions(+), 666 deletions(-) -- 2.9.3 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 1/7] input: add mouse side buttons to virtio input 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann @ 2018-01-29 10:23 ` Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 2/7] input: virtio: don't send mouse wheel event twice Gerd Hoffmann ` (6 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Miika S, Gerd Hoffmann, Michael S. Tsirkin From: Miika S <miika9764@gmail.com> Signed-off-by: Miika S <miika9764@gmail.com> Message-Id: <20171222152531.1849-3-miika9764@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/input/virtio-input-hid.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index e78faec0b1..a5917c2754 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -147,6 +147,8 @@ static const unsigned int keymap_button[INPUT_BUTTON__MAX] = { [INPUT_BUTTON_MIDDLE] = BTN_MIDDLE, [INPUT_BUTTON_WHEEL_UP] = BTN_GEAR_UP, [INPUT_BUTTON_WHEEL_DOWN] = BTN_GEAR_DOWN, + [INPUT_BUTTON_SIDE] = BTN_SIDE, + [INPUT_BUTTON_EXTRA] = BTN_EXTRA, }; static const unsigned int axismap_rel[INPUT_AXIS__MAX] = { -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 2/7] input: virtio: don't send mouse wheel event twice 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 1/7] input: add mouse side buttons to virtio input Gerd Hoffmann @ 2018-01-29 10:23 ` Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 3/7] ps2: check PS2Queue pointers in post_load routine Gerd Hoffmann ` (5 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Miika S, Gerd Hoffmann, Michael S. Tsirkin From: Miika S <miika9764@gmail.com> On Linux, a mouse event is generated for both down and up when mouse wheel is used. This caused virtio_input_send() to be called twice each time the wheel was used. This commit adds a check for the button down state and only calls virtio_input_send() when it is true. Signed-off-by: Miika S <miika9764@gmail.com> Message-Id: <20171222152531.1849-4-miika9764@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/input/virtio-input-hid.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index a5917c2754..be054fd272 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -218,8 +218,10 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src, break; case INPUT_EVENT_KIND_BTN: btn = evt->u.btn.data; - if (vhid->wheel_axis && (btn->button == INPUT_BUTTON_WHEEL_UP || - btn->button == INPUT_BUTTON_WHEEL_DOWN)) { + if (vhid->wheel_axis && + (btn->button == INPUT_BUTTON_WHEEL_UP || + btn->button == INPUT_BUTTON_WHEEL_DOWN) && + btn->down) { event.type = cpu_to_le16(EV_REL); event.code = cpu_to_le16(REL_WHEEL); event.value = cpu_to_le32(btn->button == INPUT_BUTTON_WHEEL_UP -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 3/7] ps2: check PS2Queue pointers in post_load routine 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 1/7] input: add mouse side buttons to virtio input Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 2/7] input: virtio: don't send mouse wheel event twice Gerd Hoffmann @ 2018-01-29 10:23 ` Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 4/7] hw: convert ps2 device to keycodemapdb Gerd Hoffmann ` (4 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Prasad J Pandit, Gerd Hoffmann From: Prasad J Pandit <pjp@fedoraproject.org> During Qemu guest migration, a destination process invokes ps2 post_load function. In that, if 'rptr' and 'count' values were invalid, it could lead to OOB access or infinite loop issue. Add check to avoid it. Reported-by: Cyrille Chatras <cyrille.chatras@orange.com> Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org> Message-id: 20171116075155.22378-1-ppandit@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/input/ps2.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/hw/input/ps2.c b/hw/input/ps2.c index f388a23c8e..de171a28dd 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -1225,24 +1225,21 @@ static void ps2_common_reset(PS2State *s) static void ps2_common_post_load(PS2State *s) { PS2Queue *q = &s->queue; - int size; - int i; - int tmp_data[PS2_QUEUE_SIZE]; + uint8_t i, size; + uint8_t tmp_data[PS2_QUEUE_SIZE]; /* set the useful data buffer queue size, < PS2_QUEUE_SIZE */ - size = q->count > PS2_QUEUE_SIZE ? 0 : q->count; + size = (q->count < 0 || 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; - } + for (i = 0; i < size; i++) { + if (q->rptr < 0 || q->rptr >= sizeof(q->data)) { + q->rptr = 0; } - memcpy(q->data, tmp_data, size); + tmp_data[i] = q->data[q->rptr++]; } + memcpy(q->data, tmp_data, size); + /* reset rptr/wptr/count */ q->rptr = 0; q->wptr = size; -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 4/7] hw: convert ps2 device to keycodemapdb 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann ` (2 preceding siblings ...) 2018-01-29 10:23 ` [Qemu-devel] [PULL 3/7] ps2: check PS2Queue pointers in post_load routine Gerd Hoffmann @ 2018-01-29 10:23 ` Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 5/7] hw: convert the escc " Gerd Hoffmann ` (3 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Daniel P. Berrange, Gerd Hoffmann From: "Daniel P. Berrange" <berrange@redhat.com> Replace the qcode_to_keycode_set1, qcode_to_keycode_set2, and qcode_to_keycode_set3 tables with automatically generated tables. Missing entries in qcode_to_keycode_set1 now fixed: - Q_KEY_CODE_SYSRQ -> 0x54 - Q_KEY_CODE_PRINT -> 0x54 (NB ignored due to special case) - Q_KEY_CODE_AGAIN -> 0xe005 - Q_KEY_CODE_PROPS -> 0xe006 - Q_KEY_CODE_UNDO -> 0xe007 - Q_KEY_CODE_FRONT -> 0xe00c - Q_KEY_CODE_COPY -> 0xe078 - Q_KEY_CODE_OPEN -> 0x64 - Q_KEY_CODE_PASTE -> 0x65 - Q_KEY_CODE_CUT -> 0xe03c - Q_KEY_CODE_LF -> 0x5b - Q_KEY_CODE_HELP -> 0xe075 - Q_KEY_CODE_COMPOSE -> 0xe05d - Q_KEY_CODE_PAUSE -> 0xe046 - Q_KEY_CODE_KP_EQUALS -> 0x59 And some mistakes corrected: - Q_KEY_CODE_HIRAGANA was mapped to 0x70 (Katakanahiragana) instead of of 0x77 (Hirigana) - Q_KEY_CODE_MENU was incorrectly mapped to the compose scancode (0xe05d) and is now mapped to 0xe01e - Q_KEY_CODE_FIND was mapped to 0xe065 (Search) instead of to 0xe041 (Find) - Q_KEY_CODE_POWER, SLEEP & WAKE had 0x0e instead of 0xe0 as the prefix Missing entries in qcode_to_keycode_set2 now fixed: - Q_KEY_CODE_PRINT -> 0x7f (NB ignored due to special case) - Q_KEY_CODE_COMPOSE -> 0xe02f - Q_KEY_CODE_PAUSE -> 0xe077 - Q_KEY_CODE_KP_EQUALS -> 0x0f And some mistakes corrected: - Q_KEY_CODE_HIRAGANA was mapped to 0x13 (Katakanahiragana) instead of of 0x62 (Hirigana) - Q_KEY_CODE_MENU was incorrectly mapped to the compose scancode (0xe02f) and is now not mapped - Q_KEY_CODE_FIND was mapped to 0xe010 (Search) and is now not mapped. - Q_KEY_CODE_POWER, SLEEP & WAKE had 0x0e instead of 0xe0 as the prefix Missing entries in qcode_to_keycode_set3 now fixed: - Q_KEY_CODE_ASTERISK -> 0x7e - Q_KEY_CODE_SYSRQ -> 0x57 - Q_KEY_CODE_LESS -> 0x13 - Q_KEY_CODE_STOP -> 0x0a - Q_KEY_CODE_AGAIN -> 0x0b - Q_KEY_CODE_PROPS -> 0x0c - Q_KEY_CODE_UNDO -> 0x10 - Q_KEY_CODE_COPY -> 0x18 - Q_KEY_CODE_OPEN -> 0x20 - Q_KEY_CODE_PASTE -> 0x28 - Q_KEY_CODE_FIND -> 0x30 - Q_KEY_CODE_CUT -> 0x38 - Q_KEY_CODE_HELP -> 0x09 - Q_KEY_CODE_COMPOSE -> 0x8d - Q_KEY_CODE_AUDIONEXT -> 0x93 - Q_KEY_CODE_AUDIOPREV -> 0x94 - Q_KEY_CODE_AUDIOSTOP -> 0x98 - Q_KEY_CODE_AUDIOMUTE -> 0x9c - Q_KEY_CODE_VOLUMEUP -> 0x95 - Q_KEY_CODE_VOLUMEDOWN -> 0x9d - Q_KEY_CODE_CALCULATOR -> 0xa3 - Q_KEY_CODE_AC_HOME -> 0x97 And some mistakes corrected: - Q_KEY_CODE_MENU was incorrectly mapped to the compose scancode (0x8d) and is now 0x91 Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20180117164118.8510-2-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- Makefile | 3 + include/ui/input.h | 9 ++ hw/input/ps2.c | 406 +---------------------------------------------------- ui/input-keymap.c | 3 + 4 files changed, 22 insertions(+), 399 deletions(-) diff --git a/Makefile b/Makefile index af31e8981f..cd65eb4a80 100644 --- a/Makefile +++ b/Makefile @@ -234,6 +234,9 @@ KEYCODEMAP_CSV = $(SRC_PATH)/ui/keycodemapdb/data/keymaps.csv KEYCODEMAP_FILES = \ ui/input-keymap-atset1-to-qcode.c \ ui/input-keymap-linux-to-qcode.c \ + ui/input-keymap-qcode-to-atset1.c \ + ui/input-keymap-qcode-to-atset2.c \ + ui/input-keymap-qcode-to-atset3.c \ ui/input-keymap-qcode-to-qnum.c \ ui/input-keymap-qnum-to-qcode.c \ ui/input-keymap-qcode-to-linux.c \ diff --git a/include/ui/input.h b/include/ui/input.h index 05aab2db5c..cffeb1c1a0 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -74,6 +74,15 @@ extern const guint16 qemu_input_map_atset1_to_qcode[]; extern const guint qemu_input_map_linux_to_qcode_len; extern const guint16 qemu_input_map_linux_to_qcode[]; +extern const guint qemu_input_map_qcode_to_atset1_len; +extern const guint16 qemu_input_map_qcode_to_atset1[]; + +extern const guint qemu_input_map_qcode_to_atset2_len; +extern const guint16 qemu_input_map_qcode_to_atset2[]; + +extern const guint qemu_input_map_qcode_to_atset3_len; +extern const guint16 qemu_input_map_qcode_to_atset3[]; + extern const guint qemu_input_map_qcode_to_qnum_len; extern const guint16 qemu_input_map_qcode_to_qnum[]; diff --git a/hw/input/ps2.c b/hw/input/ps2.c index de171a28dd..06f5d2ac4a 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -124,401 +124,6 @@ typedef struct { 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, - - [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_FIND] = 0xe065, - [Q_KEY_CODE_AC_HOME] = 0xe032, - [Q_KEY_CODE_AC_BACK] = 0xe06a, - [Q_KEY_CODE_AC_FORWARD] = 0xe069, - [Q_KEY_CODE_STOP] = 0xe068, - [Q_KEY_CODE_AC_REFRESH] = 0xe067, - [Q_KEY_CODE_AC_BOOKMARKS] = 0xe066, - - [Q_KEY_CODE_ASTERISK] = 0x37, - [Q_KEY_CODE_LESS] = 0x56, - [Q_KEY_CODE_RO] = 0x73, - [Q_KEY_CODE_HIRAGANA] = 0x70, - [Q_KEY_CODE_HENKAN] = 0x79, - [Q_KEY_CODE_YEN] = 0x7d, - [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, - - [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_FIND] = 0xe010, - [Q_KEY_CODE_AC_HOME] = 0xe03a, - [Q_KEY_CODE_AC_BACK] = 0xe038, - [Q_KEY_CODE_AC_FORWARD] = 0xe030, - [Q_KEY_CODE_STOP] = 0xe028, - [Q_KEY_CODE_AC_REFRESH] = 0xe020, - [Q_KEY_CODE_AC_BOOKMARKS] = 0xe018, - - [Q_KEY_CODE_ASTERISK] = 0x7c, - [Q_KEY_CODE_LESS] = 0x61, - [Q_KEY_CODE_SYSRQ] = 0x7f, - [Q_KEY_CODE_RO] = 0x51, - [Q_KEY_CODE_HIRAGANA] = 0x13, - [Q_KEY_CODE_HENKAN] = 0x64, - [Q_KEY_CODE_YEN] = 0x6a, - [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, - - [Q_KEY_CODE_HIRAGANA] = 0x87, - [Q_KEY_CODE_HENKAN] = 0x86, - [Q_KEY_CODE_YEN] = 0x5d, -}; - static uint8_t translate_table[256] = { 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59, @@ -624,7 +229,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, PS2KbdState *s = (PS2KbdState *)dev; InputKeyEvent *key = evt->u.key.data; int qcode; - uint16_t keycode; + uint16_t keycode = 0; int mod; qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); @@ -706,7 +311,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, } } } else { - keycode = qcode_to_keycode_set1[qcode]; + if (qcode < qemu_input_map_qcode_to_atset1_len) + keycode = qemu_input_map_qcode_to_atset1[qcode]; if (keycode) { if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); @@ -799,7 +405,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, } } } else { - keycode = qcode_to_keycode_set2[qcode]; + if (qcode < qemu_input_map_qcode_to_atset2_len) + keycode = qemu_input_map_qcode_to_atset2[qcode]; if (keycode) { if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); @@ -814,7 +421,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, } } } else if (s->scancode_set == 3) { - keycode = qcode_to_keycode_set3[qcode]; + if (qcode < qemu_input_map_qcode_to_atset3_len) + keycode = qemu_input_map_qcode_to_atset3[qcode]; if (keycode) { /* FIXME: break code should be configured on a key by key basis */ if (!key->down) { diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 95b1e0cbfa..07be8f4415 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -7,6 +7,9 @@ #include "ui/input-keymap-atset1-to-qcode.c" #include "ui/input-keymap-linux-to-qcode.c" +#include "ui/input-keymap-qcode-to-atset1.c" +#include "ui/input-keymap-qcode-to-atset2.c" +#include "ui/input-keymap-qcode-to-atset3.c" #include "ui/input-keymap-qcode-to-qnum.c" #include "ui/input-keymap-qnum-to-qcode.c" #include "ui/input-keymap-qcode-to-linux.c" -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 5/7] hw: convert the escc device to keycodemapdb 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann ` (3 preceding siblings ...) 2018-01-29 10:23 ` [Qemu-devel] [PULL 4/7] hw: convert ps2 device to keycodemapdb Gerd Hoffmann @ 2018-01-29 10:23 ` Gerd Hoffmann 2022-03-31 10:03 ` Peter Maydell 2018-01-29 10:23 ` [Qemu-devel] [PULL 6/7] ui: fix alphabetical ordering of keymaps Gerd Hoffmann ` (2 subsequent siblings) 7 siblings, 1 reply; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Daniel P. Berrange, Gerd Hoffmann, Paolo Bonzini From: "Daniel P. Berrange" <berrange@redhat.com> Replace the qcode_to_keycode table with automatically generated tables. Missing entries in qcode_to_keycode now fixed: - Q_KEY_CODE_KP_COMMA -> 0x2d Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20180117164118.8510-3-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- Makefile | 1 + include/ui/input.h | 3 ++ hw/char/escc.c | 126 +++-------------------------------------------------- ui/input-keymap.c | 1 + 4 files changed, 10 insertions(+), 121 deletions(-) diff --git a/Makefile b/Makefile index cd65eb4a80..f9278f14c9 100644 --- a/Makefile +++ b/Makefile @@ -238,6 +238,7 @@ KEYCODEMAP_FILES = \ ui/input-keymap-qcode-to-atset2.c \ ui/input-keymap-qcode-to-atset3.c \ ui/input-keymap-qcode-to-qnum.c \ + ui/input-keymap-qcode-to-sun.c \ ui/input-keymap-qnum-to-qcode.c \ ui/input-keymap-qcode-to-linux.c \ ui/input-keymap-usb-to-qcode.c \ diff --git a/include/ui/input.h b/include/ui/input.h index cffeb1c1a0..7d6c92224e 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -86,6 +86,9 @@ extern const guint16 qemu_input_map_qcode_to_atset3[]; extern const guint qemu_input_map_qcode_to_qnum_len; extern const guint16 qemu_input_map_qcode_to_qnum[]; +extern const guint qemu_input_map_qcode_to_sun_len; +extern const guint16 qemu_input_map_qcode_to_sun[]; + extern const guint qemu_input_map_qnum_to_qcode_len; extern const guint16 qemu_input_map_qnum_to_qcode[]; diff --git a/hw/char/escc.c b/hw/char/escc.c index 3ab831a6a7..449bf2fc63 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -717,126 +717,6 @@ MemoryRegion *escc_init(hwaddr base, qemu_irq irqA, qemu_irq irqB, return &d->mmio; } -static const uint8_t qcode_to_keycode[Q_KEY_CODE__MAX] = { - [Q_KEY_CODE_SHIFT] = 99, - [Q_KEY_CODE_SHIFT_R] = 110, - [Q_KEY_CODE_ALT] = 19, - [Q_KEY_CODE_ALT_R] = 13, - [Q_KEY_CODE_CTRL] = 76, - [Q_KEY_CODE_CTRL_R] = 76, - [Q_KEY_CODE_ESC] = 29, - [Q_KEY_CODE_1] = 30, - [Q_KEY_CODE_2] = 31, - [Q_KEY_CODE_3] = 32, - [Q_KEY_CODE_4] = 33, - [Q_KEY_CODE_5] = 34, - [Q_KEY_CODE_6] = 35, - [Q_KEY_CODE_7] = 36, - [Q_KEY_CODE_8] = 37, - [Q_KEY_CODE_9] = 38, - [Q_KEY_CODE_0] = 39, - [Q_KEY_CODE_MINUS] = 40, - [Q_KEY_CODE_EQUAL] = 41, - [Q_KEY_CODE_BACKSPACE] = 43, - [Q_KEY_CODE_TAB] = 53, - [Q_KEY_CODE_Q] = 54, - [Q_KEY_CODE_W] = 55, - [Q_KEY_CODE_E] = 56, - [Q_KEY_CODE_R] = 57, - [Q_KEY_CODE_T] = 58, - [Q_KEY_CODE_Y] = 59, - [Q_KEY_CODE_U] = 60, - [Q_KEY_CODE_I] = 61, - [Q_KEY_CODE_O] = 62, - [Q_KEY_CODE_P] = 63, - [Q_KEY_CODE_BRACKET_LEFT] = 64, - [Q_KEY_CODE_BRACKET_RIGHT] = 65, - [Q_KEY_CODE_RET] = 89, - [Q_KEY_CODE_A] = 77, - [Q_KEY_CODE_S] = 78, - [Q_KEY_CODE_D] = 79, - [Q_KEY_CODE_F] = 80, - [Q_KEY_CODE_G] = 81, - [Q_KEY_CODE_H] = 82, - [Q_KEY_CODE_J] = 83, - [Q_KEY_CODE_K] = 84, - [Q_KEY_CODE_L] = 85, - [Q_KEY_CODE_SEMICOLON] = 86, - [Q_KEY_CODE_APOSTROPHE] = 87, - [Q_KEY_CODE_GRAVE_ACCENT] = 42, - [Q_KEY_CODE_BACKSLASH] = 88, - [Q_KEY_CODE_Z] = 100, - [Q_KEY_CODE_X] = 101, - [Q_KEY_CODE_C] = 102, - [Q_KEY_CODE_V] = 103, - [Q_KEY_CODE_B] = 104, - [Q_KEY_CODE_N] = 105, - [Q_KEY_CODE_M] = 106, - [Q_KEY_CODE_COMMA] = 107, - [Q_KEY_CODE_DOT] = 108, - [Q_KEY_CODE_SLASH] = 109, - [Q_KEY_CODE_ASTERISK] = 47, - [Q_KEY_CODE_SPC] = 121, - [Q_KEY_CODE_CAPS_LOCK] = 119, - [Q_KEY_CODE_F1] = 5, - [Q_KEY_CODE_F2] = 6, - [Q_KEY_CODE_F3] = 8, - [Q_KEY_CODE_F4] = 10, - [Q_KEY_CODE_F5] = 12, - [Q_KEY_CODE_F6] = 14, - [Q_KEY_CODE_F7] = 16, - [Q_KEY_CODE_F8] = 17, - [Q_KEY_CODE_F9] = 18, - [Q_KEY_CODE_F10] = 7, - [Q_KEY_CODE_NUM_LOCK] = 98, - [Q_KEY_CODE_SCROLL_LOCK] = 23, - [Q_KEY_CODE_KP_DIVIDE] = 46, - [Q_KEY_CODE_KP_MULTIPLY] = 47, - [Q_KEY_CODE_KP_SUBTRACT] = 71, - [Q_KEY_CODE_KP_ADD] = 125, - [Q_KEY_CODE_KP_ENTER] = 90, - [Q_KEY_CODE_KP_DECIMAL] = 50, - [Q_KEY_CODE_KP_0] = 94, - [Q_KEY_CODE_KP_1] = 112, - [Q_KEY_CODE_KP_2] = 113, - [Q_KEY_CODE_KP_3] = 114, - [Q_KEY_CODE_KP_4] = 91, - [Q_KEY_CODE_KP_5] = 92, - [Q_KEY_CODE_KP_6] = 93, - [Q_KEY_CODE_KP_7] = 68, - [Q_KEY_CODE_KP_8] = 69, - [Q_KEY_CODE_KP_9] = 70, - [Q_KEY_CODE_LESS] = 124, - [Q_KEY_CODE_F11] = 9, - [Q_KEY_CODE_F12] = 11, - [Q_KEY_CODE_HOME] = 52, - [Q_KEY_CODE_PGUP] = 96, - [Q_KEY_CODE_PGDN] = 123, - [Q_KEY_CODE_END] = 74, - [Q_KEY_CODE_LEFT] = 24, - [Q_KEY_CODE_UP] = 20, - [Q_KEY_CODE_DOWN] = 27, - [Q_KEY_CODE_RIGHT] = 28, - [Q_KEY_CODE_INSERT] = 44, - [Q_KEY_CODE_DELETE] = 66, - [Q_KEY_CODE_STOP] = 1, - [Q_KEY_CODE_AGAIN] = 3, - [Q_KEY_CODE_PROPS] = 25, - [Q_KEY_CODE_UNDO] = 26, - [Q_KEY_CODE_FRONT] = 49, - [Q_KEY_CODE_COPY] = 51, - [Q_KEY_CODE_OPEN] = 72, - [Q_KEY_CODE_PASTE] = 73, - [Q_KEY_CODE_FIND] = 95, - [Q_KEY_CODE_CUT] = 97, - [Q_KEY_CODE_LF] = 111, - [Q_KEY_CODE_HELP] = 118, - [Q_KEY_CODE_META_L] = 120, - [Q_KEY_CODE_META_R] = 122, - [Q_KEY_CODE_COMPOSE] = 67, - [Q_KEY_CODE_PRINT] = 22, - [Q_KEY_CODE_SYSRQ] = 21, -}; static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src, InputEvent *evt) @@ -879,7 +759,11 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src, } } - keycode = qcode_to_keycode[qcode]; + if (qcode > qemu_input_map_qcode_to_sun_len) { + return; + } + + keycode = qemu_input_map_qcode_to_sun[qcode]; if (!key->down) { keycode |= 0x80; } diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 07be8f4415..7a9475abd9 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -11,6 +11,7 @@ #include "ui/input-keymap-qcode-to-atset2.c" #include "ui/input-keymap-qcode-to-atset3.c" #include "ui/input-keymap-qcode-to-qnum.c" +#include "ui/input-keymap-qcode-to-sun.c" #include "ui/input-keymap-qnum-to-qcode.c" #include "ui/input-keymap-qcode-to-linux.c" #include "ui/input-keymap-usb-to-qcode.c" -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 5/7] hw: convert the escc device to keycodemapdb 2018-01-29 10:23 ` [Qemu-devel] [PULL 5/7] hw: convert the escc " Gerd Hoffmann @ 2022-03-31 10:03 ` Peter Maydell 2022-03-31 10:10 ` Daniel P. Berrangé 0 siblings, 1 reply; 12+ messages in thread From: Peter Maydell @ 2022-03-31 10:03 UTC (permalink / raw) To: Gerd Hoffmann; +Cc: Mark Cave-Ayland, Daniel P. Berrange, qemu-devel On Mon, 29 Jan 2018 at 10:24, Gerd Hoffmann <kraxel@redhat.com> wrote: > > From: "Daniel P. Berrange" <berrange@redhat.com> > > Replace the qcode_to_keycode table with automatically > generated tables. > > Missing entries in qcode_to_keycode now fixed: > > - Q_KEY_CODE_KP_COMMA -> 0x2d > > Signed-off-by: Daniel P. Berrange <berrange@redhat.com> > Message-id: 20180117164118.8510-3-berrange@redhat.com > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > @@ -879,7 +759,11 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src, > } > } > > - keycode = qcode_to_keycode[qcode]; > + if (qcode > qemu_input_map_qcode_to_sun_len) { > + return; > + } > + > + keycode = qemu_input_map_qcode_to_sun[qcode]; > if (!key->down) { > keycode |= 0x80; > } Hi; I was looking at this code because Coverity is now clever enough to try to check whether the qemu_input_map_qcode_to_sun[] array is being overrun (though alas not clever enough to spot that qemu_input_map_qcode_to_sun_len is the length of that array, so there are false positive complaints about all the uses of these autogenerated arrays in all devices that use them). In this specific case, though, it does look like there's a bug: shouldn't the condition be "if (qcode >= qemu_input_map_qcode_to_sun_len)" ? thanks -- PMM ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 5/7] hw: convert the escc device to keycodemapdb 2022-03-31 10:03 ` Peter Maydell @ 2022-03-31 10:10 ` Daniel P. Berrangé 0 siblings, 0 replies; 12+ messages in thread From: Daniel P. Berrangé @ 2022-03-31 10:10 UTC (permalink / raw) To: Peter Maydell; +Cc: Mark Cave-Ayland, Gerd Hoffmann, qemu-devel On Thu, Mar 31, 2022 at 11:03:49AM +0100, Peter Maydell wrote: > On Mon, 29 Jan 2018 at 10:24, Gerd Hoffmann <kraxel@redhat.com> wrote: > > > > From: "Daniel P. Berrange" <berrange@redhat.com> > > > > Replace the qcode_to_keycode table with automatically > > generated tables. > > > > Missing entries in qcode_to_keycode now fixed: > > > > - Q_KEY_CODE_KP_COMMA -> 0x2d > > > > Signed-off-by: Daniel P. Berrange <berrange@redhat.com> > > Message-id: 20180117164118.8510-3-berrange@redhat.com > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > > > @@ -879,7 +759,11 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src, > > } > > } > > > > - keycode = qcode_to_keycode[qcode]; > > + if (qcode > qemu_input_map_qcode_to_sun_len) { > > + return; > > + } > > + > > + keycode = qemu_input_map_qcode_to_sun[qcode]; > > if (!key->down) { > > keycode |= 0x80; > > } > > Hi; I was looking at this code because Coverity is now clever enough > to try to check whether the qemu_input_map_qcode_to_sun[] array > is being overrun (though alas not clever enough to spot that > qemu_input_map_qcode_to_sun_len is the length of that array, > so there are false positive complaints about all the uses of these > autogenerated arrays in all devices that use them). > > In this specific case, though, it does look like there's a bug: > shouldn't the condition be "if (qcode >= qemu_input_map_qcode_to_sun_len)" ? Yes, you are right. With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 6/7] ui: fix alphabetical ordering of keymaps 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann ` (4 preceding siblings ...) 2018-01-29 10:23 ` [Qemu-devel] [PULL 5/7] hw: convert the escc " Gerd Hoffmann @ 2018-01-29 10:23 ` Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 7/7] hw: convert virtio-input-hid device to keycodemapdb Gerd Hoffmann 2018-01-29 17:17 ` [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Peter Maydell 7 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Daniel P. Berrange, Gerd Hoffmann From: "Daniel P. Berrange" <berrange@redhat.com> The qcode-to-linux keymaps was accidentally added in the wrong place by commit de80d78594b4c3767a12d8d42debcf12cbf85a5b Author: Owen Smith <owen.smith@citrix.com> Date: Fri Nov 3 11:56:28 2017 +0000 ui: generate qcode to linux mappings breaking the alphabetical ordering of keymaps Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-id: 20180117164118.8510-4-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- Makefile | 2 +- include/ui/input.h | 6 +++--- ui/input-keymap.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index f9278f14c9..7073b3d842 100644 --- a/Makefile +++ b/Makefile @@ -237,10 +237,10 @@ KEYCODEMAP_FILES = \ ui/input-keymap-qcode-to-atset1.c \ ui/input-keymap-qcode-to-atset2.c \ ui/input-keymap-qcode-to-atset3.c \ + ui/input-keymap-qcode-to-linux.c \ ui/input-keymap-qcode-to-qnum.c \ ui/input-keymap-qcode-to-sun.c \ ui/input-keymap-qnum-to-qcode.c \ - ui/input-keymap-qcode-to-linux.c \ ui/input-keymap-usb-to-qcode.c \ ui/input-keymap-win32-to-qcode.c \ ui/input-keymap-x11-to-qcode.c \ diff --git a/include/ui/input.h b/include/ui/input.h index 7d6c92224e..ceb22b8eef 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -83,6 +83,9 @@ extern const guint16 qemu_input_map_qcode_to_atset2[]; extern const guint qemu_input_map_qcode_to_atset3_len; extern const guint16 qemu_input_map_qcode_to_atset3[]; +extern const guint qemu_input_map_qcode_to_linux_len; +extern const guint16 qemu_input_map_qcode_to_linux[]; + extern const guint qemu_input_map_qcode_to_qnum_len; extern const guint16 qemu_input_map_qcode_to_qnum[]; @@ -92,9 +95,6 @@ extern const guint16 qemu_input_map_qcode_to_sun[]; extern const guint qemu_input_map_qnum_to_qcode_len; extern const guint16 qemu_input_map_qnum_to_qcode[]; -extern const guint qemu_input_map_qcode_to_linux_len; -extern const guint16 qemu_input_map_qcode_to_linux[]; - extern const guint qemu_input_map_usb_to_qcode_len; extern const guint16 qemu_input_map_usb_to_qcode[]; diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 7a9475abd9..3d4e66bab5 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -10,10 +10,10 @@ #include "ui/input-keymap-qcode-to-atset1.c" #include "ui/input-keymap-qcode-to-atset2.c" #include "ui/input-keymap-qcode-to-atset3.c" +#include "ui/input-keymap-qcode-to-linux.c" #include "ui/input-keymap-qcode-to-qnum.c" #include "ui/input-keymap-qcode-to-sun.c" #include "ui/input-keymap-qnum-to-qcode.c" -#include "ui/input-keymap-qcode-to-linux.c" #include "ui/input-keymap-usb-to-qcode.c" #include "ui/input-keymap-win32-to-qcode.c" #include "ui/input-keymap-x11-to-qcode.c" -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 7/7] hw: convert virtio-input-hid device to keycodemapdb 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann ` (5 preceding siblings ...) 2018-01-29 10:23 ` [Qemu-devel] [PULL 6/7] ui: fix alphabetical ordering of keymaps Gerd Hoffmann @ 2018-01-29 10:23 ` Gerd Hoffmann 2018-01-29 17:17 ` [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Peter Maydell 7 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-29 10:23 UTC (permalink / raw) To: qemu-devel; +Cc: Daniel P. Berrange, Gerd Hoffmann, Michael S. Tsirkin From: "Daniel P. Berrange" <berrange@redhat.com> Replace the keymap_qcode table with automatically generated tables. Missing entries in keymap_qcode now fixed: Q_KEY_CODE_ASTERISK -> KEY_KPASTERISK Q_KEY_CODE_KP_MULTIPLY -> KEY_KPASTERISK Q_KEY_CODE_STOP -> KEY_STOP Q_KEY_CODE_AGAIN -> KEY_AGAIN Q_KEY_CODE_PROPS -> KEY_PROPS Q_KEY_CODE_UNDO -> KEY_UNDO Q_KEY_CODE_FRONT -> KEY_FRONT Q_KEY_CODE_COPY -> KEY_COPY Q_KEY_CODE_OPEN -> KEY_OPEN Q_KEY_CODE_PASTE -> KEY_PASTE Q_KEY_CODE_FIND -> KEY_FIND Q_KEY_CODE_CUT -> KEY_CUT Q_KEY_CODE_LF -> KEY_LINEFEED Q_KEY_CODE_HELP -> KEY_HELP Q_KEY_CODE_COMPOSE -> KEY_COMPOSE Q_KEY_CODE_RO -> KEY_RO Q_KEY_CODE_HIRAGANA -> KEY_HIRAGANA Q_KEY_CODE_HENKAN -> KEY_HENKAN Q_KEY_CODE_YEN -> KEY_YEN Q_KEY_CODE_KP_COMMA -> KEY_KPCOMMA Q_KEY_CODE_KP_EQUALS -> KEY_KPEQUAL Q_KEY_CODE_POWER -> KEY_POWER Q_KEY_CODE_SLEEP -> KEY_SLEEP Q_KEY_CODE_WAKE -> KEY_WAKEUP Q_KEY_CODE_AUDIONEXT -> KEY_NEXTSONG Q_KEY_CODE_AUDIOPREV -> KEY_PREVIOUSSONG Q_KEY_CODE_AUDIOSTOP -> KEY_STOPCD Q_KEY_CODE_AUDIOPLAY -> KEY_PLAYPAUSE Q_KEY_CODE_AUDIOMUTE -> KEY_MUTE Q_KEY_CODE_VOLUMEUP -> KEY_VOLUMEUP Q_KEY_CODE_VOLUMEDOWN -> KEY_VOLUMEDOWN Q_KEY_CODE_MEDIASELECT -> KEY_MEDIA Q_KEY_CODE_MAIL -> KEY_MAIL Q_KEY_CODE_CALCULATOR -> KEY_CALC Q_KEY_CODE_COMPUTER -> KEY_COMPUTER Q_KEY_CODE_AC_HOME -> KEY_HOMEPAGE Q_KEY_CODE_AC_BACK -> KEY_BACK Q_KEY_CODE_AC_FORWARD -> KEY_FORWARD Q_KEY_CODE_AC_REFRESH -> KEY_REFRESH Q_KEY_CODE_AC_BOOKMARKS -> KEY_BOOKMARKS NB, the virtio-input device reports a bitmask to the guest driver that has a bit set for each Linux keycode that the host is able to send to the guest. Thus by adding these extra key mappings we are technically changing the host<->guest ABI. This would also happen any time we defined new mappings for QEMU keycodes in future. When a keycode is removed from the list of possible keycodes that host can send to the guest, it means that the guest OS will think it is possible to receive a key that in pratice can never be generated, which is harmless. When a keycode is added to the list of possible keycodes that the host can send to the guest, it means that the guest OS can see an unexpected event. The Linux virtio_input.c driver code simply forwards this event to the input_event() method in the Linux input subsystem. This in turn calls input_handle_event(), which then calls input_get_disposition(). This method checks if the input event is present in the permitted keys bitmap, and if not returns INPUT_IGNORE_EVENT. Thus the unexpected event will get dropped, which is harmless. If the guest OS reboots, or otherwise re-initializes the virt-input device, it will read the new keycode bitmap. No matter how many keys are defined, the config space has a fixed 128 byte bitmap. There is, however, a size field defiend which says how many bytes in the bitmap are used. So the guest OS reads the size of the bitmap, and then it reads the data from bitmap upto the designated size. So if the guest OS re-initializes at precisely the time that QEMU is migrated across versions, in the worst case, it could conceivably read the old size field, but then get the newly updated bitmap. If a key were added this is harmless, since it simply means it may not process the newly added key. If a key were removed, then it could be readnig a byte from the bitmap that was not initialized. Fortunately QEMU always memsets() the entire bitmap to 0, prior to setting keybits. Thus the guest OS will simply read zeros, which is again harmless. Based on this analysis, it is believed that there is no need to preserve the virtio-input-hid keymaps across migration, as the host<->guest ABI change is harmless and self-resolving at time of guest reboot. NB, this behaviour should perhaps be formalized in the virtio-input spec to declare how guest OS drivers should be written to be robust in their handling of the potentially changable key bitmaps. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20180117164118.8510-5-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/input/virtio-input-hid.c | 136 +++----------------------------------------- 1 file changed, 9 insertions(+), 127 deletions(-) diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index be054fd272..bc5f9a2ed2 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -22,126 +22,7 @@ /* ----------------------------------------------------------------- */ -static const unsigned int keymap_qcode[Q_KEY_CODE__MAX] = { - [Q_KEY_CODE_ESC] = KEY_ESC, - [Q_KEY_CODE_1] = KEY_1, - [Q_KEY_CODE_2] = KEY_2, - [Q_KEY_CODE_3] = KEY_3, - [Q_KEY_CODE_4] = KEY_4, - [Q_KEY_CODE_5] = KEY_5, - [Q_KEY_CODE_6] = KEY_6, - [Q_KEY_CODE_7] = KEY_7, - [Q_KEY_CODE_8] = KEY_8, - [Q_KEY_CODE_9] = KEY_9, - [Q_KEY_CODE_0] = KEY_0, - [Q_KEY_CODE_MINUS] = KEY_MINUS, - [Q_KEY_CODE_EQUAL] = KEY_EQUAL, - [Q_KEY_CODE_BACKSPACE] = KEY_BACKSPACE, - - [Q_KEY_CODE_TAB] = KEY_TAB, - [Q_KEY_CODE_Q] = KEY_Q, - [Q_KEY_CODE_W] = KEY_W, - [Q_KEY_CODE_E] = KEY_E, - [Q_KEY_CODE_R] = KEY_R, - [Q_KEY_CODE_T] = KEY_T, - [Q_KEY_CODE_Y] = KEY_Y, - [Q_KEY_CODE_U] = KEY_U, - [Q_KEY_CODE_I] = KEY_I, - [Q_KEY_CODE_O] = KEY_O, - [Q_KEY_CODE_P] = KEY_P, - [Q_KEY_CODE_BRACKET_LEFT] = KEY_LEFTBRACE, - [Q_KEY_CODE_BRACKET_RIGHT] = KEY_RIGHTBRACE, - [Q_KEY_CODE_RET] = KEY_ENTER, - - [Q_KEY_CODE_CTRL] = KEY_LEFTCTRL, - [Q_KEY_CODE_A] = KEY_A, - [Q_KEY_CODE_S] = KEY_S, - [Q_KEY_CODE_D] = KEY_D, - [Q_KEY_CODE_F] = KEY_F, - [Q_KEY_CODE_G] = KEY_G, - [Q_KEY_CODE_H] = KEY_H, - [Q_KEY_CODE_J] = KEY_J, - [Q_KEY_CODE_K] = KEY_K, - [Q_KEY_CODE_L] = KEY_L, - [Q_KEY_CODE_SEMICOLON] = KEY_SEMICOLON, - [Q_KEY_CODE_APOSTROPHE] = KEY_APOSTROPHE, - [Q_KEY_CODE_GRAVE_ACCENT] = KEY_GRAVE, - - [Q_KEY_CODE_SHIFT] = KEY_LEFTSHIFT, - [Q_KEY_CODE_BACKSLASH] = KEY_BACKSLASH, - [Q_KEY_CODE_LESS] = KEY_102ND, - [Q_KEY_CODE_Z] = KEY_Z, - [Q_KEY_CODE_X] = KEY_X, - [Q_KEY_CODE_C] = KEY_C, - [Q_KEY_CODE_V] = KEY_V, - [Q_KEY_CODE_B] = KEY_B, - [Q_KEY_CODE_N] = KEY_N, - [Q_KEY_CODE_M] = KEY_M, - [Q_KEY_CODE_COMMA] = KEY_COMMA, - [Q_KEY_CODE_DOT] = KEY_DOT, - [Q_KEY_CODE_SLASH] = KEY_SLASH, - [Q_KEY_CODE_SHIFT_R] = KEY_RIGHTSHIFT, - - [Q_KEY_CODE_ALT] = KEY_LEFTALT, - [Q_KEY_CODE_SPC] = KEY_SPACE, - [Q_KEY_CODE_CAPS_LOCK] = KEY_CAPSLOCK, - - [Q_KEY_CODE_F1] = KEY_F1, - [Q_KEY_CODE_F2] = KEY_F2, - [Q_KEY_CODE_F3] = KEY_F3, - [Q_KEY_CODE_F4] = KEY_F4, - [Q_KEY_CODE_F5] = KEY_F5, - [Q_KEY_CODE_F6] = KEY_F6, - [Q_KEY_CODE_F7] = KEY_F7, - [Q_KEY_CODE_F8] = KEY_F8, - [Q_KEY_CODE_F9] = KEY_F9, - [Q_KEY_CODE_F10] = KEY_F10, - [Q_KEY_CODE_NUM_LOCK] = KEY_NUMLOCK, - [Q_KEY_CODE_SCROLL_LOCK] = KEY_SCROLLLOCK, - - [Q_KEY_CODE_KP_0] = KEY_KP0, - [Q_KEY_CODE_KP_1] = KEY_KP1, - [Q_KEY_CODE_KP_2] = KEY_KP2, - [Q_KEY_CODE_KP_3] = KEY_KP3, - [Q_KEY_CODE_KP_4] = KEY_KP4, - [Q_KEY_CODE_KP_5] = KEY_KP5, - [Q_KEY_CODE_KP_6] = KEY_KP6, - [Q_KEY_CODE_KP_7] = KEY_KP7, - [Q_KEY_CODE_KP_8] = KEY_KP8, - [Q_KEY_CODE_KP_9] = KEY_KP9, - [Q_KEY_CODE_KP_SUBTRACT] = KEY_KPMINUS, - [Q_KEY_CODE_KP_ADD] = KEY_KPPLUS, - [Q_KEY_CODE_KP_DECIMAL] = KEY_KPDOT, - [Q_KEY_CODE_KP_ENTER] = KEY_KPENTER, - [Q_KEY_CODE_KP_DIVIDE] = KEY_KPSLASH, - [Q_KEY_CODE_KP_MULTIPLY] = KEY_KPASTERISK, - - [Q_KEY_CODE_F11] = KEY_F11, - [Q_KEY_CODE_F12] = KEY_F12, - - [Q_KEY_CODE_CTRL_R] = KEY_RIGHTCTRL, - [Q_KEY_CODE_SYSRQ] = KEY_SYSRQ, - [Q_KEY_CODE_PRINT] = KEY_SYSRQ, - [Q_KEY_CODE_PAUSE] = KEY_PAUSE, - [Q_KEY_CODE_ALT_R] = KEY_RIGHTALT, - - [Q_KEY_CODE_HOME] = KEY_HOME, - [Q_KEY_CODE_UP] = KEY_UP, - [Q_KEY_CODE_PGUP] = KEY_PAGEUP, - [Q_KEY_CODE_LEFT] = KEY_LEFT, - [Q_KEY_CODE_RIGHT] = KEY_RIGHT, - [Q_KEY_CODE_END] = KEY_END, - [Q_KEY_CODE_DOWN] = KEY_DOWN, - [Q_KEY_CODE_PGDN] = KEY_PAGEDOWN, - [Q_KEY_CODE_INSERT] = KEY_INSERT, - [Q_KEY_CODE_DELETE] = KEY_DELETE, - - [Q_KEY_CODE_META_L] = KEY_LEFTMETA, - [Q_KEY_CODE_META_R] = KEY_RIGHTMETA, - [Q_KEY_CODE_MENU] = KEY_MENU, -}; - -static const unsigned int keymap_button[INPUT_BUTTON__MAX] = { +static const unsigned short keymap_button[INPUT_BUTTON__MAX] = { [INPUT_BUTTON_LEFT] = BTN_LEFT, [INPUT_BUTTON_RIGHT] = BTN_RIGHT, [INPUT_BUTTON_MIDDLE] = BTN_MIDDLE, @@ -151,12 +32,12 @@ static const unsigned int keymap_button[INPUT_BUTTON__MAX] = { [INPUT_BUTTON_EXTRA] = BTN_EXTRA, }; -static const unsigned int axismap_rel[INPUT_AXIS__MAX] = { +static const unsigned short axismap_rel[INPUT_AXIS__MAX] = { [INPUT_AXIS_X] = REL_X, [INPUT_AXIS_Y] = REL_Y, }; -static const unsigned int axismap_abs[INPUT_AXIS__MAX] = { +static const unsigned short axismap_abs[INPUT_AXIS__MAX] = { [INPUT_AXIS_X] = ABS_X, [INPUT_AXIS_Y] = ABS_Y, }; @@ -164,7 +45,7 @@ static const unsigned int axismap_abs[INPUT_AXIS__MAX] = { /* ----------------------------------------------------------------- */ static void virtio_input_key_config(VirtIOInput *vinput, - const unsigned int *keymap, + const unsigned short *keymap, size_t mapsize) { virtio_input_config keys; @@ -204,9 +85,10 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src, case INPUT_EVENT_KIND_KEY: key = evt->u.key.data; qcode = qemu_input_key_value_to_qcode(key->key); - if (qcode && keymap_qcode[qcode]) { + if (qcode < qemu_input_map_qcode_to_linux_len && + qemu_input_map_qcode_to_linux[qcode]) { event.type = cpu_to_le16(EV_KEY); - event.code = cpu_to_le16(keymap_qcode[qcode]); + event.code = cpu_to_le16(qemu_input_map_qcode_to_linux[qcode]); event.value = cpu_to_le32(key->down ? 1 : 0); virtio_input_send(vinput, &event); } else { @@ -399,8 +281,8 @@ static void virtio_keyboard_init(Object *obj) vhid->handler = &virtio_keyboard_handler; virtio_input_init_config(vinput, virtio_keyboard_config); - virtio_input_key_config(vinput, keymap_qcode, - ARRAY_SIZE(keymap_qcode)); + virtio_input_key_config(vinput, qemu_input_map_qcode_to_linux, + qemu_input_map_qcode_to_linux_len); } static const TypeInfo virtio_keyboard_info = { -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann ` (6 preceding siblings ...) 2018-01-29 10:23 ` [Qemu-devel] [PULL 7/7] hw: convert virtio-input-hid device to keycodemapdb Gerd Hoffmann @ 2018-01-29 17:17 ` Peter Maydell 7 siblings, 0 replies; 12+ messages in thread From: Peter Maydell @ 2018-01-29 17:17 UTC (permalink / raw) To: Gerd Hoffmann; +Cc: QEMU Developers On 29 January 2018 at 10:23, Gerd Hoffmann <kraxel@redhat.com> wrote: > The following changes since commit e607bbee553cfe73072870cef458cfa4e78133e2: > > Merge remote-tracking branch 'remotes/edgar/tags/edgar/xilinx-next-2018-01-26.for-upstream' into staging (2018-01-26 14:24:25 +0000) > > are available in the git repository at: > > git://git.kraxel.org/qemu tags/input-20180129-v2-pull-request > > for you to fetch changes up to ae6b06ab655b21c19b234ce3422f694d11a013e0: > > hw: convert virtio-input-hid device to keycodemapdb (2018-01-29 09:35:44 +0100) > > ---------------------------------------------------------------- > input: switch devices to keycodemapdb, bugfixes. > Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 0/7] Input 20180126 patches @ 2018-01-26 9:13 Gerd Hoffmann 2018-01-26 9:13 ` [Qemu-devel] [PULL 4/7] hw: convert ps2 device to keycodemapdb Gerd Hoffmann 0 siblings, 1 reply; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-26 9:13 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann The following changes since commit 2077fef91d5eb8e3745a84fabd87a5ee7d2b535d: Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20180125' into staging (2018-01-25 17:04:47 +0000) are available in the git repository at: git://git.kraxel.org/qemu tags/input-20180126-pull-request for you to fetch changes up to d0b610a55b81bdc485c877ef0466895fd40e8d6f: hw: convert virtio-input-hid device to keycodemapdb (2018-01-26 07:15:07 +0100) ---------------------------------------------------------------- input: switch devices to keycodemapdb, bugfixes. ---------------------------------------------------------------- Daniel P. Berrange (4): hw: convert ps2 device to keycodemapdb hw: convert the escc device to keycodemapdb ui: fix alphabetical ordering of keymaps hw: convert virtio-input-hid device to keycodemapdb Miika S (2): input: add mouse side buttons to virtio input input: virtio: don't send mouse wheel event twice Prasad J Pandit (1): ps2: check PS2Queue pointers in post_load routine Makefile | 6 +- include/ui/input.h | 18 +- hw/char/escc.c | 126 +------------ hw/input/ps2.c | 427 ++------------------------------------------ hw/input/virtio-input-hid.c | 144 ++------------- ui/input-keymap.c | 6 +- 6 files changed, 61 insertions(+), 666 deletions(-) -- 2.9.3 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 4/7] hw: convert ps2 device to keycodemapdb 2018-01-26 9:13 [Qemu-devel] [PULL 0/7] Input 20180126 patches Gerd Hoffmann @ 2018-01-26 9:13 ` Gerd Hoffmann 0 siblings, 0 replies; 12+ messages in thread From: Gerd Hoffmann @ 2018-01-26 9:13 UTC (permalink / raw) To: qemu-devel; +Cc: Daniel P. Berrange, Gerd Hoffmann From: "Daniel P. Berrange" <berrange@redhat.com> Replace the qcode_to_keycode_set1, qcode_to_keycode_set2, and qcode_to_keycode_set3 tables with automatically generated tables. Missing entries in qcode_to_keycode_set1 now fixed: - Q_KEY_CODE_SYSRQ -> 0x54 - Q_KEY_CODE_PRINT -> 0x54 (NB ignored due to special case) - Q_KEY_CODE_AGAIN -> 0xe005 - Q_KEY_CODE_PROPS -> 0xe006 - Q_KEY_CODE_UNDO -> 0xe007 - Q_KEY_CODE_FRONT -> 0xe00c - Q_KEY_CODE_COPY -> 0xe078 - Q_KEY_CODE_OPEN -> 0x64 - Q_KEY_CODE_PASTE -> 0x65 - Q_KEY_CODE_CUT -> 0xe03c - Q_KEY_CODE_LF -> 0x5b - Q_KEY_CODE_HELP -> 0xe075 - Q_KEY_CODE_COMPOSE -> 0xe05d - Q_KEY_CODE_PAUSE -> 0xe046 - Q_KEY_CODE_KP_EQUALS -> 0x59 And some mistakes corrected: - Q_KEY_CODE_HIRAGANA was mapped to 0x70 (Katakanahiragana) instead of of 0x77 (Hirigana) - Q_KEY_CODE_MENU was incorrectly mapped to the compose scancode (0xe05d) and is now mapped to 0xe01e - Q_KEY_CODE_FIND was mapped to 0xe065 (Search) instead of to 0xe041 (Find) - Q_KEY_CODE_POWER, SLEEP & WAKE had 0x0e instead of 0xe0 as the prefix Missing entries in qcode_to_keycode_set2 now fixed: - Q_KEY_CODE_PRINT -> 0x7f (NB ignored due to special case) - Q_KEY_CODE_COMPOSE -> 0xe02f - Q_KEY_CODE_PAUSE -> 0xe077 - Q_KEY_CODE_KP_EQUALS -> 0x0f And some mistakes corrected: - Q_KEY_CODE_HIRAGANA was mapped to 0x13 (Katakanahiragana) instead of of 0x62 (Hirigana) - Q_KEY_CODE_MENU was incorrectly mapped to the compose scancode (0xe02f) and is now not mapped - Q_KEY_CODE_FIND was mapped to 0xe010 (Search) and is now not mapped. - Q_KEY_CODE_POWER, SLEEP & WAKE had 0x0e instead of 0xe0 as the prefix Missing entries in qcode_to_keycode_set3 now fixed: - Q_KEY_CODE_ASTERISK -> 0x7e - Q_KEY_CODE_SYSRQ -> 0x57 - Q_KEY_CODE_LESS -> 0x13 - Q_KEY_CODE_STOP -> 0x0a - Q_KEY_CODE_AGAIN -> 0x0b - Q_KEY_CODE_PROPS -> 0x0c - Q_KEY_CODE_UNDO -> 0x10 - Q_KEY_CODE_COPY -> 0x18 - Q_KEY_CODE_OPEN -> 0x20 - Q_KEY_CODE_PASTE -> 0x28 - Q_KEY_CODE_FIND -> 0x30 - Q_KEY_CODE_CUT -> 0x38 - Q_KEY_CODE_HELP -> 0x09 - Q_KEY_CODE_COMPOSE -> 0x8d - Q_KEY_CODE_AUDIONEXT -> 0x93 - Q_KEY_CODE_AUDIOPREV -> 0x94 - Q_KEY_CODE_AUDIOSTOP -> 0x98 - Q_KEY_CODE_AUDIOMUTE -> 0x9c - Q_KEY_CODE_VOLUMEUP -> 0x95 - Q_KEY_CODE_VOLUMEDOWN -> 0x9d - Q_KEY_CODE_CALCULATOR -> 0xa3 - Q_KEY_CODE_AC_HOME -> 0x97 And some mistakes corrected: - Q_KEY_CODE_MENU was incorrectly mapped to the compose scancode (0x8d) and is now 0x91 Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20180117164118.8510-2-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- Makefile | 3 + include/ui/input.h | 9 ++ hw/input/ps2.c | 406 +---------------------------------------------------- ui/input-keymap.c | 3 + 4 files changed, 22 insertions(+), 399 deletions(-) diff --git a/Makefile b/Makefile index d835bb92e7..7aaca74e44 100644 --- a/Makefile +++ b/Makefile @@ -233,6 +233,9 @@ KEYCODEMAP_CSV = $(SRC_PATH)/ui/keycodemapdb/data/keymaps.csv KEYCODEMAP_FILES = \ ui/input-keymap-linux-to-qcode.c \ + ui/input-keymap-qcode-to-atset1.c \ + ui/input-keymap-qcode-to-atset2.c \ + ui/input-keymap-qcode-to-atset3.c \ ui/input-keymap-qcode-to-qnum.c \ ui/input-keymap-qnum-to-qcode.c \ ui/input-keymap-qcode-to-linux.c \ diff --git a/include/ui/input.h b/include/ui/input.h index 5cc76d6e41..132659f734 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -71,6 +71,15 @@ void qemu_remove_mouse_mode_change_notifier(Notifier *notify); extern const guint qemu_input_map_linux_to_qcode_len; extern const guint16 qemu_input_map_linux_to_qcode[]; +extern const guint qemu_input_map_qcode_to_atset1_len; +extern const guint16 qemu_input_map_qcode_to_atset1[]; + +extern const guint qemu_input_map_qcode_to_atset2_len; +extern const guint16 qemu_input_map_qcode_to_atset2[]; + +extern const guint qemu_input_map_qcode_to_atset3_len; +extern const guint16 qemu_input_map_qcode_to_atset3[]; + extern const guint qemu_input_map_qcode_to_qnum_len; extern const guint16 qemu_input_map_qcode_to_qnum[]; diff --git a/hw/input/ps2.c b/hw/input/ps2.c index de171a28dd..06f5d2ac4a 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -124,401 +124,6 @@ typedef struct { 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, - - [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_FIND] = 0xe065, - [Q_KEY_CODE_AC_HOME] = 0xe032, - [Q_KEY_CODE_AC_BACK] = 0xe06a, - [Q_KEY_CODE_AC_FORWARD] = 0xe069, - [Q_KEY_CODE_STOP] = 0xe068, - [Q_KEY_CODE_AC_REFRESH] = 0xe067, - [Q_KEY_CODE_AC_BOOKMARKS] = 0xe066, - - [Q_KEY_CODE_ASTERISK] = 0x37, - [Q_KEY_CODE_LESS] = 0x56, - [Q_KEY_CODE_RO] = 0x73, - [Q_KEY_CODE_HIRAGANA] = 0x70, - [Q_KEY_CODE_HENKAN] = 0x79, - [Q_KEY_CODE_YEN] = 0x7d, - [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, - - [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_FIND] = 0xe010, - [Q_KEY_CODE_AC_HOME] = 0xe03a, - [Q_KEY_CODE_AC_BACK] = 0xe038, - [Q_KEY_CODE_AC_FORWARD] = 0xe030, - [Q_KEY_CODE_STOP] = 0xe028, - [Q_KEY_CODE_AC_REFRESH] = 0xe020, - [Q_KEY_CODE_AC_BOOKMARKS] = 0xe018, - - [Q_KEY_CODE_ASTERISK] = 0x7c, - [Q_KEY_CODE_LESS] = 0x61, - [Q_KEY_CODE_SYSRQ] = 0x7f, - [Q_KEY_CODE_RO] = 0x51, - [Q_KEY_CODE_HIRAGANA] = 0x13, - [Q_KEY_CODE_HENKAN] = 0x64, - [Q_KEY_CODE_YEN] = 0x6a, - [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, - - [Q_KEY_CODE_HIRAGANA] = 0x87, - [Q_KEY_CODE_HENKAN] = 0x86, - [Q_KEY_CODE_YEN] = 0x5d, -}; - static uint8_t translate_table[256] = { 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59, @@ -624,7 +229,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, PS2KbdState *s = (PS2KbdState *)dev; InputKeyEvent *key = evt->u.key.data; int qcode; - uint16_t keycode; + uint16_t keycode = 0; int mod; qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); @@ -706,7 +311,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, } } } else { - keycode = qcode_to_keycode_set1[qcode]; + if (qcode < qemu_input_map_qcode_to_atset1_len) + keycode = qemu_input_map_qcode_to_atset1[qcode]; if (keycode) { if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); @@ -799,7 +405,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, } } } else { - keycode = qcode_to_keycode_set2[qcode]; + if (qcode < qemu_input_map_qcode_to_atset2_len) + keycode = qemu_input_map_qcode_to_atset2[qcode]; if (keycode) { if (keycode & 0xff00) { ps2_put_keycode(s, keycode >> 8); @@ -814,7 +421,8 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src, } } } else if (s->scancode_set == 3) { - keycode = qcode_to_keycode_set3[qcode]; + if (qcode < qemu_input_map_qcode_to_atset3_len) + keycode = qemu_input_map_qcode_to_atset3[qcode]; if (keycode) { /* FIXME: break code should be configured on a key by key basis */ if (!key->down) { diff --git a/ui/input-keymap.c b/ui/input-keymap.c index 663986a17b..622c0483cd 100644 --- a/ui/input-keymap.c +++ b/ui/input-keymap.c @@ -6,6 +6,9 @@ #include "standard-headers/linux/input.h" #include "ui/input-keymap-linux-to-qcode.c" +#include "ui/input-keymap-qcode-to-atset1.c" +#include "ui/input-keymap-qcode-to-atset2.c" +#include "ui/input-keymap-qcode-to-atset3.c" #include "ui/input-keymap-qcode-to-qnum.c" #include "ui/input-keymap-qnum-to-qcode.c" #include "ui/input-keymap-qcode-to-linux.c" -- 2.9.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2022-03-31 10:14 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-01-29 10:23 [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 1/7] input: add mouse side buttons to virtio input Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 2/7] input: virtio: don't send mouse wheel event twice Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 3/7] ps2: check PS2Queue pointers in post_load routine Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 4/7] hw: convert ps2 device to keycodemapdb Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 5/7] hw: convert the escc " Gerd Hoffmann 2022-03-31 10:03 ` Peter Maydell 2022-03-31 10:10 ` Daniel P. Berrangé 2018-01-29 10:23 ` [Qemu-devel] [PULL 6/7] ui: fix alphabetical ordering of keymaps Gerd Hoffmann 2018-01-29 10:23 ` [Qemu-devel] [PULL 7/7] hw: convert virtio-input-hid device to keycodemapdb Gerd Hoffmann 2018-01-29 17:17 ` [Qemu-devel] [PULL 0/7] Input 20180129 v2 patches Peter Maydell -- strict thread matches above, loose matches on Subject: below -- 2018-01-26 9:13 [Qemu-devel] [PULL 0/7] Input 20180126 patches Gerd Hoffmann 2018-01-26 9:13 ` [Qemu-devel] [PULL 4/7] hw: convert ps2 device to keycodemapdb Gerd Hoffmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).