diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/char/escc.c | 126 | ||||
-rw-r--r-- | hw/input/ps2.c | 427 | ||||
-rw-r--r-- | hw/input/trace-events | 1 | ||||
-rw-r--r-- | hw/input/virtio-input-hid.c | 144 | ||||
-rw-r--r-- | hw/pci-host/grackle.c | 13 | ||||
-rw-r--r-- | hw/pci-host/trace-events | 9 | ||||
-rw-r--r-- | hw/pci-host/uninorth.c | 24 | ||||
-rw-r--r-- | hw/ppc/ppc405_boards.c | 14 | ||||
-rw-r--r-- | hw/ppc/ppc440_bamboo.c | 9 | ||||
-rw-r--r-- | hw/ppc/spapr.c | 6 | ||||
-rw-r--r-- | hw/ppc/spapr_caps.c | 124 | ||||
-rw-r--r-- | hw/ppc/spapr_hcall.c | 58 | ||||
-rw-r--r-- | hw/ppc/spapr_pci.c | 61 | ||||
-rw-r--r-- | hw/ppc/virtex_ml507.c | 8 |
14 files changed, 314 insertions, 710 deletions
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/hw/input/ps2.c b/hw/input/ps2.c index f388a23c8e..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) { @@ -1225,24 +833,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; diff --git a/hw/input/trace-events b/hw/input/trace-events index a8d46cb766..5affabc81d 100644 --- a/hw/input/trace-events +++ b/hw/input/trace-events @@ -4,6 +4,7 @@ adb_kbd_no_key(void) "Ignoring NO_KEY" adb_kbd_writereg(int reg, uint8_t val) "reg %d val 0x%2.2x" adb_kbd_readreg(int reg, uint8_t val0, uint8_t val1) "reg %d obuf[0] 0x%2.2x obuf[1] 0x%2.2x" + # hw/input/adb-mouse.c adb_mouse_writereg(int reg, uint8_t val) "reg %d val 0x%2.2x" adb_mouse_readreg(int reg, uint8_t val0, uint8_t val1) "reg %d obuf[0] 0x%2.2x obuf[1] 0x%2.2x" diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c index e78faec0b1..bc5f9a2ed2 100644 --- a/hw/input/virtio-input-hid.c +++ b/hw/input/virtio-input-hid.c @@ -22,139 +22,22 @@ /* ----------------------------------------------------------------- */ -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, [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] = { +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, }; @@ -162,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; @@ -202,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 { @@ -216,8 +100,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 @@ -395,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 = { diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c index 3caf1ccb37..033588b7d2 100644 --- a/hw/pci-host/grackle.c +++ b/hw/pci-host/grackle.c @@ -27,16 +27,7 @@ #include "hw/pci/pci_host.h" #include "hw/ppc/mac.h" #include "hw/pci/pci.h" - -/* debug Grackle */ -//#define DEBUG_GRACKLE - -#ifdef DEBUG_GRACKLE -#define GRACKLE_DPRINTF(fmt, ...) \ - do { printf("GRACKLE: " fmt , ## __VA_ARGS__); } while (0) -#else -#define GRACKLE_DPRINTF(fmt, ...) -#endif +#include "trace.h" #define GRACKLE_PCI_HOST_BRIDGE(obj) \ OBJECT_CHECK(GrackleState, (obj), TYPE_GRACKLE_PCI_HOST_BRIDGE) @@ -58,7 +49,7 @@ static void pci_grackle_set_irq(void *opaque, int irq_num, int level) { qemu_irq *pic = opaque; - GRACKLE_DPRINTF("set_irq num %d level %d\n", irq_num, level); + trace_grackle_set_irq(irq_num, level); qemu_set_irq(pic[irq_num + 0x15], level); } diff --git a/hw/pci-host/trace-events b/hw/pci-host/trace-events index 32dfc84692..341a87a702 100644 --- a/hw/pci-host/trace-events +++ b/hw/pci-host/trace-events @@ -1,5 +1,8 @@ # See docs/devel/tracing.txt for syntax documentation. +# hw/pci-host/grackle.c +grackle_set_irq(int irq_num, int level) "set_irq num %d level %d" + # hw/pci-host/sabre.c sabre_set_request(int irq_num) "request irq %d" sabre_clear_request(int irq_num) "clear request irq %d" @@ -9,3 +12,9 @@ sabre_pci_config_write(uint64_t addr, uint64_t val) "addr 0x%"PRIx64" val 0x%"PR sabre_pci_config_read(uint64_t addr, uint64_t val) "addr 0x%"PRIx64" val 0x%"PRIx64 sabre_pci_set_irq(int irq_num, int level) "set irq_in %d level %d" sabre_pci_set_obio_irq(int irq_num, int level) "set irq %d level %d" + +# hw/pci-host/uninorth.c +unin_set_irq(int irq_num, int level) "setting INT %d = %d" +unin_get_config_reg(uint32_t reg, uint32_t addr, uint32_t retval) "converted config space accessor 0x%"PRIx32 "/0x%"PRIx32 " -> 0x%"PRIx32 +unin_data_write(uint64_t addr, unsigned len, uint64_t val) "write addr 0x%"PRIx64 " len %d val 0x%"PRIx64 +unin_data_read(uint64_t addr, unsigned len, uint64_t val) "read addr 0x%"PRIx64 " len %d val 0x%"PRIx64 diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c index 5d8ccaa711..66991da975 100644 --- a/hw/pci-host/uninorth.c +++ b/hw/pci-host/uninorth.c @@ -26,16 +26,7 @@ #include "hw/ppc/mac.h" #include "hw/pci/pci.h" #include "hw/pci/pci_host.h" - -/* debug UniNorth */ -//#define DEBUG_UNIN - -#ifdef DEBUG_UNIN -#define UNIN_DPRINTF(fmt, ...) \ - do { printf("UNIN: " fmt , ## __VA_ARGS__); } while (0) -#else -#define UNIN_DPRINTF(fmt, ...) -#endif +#include "trace.h" static const int unin_irq_line[] = { 0x1b, 0x1c, 0x1d, 0x1e }; @@ -69,8 +60,7 @@ static void pci_unin_set_irq(void *opaque, int irq_num, int level) { qemu_irq *pic = opaque; - UNIN_DPRINTF("%s: setting INT %d = %d\n", __func__, - unin_irq_line[irq_num], level); + trace_unin_set_irq(unin_irq_line[irq_num], level); qemu_set_irq(pic[unin_irq_line[irq_num]], level); } @@ -103,9 +93,7 @@ static uint32_t unin_get_config_reg(uint32_t reg, uint32_t addr) retval |= func << 8; } - - UNIN_DPRINTF("Converted config space accessor %08x/%08x -> %08x\n", - reg, addr, retval); + trace_unin_get_config_reg(reg, addr, retval); return retval; } @@ -115,8 +103,7 @@ static void unin_data_write(void *opaque, hwaddr addr, { UNINState *s = opaque; PCIHostState *phb = PCI_HOST_BRIDGE(s); - UNIN_DPRINTF("write addr " TARGET_FMT_plx " len %d val %"PRIx64"\n", - addr, len, val); + trace_unin_data_write(addr, len, val); pci_data_write(phb->bus, unin_get_config_reg(phb->config_reg, addr), val, len); @@ -132,8 +119,7 @@ static uint64_t unin_data_read(void *opaque, hwaddr addr, val = pci_data_read(phb->bus, unin_get_config_reg(phb->config_reg, addr), len); - UNIN_DPRINTF("read addr " TARGET_FMT_plx " len %d val %x\n", - addr, len, val); + trace_unin_data_read(addr, len, val); return val; } diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c index e92db2c66a..6f7f2ee168 100644 --- a/hw/ppc/ppc405_boards.c +++ b/hw/ppc/ppc405_boards.c @@ -202,6 +202,13 @@ static void ref405ep_init(MachineState *machine) DriveInfo *dinfo; MemoryRegion *sysmem = get_system_memory(); +#ifdef TARGET_PPCEMB + if (!qtest_enabled()) { + warn_report("qemu-system-ppcemb is deprecated, " + "please use qemu-system-ppc instead."); + } +#endif + /* XXX: fix this */ memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram", 0x08000000); @@ -497,6 +504,13 @@ static void taihu_405ep_init(MachineState *machine) int fl_idx, fl_sectors; DriveInfo *dinfo; +#ifdef TARGET_PPCEMB + if (!qtest_enabled()) { + warn_report("qemu-system-ppcemb is deprecated, " + "please use qemu-system-ppc instead."); + } +#endif + /* RAM is soldered to the board so the size cannot be changed */ ram_size = 0x08000000; memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram", diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c index 693c215108..a299206fd4 100644 --- a/hw/ppc/ppc440_bamboo.c +++ b/hw/ppc/ppc440_bamboo.c @@ -13,6 +13,7 @@ #include "qemu/osdep.h" #include "qemu-common.h" +#include "qemu/error-report.h" #include "net/net.h" #include "hw/hw.h" #include "hw/pci/pci.h" @@ -27,6 +28,7 @@ #include "hw/ppc/ppc.h" #include "ppc405.h" #include "sysemu/sysemu.h" +#include "sysemu/qtest.h" #include "hw/sysbus.h" #define BINARY_DEVICE_TREE_FILE "bamboo.dtb" @@ -191,6 +193,13 @@ static void bamboo_init(MachineState *machine) exit(1); } +#ifdef TARGET_PPCEMB + if (!qtest_enabled()) { + warn_report("qemu-system-ppcemb is deprecated, " + "please use qemu-system-ppc instead."); + } +#endif + qemu_register_reset(main_cpu_reset, cpu); ppc_booke_timers_init(cpu, 400000000, 0); ppc_dcr_init(env, NULL, NULL); diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 88a78d31eb..32a876be56 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1791,6 +1791,9 @@ static const VMStateDescription vmstate_spapr = { &vmstate_spapr_cap_htm, &vmstate_spapr_cap_vsx, &vmstate_spapr_cap_dfp, + &vmstate_spapr_cap_cfpc, + &vmstate_spapr_cap_sbbc, + &vmstate_spapr_cap_ibs, NULL } }; @@ -3881,6 +3884,9 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_VSX] = SPAPR_CAP_ON; smc->default_caps.caps[SPAPR_CAP_DFP] = SPAPR_CAP_ON; + smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; spapr_caps_add_properties(smc, &error_abort); } diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 5d52969bd5..62efdaee38 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -73,6 +73,66 @@ static void spapr_cap_set_bool(Object *obj, Visitor *v, const char *name, spapr->eff.caps[cap->index] = value ? SPAPR_CAP_ON : SPAPR_CAP_OFF; } +static void spapr_cap_get_tristate(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + sPAPRCapabilityInfo *cap = opaque; + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + char *val = NULL; + uint8_t value = spapr_get_cap(spapr, cap->index); + + switch (value) { + case SPAPR_CAP_BROKEN: + val = g_strdup("broken"); + break; + case SPAPR_CAP_WORKAROUND: + val = g_strdup("workaround"); + break; + case SPAPR_CAP_FIXED: + val = g_strdup("fixed"); + break; + default: + error_setg(errp, "Invalid value (%d) for cap-%s", value, cap->name); + return; + } + + visit_type_str(v, name, &val, errp); + g_free(val); +} + +static void spapr_cap_set_tristate(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + sPAPRCapabilityInfo *cap = opaque; + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + char *val; + Error *local_err = NULL; + uint8_t value; + + visit_type_str(v, name, &val, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + if (!strcasecmp(val, "broken")) { + value = SPAPR_CAP_BROKEN; + } else if (!strcasecmp(val, "workaround")) { + value = SPAPR_CAP_WORKAROUND; + } else if (!strcasecmp(val, "fixed")) { + value = SPAPR_CAP_FIXED; + } else { + error_setg(errp, "Invalid capability mode \"%s\" for cap-%s", val, + cap->name); + goto out; + } + + spapr->cmd_line_caps[cap->index] = true; + spapr->eff.caps[cap->index] = value; +out: + g_free(val); +} + static void cap_htm_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { if (!val) { @@ -120,6 +180,40 @@ static void cap_dfp_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) } } +static void cap_safe_cache_apply(sPAPRMachineState *spapr, uint8_t val, + Error **errp) +{ + if (tcg_enabled() && val) { + /* TODO - for now only allow broken for TCG */ + error_setg(errp, "Requested safe cache capability level not supported by tcg, try a different value for cap-cfpc"); + } else if (kvm_enabled() && (val > kvmppc_get_cap_safe_cache())) { + error_setg(errp, "Requested safe cache capability level not supported by kvm, try a different value for cap-cfpc"); + } +} + +static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val, + Error **errp) +{ + if (tcg_enabled() && val) { + /* TODO - for now only allow broken for TCG */ + error_setg(errp, "Requested safe bounds check capability level not supported by tcg, try a different value for cap-sbbc"); + } else if (kvm_enabled() && (val > kvmppc_get_cap_safe_bounds_check())) { + error_setg(errp, "Requested safe bounds check capability level not supported by kvm, try a different value for cap-sbbc"); + } +} + +static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, + uint8_t val, Error **errp) +{ + if (tcg_enabled() && val) { + /* TODO - for now only allow broken for TCG */ + error_setg(errp, "Requested safe indirect branch capability level not supported by tcg, try a different value for cap-ibs"); + } else if (kvm_enabled() && (val > kvmppc_get_cap_safe_indirect_branch())) { + error_setg(errp, "Requested safe indirect branch capability level not supported by kvm, try a different value for cap-ibs"); + } +} + +#define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { [SPAPR_CAP_HTM] = { @@ -149,6 +243,33 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { .type = "bool", .apply = cap_dfp_apply, }, + [SPAPR_CAP_CFPC] = { + .name = "cfpc", + .description = "Cache Flush on Privilege Change" VALUE_DESC_TRISTATE, + .index = SPAPR_CAP_CFPC, + .get = spapr_cap_get_tristate, + .set = spapr_cap_set_tristate, + .type = "string", + .apply = cap_safe_cache_apply, + }, + [SPAPR_CAP_SBBC] = { + .name = "sbbc", + .description = "Speculation Barrier Bounds Checking" VALUE_DESC_TRISTATE, + .index = SPAPR_CAP_SBBC, + .get = spapr_cap_get_tristate, + .set = spapr_cap_set_tristate, + .type = "string", + .apply = cap_safe_bounds_check_apply, + }, + [SPAPR_CAP_IBS] = { + .name = "ibs", + .description = "Indirect Branch Serialisation" VALUE_DESC_TRISTATE, + .index = SPAPR_CAP_IBS, + .get = spapr_cap_get_tristate, + .set = spapr_cap_set_tristate, + .type = "string", + .apply = cap_safe_indirect_branch_apply, + }, }; static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, @@ -254,6 +375,9 @@ const VMStateDescription vmstate_spapr_cap_##cap = { \ SPAPR_CAP_MIG_STATE(htm, HTM); SPAPR_CAP_MIG_STATE(vsx, VSX); SPAPR_CAP_MIG_STATE(dfp, DFP); +SPAPR_CAP_MIG_STATE(cfpc, CFPC); +SPAPR_CAP_MIG_STATE(sbbc, SBBC); +SPAPR_CAP_MIG_STATE(ibs, IBS); void spapr_caps_reset(sPAPRMachineState *spapr) { diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 51eba52e86..4d0e6eb0cf 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1654,6 +1654,60 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu, return H_SUCCESS; } +static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu, + sPAPRMachineState *spapr, + target_ulong opcode, + target_ulong *args) +{ + uint64_t characteristics = H_CPU_CHAR_HON_BRANCH_HINTS & + ~H_CPU_CHAR_THR_RECONF_TRIG; + uint64_t behaviour = H_CPU_BEHAV_FAVOUR_SECURITY; + uint8_t safe_cache = spapr_get_cap(spapr, SPAPR_CAP_CFPC); + uint8_t safe_bounds_check = spapr_get_cap(spapr, SPAPR_CAP_SBBC); + uint8_t safe_indirect_branch = spapr_get_cap(spapr, SPAPR_CAP_IBS); + + switch (safe_cache) { + case SPAPR_CAP_WORKAROUND: + characteristics |= H_CPU_CHAR_L1D_FLUSH_ORI30; + characteristics |= H_CPU_CHAR_L1D_FLUSH_TRIG2; + characteristics |= H_CPU_CHAR_L1D_THREAD_PRIV; + behaviour |= H_CPU_BEHAV_L1D_FLUSH_PR; + break; + case SPAPR_CAP_FIXED: + break; + default: /* broken */ + assert(safe_cache == SPAPR_CAP_BROKEN); + behaviour |= H_CPU_BEHAV_L1D_FLUSH_PR; + break; + } + + switch (safe_bounds_check) { + case SPAPR_CAP_WORKAROUND: + characteristics |= H_CPU_CHAR_SPEC_BAR_ORI31; + behaviour |= H_CPU_BEHAV_BNDS_CHK_SPEC_BAR; + break; + case SPAPR_CAP_FIXED: + break; + default: /* broken */ + assert(safe_bounds_check == SPAPR_CAP_BROKEN); + behaviour |= H_CPU_BEHAV_BNDS_CHK_SPEC_BAR; + break; + } + + switch (safe_indirect_branch) { + case SPAPR_CAP_FIXED: + characteristics |= H_CPU_CHAR_BCCTRL_SERIALISED; + default: /* broken */ + assert(safe_indirect_branch == SPAPR_CAP_BROKEN); + break; + } + + args[0] = characteristics; + args[1] = behaviour; + + return H_SUCCESS; +} + static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1]; static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - KVMPPC_HCALL_BASE + 1]; @@ -1733,6 +1787,10 @@ static void hypercall_register_types(void) spapr_register_hypercall(H_INVALIDATE_PID, h_invalidate_pid); spapr_register_hypercall(H_REGISTER_PROC_TBL, h_register_process_table); + /* hcall-get-cpu-characteristics */ + spapr_register_hypercall(H_GET_CPU_CHARACTERISTICS, + h_get_cpu_characteristics); + /* "debugger" hcalls (also used by SLOF). Note: We do -not- differenciate * here between the "CI" and the "CACHE" variants, they will use whatever * mapping attributes qemu is using. When using KVM, the kernel will diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 37f18b3d32..39a14980d3 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -280,13 +280,42 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, int *config_addr_key; Error *err = NULL; + /* Fins sPAPRPHBState */ + phb = spapr_pci_find_phb(spapr, buid); + if (phb) { + pdev = spapr_pci_find_dev(spapr, buid, config_addr); + } + if (!phb || !pdev) { + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } + switch (func) { - case RTAS_CHANGE_MSI_FN: case RTAS_CHANGE_FN: - ret_intr_type = RTAS_TYPE_MSI; + if (msi_present(pdev)) { + ret_intr_type = RTAS_TYPE_MSI; + } else if (msix_present(pdev)) { + ret_intr_type = RTAS_TYPE_MSIX; + } else { + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } + break; + case RTAS_CHANGE_MSI_FN: + if (msi_present(pdev)) { + ret_intr_type = RTAS_TYPE_MSI; + } else { + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } break; case RTAS_CHANGE_MSIX_FN: - ret_intr_type = RTAS_TYPE_MSIX; + if (msix_present(pdev)) { + ret_intr_type = RTAS_TYPE_MSIX; + } else { + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } break; default: error_report("rtas_ibm_change_msi(%u) is not implemented", func); @@ -294,16 +323,6 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, return; } - /* Fins sPAPRPHBState */ - phb = spapr_pci_find_phb(spapr, buid); - if (phb) { - pdev = spapr_pci_find_dev(spapr, buid, config_addr); - } - if (!phb || !pdev) { - rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); - return; - } - msi = (spapr_pci_msi *) g_hash_table_lookup(phb->msi, &config_addr); /* Releasing MSIs */ @@ -1286,13 +1305,17 @@ static void spapr_populate_pci_child_dt(PCIDevice *dev, void *fdt, int offset, _FDT(fdt_setprop_cell(fdt, offset, "#size-cells", RESOURCE_CELLS_SIZE)); - max_msi = msi_nr_vectors_allocated(dev); - if (max_msi) { - _FDT(fdt_setprop_cell(fdt, offset, "ibm,req#msi", max_msi)); + if (msi_present(dev)) { + max_msi = msi_nr_vectors_allocated(dev); + if (max_msi) { + _FDT(fdt_setprop_cell(fdt, offset, "ibm,req#msi", max_msi)); + } } - max_msix = dev->msix_entries_nr; - if (max_msix) { - _FDT(fdt_setprop_cell(fdt, offset, "ibm,req#msi-x", max_msix)); + if (msix_present(dev)) { + max_msix = dev->msix_entries_nr; + if (max_msix) { + _FDT(fdt_setprop_cell(fdt, offset, "ibm,req#msi-x", max_msix)); + } } populate_resource_props(dev, &rp); diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c index 5ac4f76613..9fe7655074 100644 --- a/hw/ppc/virtex_ml507.c +++ b/hw/ppc/virtex_ml507.c @@ -29,6 +29,7 @@ #include "hw/char/serial.h" #include "hw/block/flash.h" #include "sysemu/sysemu.h" +#include "sysemu/qtest.h" #include "hw/devices.h" #include "hw/boards.h" #include "sysemu/device_tree.h" @@ -210,6 +211,13 @@ static void virtex_init(MachineState *machine) int kernel_size; int i; +#ifdef TARGET_PPCEMB + if (!qtest_enabled()) { + warn_report("qemu-system-ppcemb is deprecated, " + "please use qemu-system-ppc instead."); + } +#endif + /* init CPUs */ cpu = ppc440_init_xilinx(&ram_size, 1, machine->cpu_type, 400000000); env = &cpu->env; |