From nobody Fri May 3 13:09:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513885235639548.616977294974; Thu, 21 Dec 2017 11:40:35 -0800 (PST) Received: from localhost ([::1]:37861 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6hm-0000Wx-FK for importer@patchew.org; Thu, 21 Dec 2017 14:40:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60781) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6eB-0006Aa-4O for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eS6e6-0005bQ-OC for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:51 -0500 Received: from mout.kundenserver.de ([212.227.126.134]:51818) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eS6e6-0005aK-6L for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:46 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue006 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MP6UF-1eNRgT2rot-006M9U; Thu, 21 Dec 2017 20:36:44 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 21 Dec 2017 20:36:36 +0100 Message-Id: <20171221193640.27418-2-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171221193640.27418-1-laurent@vivier.eu> References: <20171221193640.27418-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K0:8hgE61DuZ4+u9/yEYjJCKsik6990UmqCKr5h7qwgK2rUmp65Iul guaDnC3c24wXH6a0l5BbTRepR1LiKxSs1INZ3iJUs5NI4v4vR/vJm3i2xQIK8HfhDhtLOP4 iAi5t8oSOQmeD6KWvIQCFzfM73dljpIryHymYxogJhhB/n5xg8BldWba+uLyXNMa/ooqv8b YMVidcbQQGgVAQT9PuwyA== X-UI-Out-Filterresults: notjunk:1;V01:K0:OnmnGw6M8+g=:w1m5qAbo9/n5gc9E+VYty3 taYAys3ZVFYNdEP5yCB+M93ZQx/Q+UOWOoqBmdCwVAvN7CswX0C72TixZaH1WozyhmKUgCjbG +D69rg0Jom3Pudtw6t0gJlkK6ue2t3UekuCj2J3LM/cGuBhlUQUabVsEusv0kLN7QmsB0mYth JBRVJboizoxDVQyYrlirm2MCoTHvlquHHSeEk8BhQq0IS8yPVuBv1gmuQ+kltVMhM4ADJTCqx 9Nq5Mg6uIDyYjX16OlN+iJUrY+wWf0p8HE0HQJ/W85kWiZ28ID0LGllGAlNy0JqR7mU+7H99Z bGUdf1kfXcWRvy4u9NhguTDQFN9jg6mwm3vb/MAqBbt4zQ39RSO5m1ASfiYnhPFfmrtRZQku8 01FN1dW41m9lfGOzMgkttTmwQjyNh//RXIZwOWLRRr+XOtb9aZCUSVTG9KY9SdGV1p2QOBwm2 YNmOK95yXKDtaXv2SGI9ajh9c1C7DAGDh7b+4lStmga/rrNQCWXJSRVixC1OdRSgokIYHWK7m Iynav9fp3oCUBpelBWes5s/l3MhodeQZ2PSYRWSYH5rLhk8pAoZT+NpbsOQKlSh4QS2BT21kK IG6uTXv2scftjV7xGYUwokcWWAX+BtkMlM/usVm693faReEH1s4MJGNbKPFi2IYKIkLH1UM4L xzCJ3pMNrD4PMbnibG6ok46Q3OchcWvQUITwL3k05cY7CBlBxGwhUjlVjChRjX1DyVV26F4sp XW46uLD15TxyvfKtc4KCY1JD5SBIyAwxdVrGv87waOJSopqyE5iOiLuvnP3JmusCpBy0L/JhK suFRpIG X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.134 Subject: [Qemu-devel] [PULL 1/5] Split adb.c into adb.c, adb-mouse.c and adb-kbd.c X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 It makes the code clearer to separate the bus implementation from the devices one. Replace ADB_DPRINTF() with trace events (and adding new ones in adb-kbd.c). Some minor changes to make checkpatch.pl happy. Signed-off-by: Laurent Vivier Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Mark Cave-Ayland Message-Id: <20171220121406.24056-1-laurent@vivier.eu> --- hw/input/Makefile.objs | 2 +- hw/input/adb-internal.h | 49 ++++ hw/input/adb-kbd.c | 400 +++++++++++++++++++++++++++++++ hw/input/adb-mouse.c | 254 ++++++++++++++++++++ hw/input/adb.c | 622 +-------------------------------------------= ---- hw/input/trace-events | 8 + 6 files changed, 714 insertions(+), 621 deletions(-) create mode 100644 hw/input/adb-internal.h create mode 100644 hw/input/adb-kbd.c create mode 100644 hw/input/adb-mouse.c diff --git a/hw/input/Makefile.objs b/hw/input/Makefile.objs index 636f794b6b..77e53e6883 100644 --- a/hw/input/Makefile.objs +++ b/hw/input/Makefile.objs @@ -1,4 +1,4 @@ -common-obj-$(CONFIG_ADB) +=3D adb.o +common-obj-$(CONFIG_ADB) +=3D adb.o adb-mouse.o adb-kbd.o common-obj-y +=3D hid.o common-obj-$(CONFIG_LM832X) +=3D lm832x.o common-obj-$(CONFIG_PCKBD) +=3D pckbd.o diff --git a/hw/input/adb-internal.h b/hw/input/adb-internal.h new file mode 100644 index 0000000000..2a779b8a0a --- /dev/null +++ b/hw/input/adb-internal.h @@ -0,0 +1,49 @@ +/* + * QEMU ADB support + * + * Copyright (c) 2004 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ + +/* ADB commands */ + +#define ADB_BUSRESET 0x00 +#define ADB_FLUSH 0x01 +#define ADB_WRITEREG 0x08 +#define ADB_READREG 0x0c + +/* ADB device commands */ + +#define ADB_CMD_SELF_TEST 0xff +#define ADB_CMD_CHANGE_ID 0xfe +#define ADB_CMD_CHANGE_ID_AND_ACT 0xfd +#define ADB_CMD_CHANGE_ID_AND_ENABLE 0x00 + +/* ADB default device IDs (upper 4 bits of ADB command byte) */ + +#define ADB_DEVID_DONGLE 1 +#define ADB_DEVID_KEYBOARD 2 +#define ADB_DEVID_MOUSE 3 +#define ADB_DEVID_TABLET 4 +#define ADB_DEVID_MODEM 5 +#define ADB_DEVID_MISC 7 + +extern const VMStateDescription vmstate_adb_device; + diff --git a/hw/input/adb-kbd.c b/hw/input/adb-kbd.c new file mode 100644 index 0000000000..354f56e41e --- /dev/null +++ b/hw/input/adb-kbd.c @@ -0,0 +1,400 @@ +/* + * QEMU ADB keyboard support + * + * Copyright (c) 2004 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ +#include "qemu/osdep.h" +#include "hw/input/adb.h" +#include "ui/input.h" +#include "hw/input/adb-keys.h" +#include "sysemu/sysemu.h" +#include "adb-internal.h" +#include "trace.h" + +#define ADB_KEYBOARD(obj) OBJECT_CHECK(KBDState, (obj), TYPE_ADB_KEYBOARD) + +typedef struct KBDState { + /*< private >*/ + ADBDevice parent_obj; + /*< public >*/ + + uint8_t data[128]; + int rptr, wptr, count; +} KBDState; + +#define ADB_KEYBOARD_CLASS(class) \ + OBJECT_CLASS_CHECK(ADBKeyboardClass, (class), TYPE_ADB_KEYBOARD) +#define ADB_KEYBOARD_GET_CLASS(obj) \ + OBJECT_GET_CLASS(ADBKeyboardClass, (obj), TYPE_ADB_KEYBOARD) + +typedef struct ADBKeyboardClass { + /*< private >*/ + ADBDeviceClass parent_class; + /*< public >*/ + + DeviceRealize parent_realize; +} ADBKeyboardClass; + +/* The adb keyboard doesn't have every key imaginable */ +#define NO_KEY 0xff + +int qcode_to_adb_keycode[] =3D { + /* Make sure future additions are automatically set to NO_KEY */ + [0 ... 0xff] =3D NO_KEY, + + [Q_KEY_CODE_SHIFT] =3D ADB_KEY_LEFT_SHIFT, + [Q_KEY_CODE_SHIFT_R] =3D ADB_KEY_RIGHT_SHIFT, + [Q_KEY_CODE_ALT] =3D ADB_KEY_LEFT_OPTION, + [Q_KEY_CODE_ALT_R] =3D ADB_KEY_RIGHT_OPTION, + [Q_KEY_CODE_CTRL] =3D ADB_KEY_LEFT_CONTROL, + [Q_KEY_CODE_CTRL_R] =3D ADB_KEY_RIGHT_CONTROL, + [Q_KEY_CODE_META_L] =3D ADB_KEY_COMMAND, + [Q_KEY_CODE_META_R] =3D ADB_KEY_COMMAND, + [Q_KEY_CODE_SPC] =3D ADB_KEY_SPACEBAR, + + [Q_KEY_CODE_ESC] =3D ADB_KEY_ESC, + [Q_KEY_CODE_1] =3D ADB_KEY_1, + [Q_KEY_CODE_2] =3D ADB_KEY_2, + [Q_KEY_CODE_3] =3D ADB_KEY_3, + [Q_KEY_CODE_4] =3D ADB_KEY_4, + [Q_KEY_CODE_5] =3D ADB_KEY_5, + [Q_KEY_CODE_6] =3D ADB_KEY_6, + [Q_KEY_CODE_7] =3D ADB_KEY_7, + [Q_KEY_CODE_8] =3D ADB_KEY_8, + [Q_KEY_CODE_9] =3D ADB_KEY_9, + [Q_KEY_CODE_0] =3D ADB_KEY_0, + [Q_KEY_CODE_MINUS] =3D ADB_KEY_MINUS, + [Q_KEY_CODE_EQUAL] =3D ADB_KEY_EQUAL, + [Q_KEY_CODE_BACKSPACE] =3D ADB_KEY_DELETE, + [Q_KEY_CODE_TAB] =3D ADB_KEY_TAB, + [Q_KEY_CODE_Q] =3D ADB_KEY_Q, + [Q_KEY_CODE_W] =3D ADB_KEY_W, + [Q_KEY_CODE_E] =3D ADB_KEY_E, + [Q_KEY_CODE_R] =3D ADB_KEY_R, + [Q_KEY_CODE_T] =3D ADB_KEY_T, + [Q_KEY_CODE_Y] =3D ADB_KEY_Y, + [Q_KEY_CODE_U] =3D ADB_KEY_U, + [Q_KEY_CODE_I] =3D ADB_KEY_I, + [Q_KEY_CODE_O] =3D ADB_KEY_O, + [Q_KEY_CODE_P] =3D ADB_KEY_P, + [Q_KEY_CODE_BRACKET_LEFT] =3D ADB_KEY_LEFT_BRACKET, + [Q_KEY_CODE_BRACKET_RIGHT] =3D ADB_KEY_RIGHT_BRACKET, + [Q_KEY_CODE_RET] =3D ADB_KEY_RETURN, + [Q_KEY_CODE_A] =3D ADB_KEY_A, + [Q_KEY_CODE_S] =3D ADB_KEY_S, + [Q_KEY_CODE_D] =3D ADB_KEY_D, + [Q_KEY_CODE_F] =3D ADB_KEY_F, + [Q_KEY_CODE_G] =3D ADB_KEY_G, + [Q_KEY_CODE_H] =3D ADB_KEY_H, + [Q_KEY_CODE_J] =3D ADB_KEY_J, + [Q_KEY_CODE_K] =3D ADB_KEY_K, + [Q_KEY_CODE_L] =3D ADB_KEY_L, + [Q_KEY_CODE_SEMICOLON] =3D ADB_KEY_SEMICOLON, + [Q_KEY_CODE_APOSTROPHE] =3D ADB_KEY_APOSTROPHE, + [Q_KEY_CODE_GRAVE_ACCENT] =3D ADB_KEY_GRAVE_ACCENT, + [Q_KEY_CODE_BACKSLASH] =3D ADB_KEY_BACKSLASH, + [Q_KEY_CODE_Z] =3D ADB_KEY_Z, + [Q_KEY_CODE_X] =3D ADB_KEY_X, + [Q_KEY_CODE_C] =3D ADB_KEY_C, + [Q_KEY_CODE_V] =3D ADB_KEY_V, + [Q_KEY_CODE_B] =3D ADB_KEY_B, + [Q_KEY_CODE_N] =3D ADB_KEY_N, + [Q_KEY_CODE_M] =3D ADB_KEY_M, + [Q_KEY_CODE_COMMA] =3D ADB_KEY_COMMA, + [Q_KEY_CODE_DOT] =3D ADB_KEY_PERIOD, + [Q_KEY_CODE_SLASH] =3D ADB_KEY_FORWARD_SLASH, + [Q_KEY_CODE_ASTERISK] =3D ADB_KEY_KP_MULTIPLY, + [Q_KEY_CODE_CAPS_LOCK] =3D ADB_KEY_CAPS_LOCK, + + [Q_KEY_CODE_F1] =3D ADB_KEY_F1, + [Q_KEY_CODE_F2] =3D ADB_KEY_F2, + [Q_KEY_CODE_F3] =3D ADB_KEY_F3, + [Q_KEY_CODE_F4] =3D ADB_KEY_F4, + [Q_KEY_CODE_F5] =3D ADB_KEY_F5, + [Q_KEY_CODE_F6] =3D ADB_KEY_F6, + [Q_KEY_CODE_F7] =3D ADB_KEY_F7, + [Q_KEY_CODE_F8] =3D ADB_KEY_F8, + [Q_KEY_CODE_F9] =3D ADB_KEY_F9, + [Q_KEY_CODE_F10] =3D ADB_KEY_F10, + [Q_KEY_CODE_F11] =3D ADB_KEY_F11, + [Q_KEY_CODE_F12] =3D ADB_KEY_F12, + [Q_KEY_CODE_PRINT] =3D ADB_KEY_F13, + [Q_KEY_CODE_SYSRQ] =3D ADB_KEY_F13, + [Q_KEY_CODE_SCROLL_LOCK] =3D ADB_KEY_F14, + [Q_KEY_CODE_PAUSE] =3D ADB_KEY_F15, + + [Q_KEY_CODE_NUM_LOCK] =3D ADB_KEY_KP_CLEAR, + [Q_KEY_CODE_KP_EQUALS] =3D ADB_KEY_KP_EQUAL, + [Q_KEY_CODE_KP_DIVIDE] =3D ADB_KEY_KP_DIVIDE, + [Q_KEY_CODE_KP_MULTIPLY] =3D ADB_KEY_KP_MULTIPLY, + [Q_KEY_CODE_KP_SUBTRACT] =3D ADB_KEY_KP_SUBTRACT, + [Q_KEY_CODE_KP_ADD] =3D ADB_KEY_KP_PLUS, + [Q_KEY_CODE_KP_ENTER] =3D ADB_KEY_KP_ENTER, + [Q_KEY_CODE_KP_DECIMAL] =3D ADB_KEY_KP_PERIOD, + [Q_KEY_CODE_KP_0] =3D ADB_KEY_KP_0, + [Q_KEY_CODE_KP_1] =3D ADB_KEY_KP_1, + [Q_KEY_CODE_KP_2] =3D ADB_KEY_KP_2, + [Q_KEY_CODE_KP_3] =3D ADB_KEY_KP_3, + [Q_KEY_CODE_KP_4] =3D ADB_KEY_KP_4, + [Q_KEY_CODE_KP_5] =3D ADB_KEY_KP_5, + [Q_KEY_CODE_KP_6] =3D ADB_KEY_KP_6, + [Q_KEY_CODE_KP_7] =3D ADB_KEY_KP_7, + [Q_KEY_CODE_KP_8] =3D ADB_KEY_KP_8, + [Q_KEY_CODE_KP_9] =3D ADB_KEY_KP_9, + + [Q_KEY_CODE_UP] =3D ADB_KEY_UP, + [Q_KEY_CODE_DOWN] =3D ADB_KEY_DOWN, + [Q_KEY_CODE_LEFT] =3D ADB_KEY_LEFT, + [Q_KEY_CODE_RIGHT] =3D ADB_KEY_RIGHT, + + [Q_KEY_CODE_HELP] =3D ADB_KEY_HELP, + [Q_KEY_CODE_INSERT] =3D ADB_KEY_HELP, + [Q_KEY_CODE_DELETE] =3D ADB_KEY_FORWARD_DELETE, + [Q_KEY_CODE_HOME] =3D ADB_KEY_HOME, + [Q_KEY_CODE_END] =3D ADB_KEY_END, + [Q_KEY_CODE_PGUP] =3D ADB_KEY_PAGE_UP, + [Q_KEY_CODE_PGDN] =3D ADB_KEY_PAGE_DOWN, + + [Q_KEY_CODE_POWER] =3D ADB_KEY_POWER +}; + +static void adb_kbd_put_keycode(void *opaque, int keycode) +{ + KBDState *s =3D opaque; + + if (s->count < sizeof(s->data)) { + s->data[s->wptr] =3D keycode; + if (++s->wptr =3D=3D sizeof(s->data)) { + s->wptr =3D 0; + } + s->count++; + } +} + +static int adb_kbd_poll(ADBDevice *d, uint8_t *obuf) +{ + KBDState *s =3D ADB_KEYBOARD(d); + int keycode; + int olen; + + olen =3D 0; + if (s->count =3D=3D 0) { + return 0; + } + keycode =3D s->data[s->rptr]; + s->rptr++; + if (s->rptr =3D=3D sizeof(s->data)) { + s->rptr =3D 0; + } + s->count--; + /* + * The power key is the only two byte value key, so it is a special ca= se. + * Since 0x7f is not a used keycode for ADB we overload it to indicate= the + * power button when we're storing keycodes in our internal buffer, and + * expand it out to two bytes when we send to the guest. + */ + if (keycode =3D=3D 0x7f) { + obuf[0] =3D 0x7f; + obuf[1] =3D 0x7f; + olen =3D 2; + } else { + obuf[0] =3D keycode; + /* NOTE: the power key key-up is the two byte sequence 0xff 0xff; + * otherwise we could in theory send a second keycode in the second + * byte, but choose not to bother. + */ + obuf[1] =3D 0xff; + olen =3D 2; + } + + return olen; +} + +static int adb_kbd_request(ADBDevice *d, uint8_t *obuf, + const uint8_t *buf, int len) +{ + KBDState *s =3D ADB_KEYBOARD(d); + int cmd, reg, olen; + + if ((buf[0] & 0x0f) =3D=3D ADB_FLUSH) { + /* flush keyboard fifo */ + s->wptr =3D s->rptr =3D s->count =3D 0; + return 0; + } + + cmd =3D buf[0] & 0xc; + reg =3D buf[0] & 0x3; + olen =3D 0; + switch (cmd) { + case ADB_WRITEREG: + trace_adb_kbd_writereg(reg, buf[1]); + switch (reg) { + case 2: + /* LED status */ + break; + case 3: + switch (buf[2]) { + case ADB_CMD_SELF_TEST: + break; + case ADB_CMD_CHANGE_ID: + case ADB_CMD_CHANGE_ID_AND_ACT: + case ADB_CMD_CHANGE_ID_AND_ENABLE: + d->devaddr =3D buf[1] & 0xf; + break; + default: + d->devaddr =3D buf[1] & 0xf; + /* we support handlers: + * 1: Apple Standard Keyboard + * 2: Apple Extended Keyboard (LShift =3D RShift) + * 3: Apple Extended Keyboard (LShift !=3D RShift) + */ + if (buf[2] =3D=3D 1 || buf[2] =3D=3D 2 || buf[2] =3D=3D 3)= { + d->handler =3D buf[2]; + } + break; + } + } + break; + case ADB_READREG: + switch (reg) { + case 0: + olen =3D adb_kbd_poll(d, obuf); + break; + case 1: + break; + case 2: + obuf[0] =3D 0x00; /* XXX: check this */ + obuf[1] =3D 0x07; /* led status */ + olen =3D 2; + break; + case 3: + obuf[0] =3D d->handler; + obuf[1] =3D d->devaddr; + olen =3D 2; + break; + } + trace_adb_kbd_readreg(reg, obuf[0], obuf[1]); + break; + } + return olen; +} + +/* This is where keyboard events enter this file */ +static void adb_keyboard_event(DeviceState *dev, QemuConsole *src, + InputEvent *evt) +{ + KBDState *s =3D (KBDState *)dev; + int qcode, keycode; + + qcode =3D qemu_input_key_value_to_qcode(evt->u.key.data->key); + if (qcode >=3D ARRAY_SIZE(qcode_to_adb_keycode)) { + return; + } + /* FIXME: take handler into account when translating qcode */ + keycode =3D qcode_to_adb_keycode[qcode]; + if (keycode =3D=3D NO_KEY) { /* We don't want to send this to the gue= st */ + trace_adb_kbd_no_key(); + return; + } + if (evt->u.key.data->down =3D=3D false) { /* if key release event */ + keycode =3D keycode | 0x80; /* create keyboard break code */ + } + + adb_kbd_put_keycode(s, keycode); +} + +static const VMStateDescription vmstate_adb_kbd =3D { + .name =3D "adb_kbd", + .version_id =3D 2, + .minimum_version_id =3D 2, + .fields =3D (VMStateField[]) { + VMSTATE_STRUCT(parent_obj, KBDState, 0, vmstate_adb_device, ADBDev= ice), + VMSTATE_BUFFER(data, KBDState), + VMSTATE_INT32(rptr, KBDState), + VMSTATE_INT32(wptr, KBDState), + VMSTATE_INT32(count, KBDState), + VMSTATE_END_OF_LIST() + } +}; + +static void adb_kbd_reset(DeviceState *dev) +{ + ADBDevice *d =3D ADB_DEVICE(dev); + KBDState *s =3D ADB_KEYBOARD(dev); + + d->handler =3D 1; + d->devaddr =3D ADB_DEVID_KEYBOARD; + memset(s->data, 0, sizeof(s->data)); + s->rptr =3D 0; + s->wptr =3D 0; + s->count =3D 0; +} + +static QemuInputHandler adb_keyboard_handler =3D { + .name =3D "QEMU ADB Keyboard", + .mask =3D INPUT_EVENT_MASK_KEY, + .event =3D adb_keyboard_event, +}; + +static void adb_kbd_realizefn(DeviceState *dev, Error **errp) +{ + ADBKeyboardClass *akc =3D ADB_KEYBOARD_GET_CLASS(dev); + akc->parent_realize(dev, errp); + qemu_input_handler_register(dev, &adb_keyboard_handler); +} + +static void adb_kbd_initfn(Object *obj) +{ + ADBDevice *d =3D ADB_DEVICE(obj); + + d->devaddr =3D ADB_DEVID_KEYBOARD; +} + +static void adb_kbd_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + ADBDeviceClass *adc =3D ADB_DEVICE_CLASS(oc); + ADBKeyboardClass *akc =3D ADB_KEYBOARD_CLASS(oc); + + akc->parent_realize =3D dc->realize; + dc->realize =3D adb_kbd_realizefn; + set_bit(DEVICE_CATEGORY_INPUT, dc->categories); + + adc->devreq =3D adb_kbd_request; + dc->reset =3D adb_kbd_reset; + dc->vmsd =3D &vmstate_adb_kbd; +} + +static const TypeInfo adb_kbd_type_info =3D { + .name =3D TYPE_ADB_KEYBOARD, + .parent =3D TYPE_ADB_DEVICE, + .instance_size =3D sizeof(KBDState), + .instance_init =3D adb_kbd_initfn, + .class_init =3D adb_kbd_class_init, + .class_size =3D sizeof(ADBKeyboardClass), +}; + +static void adb_kbd_register_types(void) +{ + type_register_static(&adb_kbd_type_info); +} + +type_init(adb_kbd_register_types) diff --git a/hw/input/adb-mouse.c b/hw/input/adb-mouse.c new file mode 100644 index 0000000000..c9004233b8 --- /dev/null +++ b/hw/input/adb-mouse.c @@ -0,0 +1,254 @@ +/* + * QEMU ADB mouse support + * + * Copyright (c) 2004 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ +#include "qemu/osdep.h" +#include "ui/console.h" +#include "hw/input/adb.h" +#include "adb-internal.h" +#include "trace.h" + +#define ADB_MOUSE(obj) OBJECT_CHECK(MouseState, (obj), TYPE_ADB_MOUSE) + +typedef struct MouseState { + /*< public >*/ + ADBDevice parent_obj; + /*< private >*/ + + int buttons_state, last_buttons_state; + int dx, dy, dz; +} MouseState; + +#define ADB_MOUSE_CLASS(class) \ + OBJECT_CLASS_CHECK(ADBMouseClass, (class), TYPE_ADB_MOUSE) +#define ADB_MOUSE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(ADBMouseClass, (obj), TYPE_ADB_MOUSE) + +typedef struct ADBMouseClass { + /*< public >*/ + ADBDeviceClass parent_class; + /*< private >*/ + + DeviceRealize parent_realize; +} ADBMouseClass; + +static void adb_mouse_event(void *opaque, + int dx1, int dy1, int dz1, int buttons_state) +{ + MouseState *s =3D opaque; + + s->dx +=3D dx1; + s->dy +=3D dy1; + s->dz +=3D dz1; + s->buttons_state =3D buttons_state; +} + + +static int adb_mouse_poll(ADBDevice *d, uint8_t *obuf) +{ + MouseState *s =3D ADB_MOUSE(d); + int dx, dy; + + if (s->last_buttons_state =3D=3D s->buttons_state && + s->dx =3D=3D 0 && s->dy =3D=3D 0) { + return 0; + } + + dx =3D s->dx; + if (dx < -63) { + dx =3D -63; + } else if (dx > 63) { + dx =3D 63; + } + + dy =3D s->dy; + if (dy < -63) { + dy =3D -63; + } else if (dy > 63) { + dy =3D 63; + } + + s->dx -=3D dx; + s->dy -=3D dy; + s->last_buttons_state =3D s->buttons_state; + + dx &=3D 0x7f; + dy &=3D 0x7f; + + if (!(s->buttons_state & MOUSE_EVENT_LBUTTON)) { + dy |=3D 0x80; + } + if (!(s->buttons_state & MOUSE_EVENT_RBUTTON)) { + dx |=3D 0x80; + } + + obuf[0] =3D dy; + obuf[1] =3D dx; + return 2; +} + +static int adb_mouse_request(ADBDevice *d, uint8_t *obuf, + const uint8_t *buf, int len) +{ + MouseState *s =3D ADB_MOUSE(d); + int cmd, reg, olen; + + if ((buf[0] & 0x0f) =3D=3D ADB_FLUSH) { + /* flush mouse fifo */ + s->buttons_state =3D s->last_buttons_state; + s->dx =3D 0; + s->dy =3D 0; + s->dz =3D 0; + return 0; + } + + cmd =3D buf[0] & 0xc; + reg =3D buf[0] & 0x3; + olen =3D 0; + switch (cmd) { + case ADB_WRITEREG: + trace_adb_mouse_writereg(reg, buf[1]); + switch (reg) { + case 2: + break; + case 3: + switch (buf[2]) { + case ADB_CMD_SELF_TEST: + break; + case ADB_CMD_CHANGE_ID: + case ADB_CMD_CHANGE_ID_AND_ACT: + case ADB_CMD_CHANGE_ID_AND_ENABLE: + d->devaddr =3D buf[1] & 0xf; + break; + default: + d->devaddr =3D buf[1] & 0xf; + /* we support handlers: + * 0x01: Classic Apple Mouse Protocol / 100 cpi operations + * 0x02: Classic Apple Mouse Protocol / 200 cpi operations + * we don't support handlers (at least): + * 0x03: Mouse systems A3 trackball + * 0x04: Extended Apple Mouse Protocol + * 0x2f: Microspeed mouse + * 0x42: Macally + * 0x5f: Microspeed mouse + * 0x66: Microspeed mouse + */ + if (buf[2] =3D=3D 1 || buf[2] =3D=3D 2) { + d->handler =3D buf[2]; + } + break; + } + } + break; + case ADB_READREG: + switch (reg) { + case 0: + olen =3D adb_mouse_poll(d, obuf); + break; + case 1: + break; + case 3: + obuf[0] =3D d->handler; + obuf[1] =3D d->devaddr; + olen =3D 2; + break; + } + trace_adb_mouse_readreg(reg, obuf[0], obuf[1]); + break; + } + return olen; +} + +static void adb_mouse_reset(DeviceState *dev) +{ + ADBDevice *d =3D ADB_DEVICE(dev); + MouseState *s =3D ADB_MOUSE(dev); + + d->handler =3D 2; + d->devaddr =3D ADB_DEVID_MOUSE; + s->last_buttons_state =3D s->buttons_state =3D 0; + s->dx =3D s->dy =3D s->dz =3D 0; +} + +static const VMStateDescription vmstate_adb_mouse =3D { + .name =3D "adb_mouse", + .version_id =3D 2, + .minimum_version_id =3D 2, + .fields =3D (VMStateField[]) { + VMSTATE_STRUCT(parent_obj, MouseState, 0, vmstate_adb_device, + ADBDevice), + VMSTATE_INT32(buttons_state, MouseState), + VMSTATE_INT32(last_buttons_state, MouseState), + VMSTATE_INT32(dx, MouseState), + VMSTATE_INT32(dy, MouseState), + VMSTATE_INT32(dz, MouseState), + VMSTATE_END_OF_LIST() + } +}; + +static void adb_mouse_realizefn(DeviceState *dev, Error **errp) +{ + MouseState *s =3D ADB_MOUSE(dev); + ADBMouseClass *amc =3D ADB_MOUSE_GET_CLASS(dev); + + amc->parent_realize(dev, errp); + + qemu_add_mouse_event_handler(adb_mouse_event, s, 0, "QEMU ADB Mouse"); +} + +static void adb_mouse_initfn(Object *obj) +{ + ADBDevice *d =3D ADB_DEVICE(obj); + + d->devaddr =3D ADB_DEVID_MOUSE; +} + +static void adb_mouse_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + ADBDeviceClass *adc =3D ADB_DEVICE_CLASS(oc); + ADBMouseClass *amc =3D ADB_MOUSE_CLASS(oc); + + amc->parent_realize =3D dc->realize; + dc->realize =3D adb_mouse_realizefn; + set_bit(DEVICE_CATEGORY_INPUT, dc->categories); + + adc->devreq =3D adb_mouse_request; + dc->reset =3D adb_mouse_reset; + dc->vmsd =3D &vmstate_adb_mouse; +} + +static const TypeInfo adb_mouse_type_info =3D { + .name =3D TYPE_ADB_MOUSE, + .parent =3D TYPE_ADB_DEVICE, + .instance_size =3D sizeof(MouseState), + .instance_init =3D adb_mouse_initfn, + .class_init =3D adb_mouse_class_init, + .class_size =3D sizeof(ADBMouseClass), +}; + +static void adb_mouse_register_types(void) +{ + type_register_static(&adb_mouse_type_info); +} + +type_init(adb_mouse_register_types) diff --git a/hw/input/adb.c b/hw/input/adb.c index 924a3f9fd5..23ae6f0d75 100644 --- a/hw/input/adb.c +++ b/hw/input/adb.c @@ -22,49 +22,12 @@ * THE SOFTWARE. */ #include "qemu/osdep.h" -#include "hw/hw.h" #include "hw/input/adb.h" -#include "hw/input/adb-keys.h" -#include "ui/console.h" -#include "ui/input.h" -#include "sysemu/sysemu.h" - -/* debug ADB */ -//#define DEBUG_ADB - -#ifdef DEBUG_ADB -#define ADB_DPRINTF(fmt, ...) \ -do { printf("ADB: " fmt , ## __VA_ARGS__); } while (0) -#else -#define ADB_DPRINTF(fmt, ...) -#endif - -/* ADB commands */ -#define ADB_BUSRESET 0x00 -#define ADB_FLUSH 0x01 -#define ADB_WRITEREG 0x08 -#define ADB_READREG 0x0c - -/* ADB device commands */ -#define ADB_CMD_SELF_TEST 0xff -#define ADB_CMD_CHANGE_ID 0xfe -#define ADB_CMD_CHANGE_ID_AND_ACT 0xfd -#define ADB_CMD_CHANGE_ID_AND_ENABLE 0x00 - -/* ADB default device IDs (upper 4 bits of ADB command byte) */ -#define ADB_DEVID_DONGLE 1 -#define ADB_DEVID_KEYBOARD 2 -#define ADB_DEVID_MOUSE 3 -#define ADB_DEVID_TABLET 4 -#define ADB_DEVID_MODEM 5 -#define ADB_DEVID_MISC 7 +#include "adb-internal.h" =20 /* error codes */ #define ADB_RET_NOTPRESENT (-2) =20 -/* The adb keyboard doesn't have every key imaginable */ -#define NO_KEY 0xff - static void adb_device_reset(ADBDevice *d) { qdev_reset_all(DEVICE(d)); @@ -127,7 +90,7 @@ static const TypeInfo adb_bus_type_info =3D { .instance_size =3D sizeof(ADBBusState), }; =20 -static const VMStateDescription vmstate_adb_device =3D { +const VMStateDescription vmstate_adb_device =3D { .name =3D "adb_device", .version_id =3D 0, .minimum_version_id =3D 0, @@ -166,591 +129,10 @@ static const TypeInfo adb_device_type_info =3D { .class_init =3D adb_device_class_init, }; =20 -/***************************************************************/ -/* Keyboard ADB device */ - -#define ADB_KEYBOARD(obj) OBJECT_CHECK(KBDState, (obj), TYPE_ADB_KEYBOARD) - -typedef struct KBDState { - /*< private >*/ - ADBDevice parent_obj; - /*< public >*/ - - uint8_t data[128]; - int rptr, wptr, count; -} KBDState; - -#define ADB_KEYBOARD_CLASS(class) \ - OBJECT_CLASS_CHECK(ADBKeyboardClass, (class), TYPE_ADB_KEYBOARD) -#define ADB_KEYBOARD_GET_CLASS(obj) \ - OBJECT_GET_CLASS(ADBKeyboardClass, (obj), TYPE_ADB_KEYBOARD) - -typedef struct ADBKeyboardClass { - /*< private >*/ - ADBDeviceClass parent_class; - /*< public >*/ - - DeviceRealize parent_realize; -} ADBKeyboardClass; - -int qcode_to_adb_keycode[] =3D { - /* Make sure future additions are automatically set to NO_KEY */ - [0 ... 0xff] =3D NO_KEY, - - [Q_KEY_CODE_SHIFT] =3D ADB_KEY_LEFT_SHIFT, - [Q_KEY_CODE_SHIFT_R] =3D ADB_KEY_RIGHT_SHIFT, - [Q_KEY_CODE_ALT] =3D ADB_KEY_LEFT_OPTION, - [Q_KEY_CODE_ALT_R] =3D ADB_KEY_RIGHT_OPTION, - [Q_KEY_CODE_CTRL] =3D ADB_KEY_LEFT_CONTROL, - [Q_KEY_CODE_CTRL_R] =3D ADB_KEY_RIGHT_CONTROL, - [Q_KEY_CODE_META_L] =3D ADB_KEY_COMMAND, - [Q_KEY_CODE_META_R] =3D ADB_KEY_COMMAND, - [Q_KEY_CODE_SPC] =3D ADB_KEY_SPACEBAR, - - [Q_KEY_CODE_ESC] =3D ADB_KEY_ESC, - [Q_KEY_CODE_1] =3D ADB_KEY_1, - [Q_KEY_CODE_2] =3D ADB_KEY_2, - [Q_KEY_CODE_3] =3D ADB_KEY_3, - [Q_KEY_CODE_4] =3D ADB_KEY_4, - [Q_KEY_CODE_5] =3D ADB_KEY_5, - [Q_KEY_CODE_6] =3D ADB_KEY_6, - [Q_KEY_CODE_7] =3D ADB_KEY_7, - [Q_KEY_CODE_8] =3D ADB_KEY_8, - [Q_KEY_CODE_9] =3D ADB_KEY_9, - [Q_KEY_CODE_0] =3D ADB_KEY_0, - [Q_KEY_CODE_MINUS] =3D ADB_KEY_MINUS, - [Q_KEY_CODE_EQUAL] =3D ADB_KEY_EQUAL, - [Q_KEY_CODE_BACKSPACE] =3D ADB_KEY_DELETE, - [Q_KEY_CODE_TAB] =3D ADB_KEY_TAB, - [Q_KEY_CODE_Q] =3D ADB_KEY_Q, - [Q_KEY_CODE_W] =3D ADB_KEY_W, - [Q_KEY_CODE_E] =3D ADB_KEY_E, - [Q_KEY_CODE_R] =3D ADB_KEY_R, - [Q_KEY_CODE_T] =3D ADB_KEY_T, - [Q_KEY_CODE_Y] =3D ADB_KEY_Y, - [Q_KEY_CODE_U] =3D ADB_KEY_U, - [Q_KEY_CODE_I] =3D ADB_KEY_I, - [Q_KEY_CODE_O] =3D ADB_KEY_O, - [Q_KEY_CODE_P] =3D ADB_KEY_P, - [Q_KEY_CODE_BRACKET_LEFT] =3D ADB_KEY_LEFT_BRACKET, - [Q_KEY_CODE_BRACKET_RIGHT] =3D ADB_KEY_RIGHT_BRACKET, - [Q_KEY_CODE_RET] =3D ADB_KEY_RETURN, - [Q_KEY_CODE_A] =3D ADB_KEY_A, - [Q_KEY_CODE_S] =3D ADB_KEY_S, - [Q_KEY_CODE_D] =3D ADB_KEY_D, - [Q_KEY_CODE_F] =3D ADB_KEY_F, - [Q_KEY_CODE_G] =3D ADB_KEY_G, - [Q_KEY_CODE_H] =3D ADB_KEY_H, - [Q_KEY_CODE_J] =3D ADB_KEY_J, - [Q_KEY_CODE_K] =3D ADB_KEY_K, - [Q_KEY_CODE_L] =3D ADB_KEY_L, - [Q_KEY_CODE_SEMICOLON] =3D ADB_KEY_SEMICOLON, - [Q_KEY_CODE_APOSTROPHE] =3D ADB_KEY_APOSTROPHE, - [Q_KEY_CODE_GRAVE_ACCENT] =3D ADB_KEY_GRAVE_ACCENT, - [Q_KEY_CODE_BACKSLASH] =3D ADB_KEY_BACKSLASH, - [Q_KEY_CODE_Z] =3D ADB_KEY_Z, - [Q_KEY_CODE_X] =3D ADB_KEY_X, - [Q_KEY_CODE_C] =3D ADB_KEY_C, - [Q_KEY_CODE_V] =3D ADB_KEY_V, - [Q_KEY_CODE_B] =3D ADB_KEY_B, - [Q_KEY_CODE_N] =3D ADB_KEY_N, - [Q_KEY_CODE_M] =3D ADB_KEY_M, - [Q_KEY_CODE_COMMA] =3D ADB_KEY_COMMA, - [Q_KEY_CODE_DOT] =3D ADB_KEY_PERIOD, - [Q_KEY_CODE_SLASH] =3D ADB_KEY_FORWARD_SLASH, - [Q_KEY_CODE_ASTERISK] =3D ADB_KEY_KP_MULTIPLY, - [Q_KEY_CODE_CAPS_LOCK] =3D ADB_KEY_CAPS_LOCK, - - [Q_KEY_CODE_F1] =3D ADB_KEY_F1, - [Q_KEY_CODE_F2] =3D ADB_KEY_F2, - [Q_KEY_CODE_F3] =3D ADB_KEY_F3, - [Q_KEY_CODE_F4] =3D ADB_KEY_F4, - [Q_KEY_CODE_F5] =3D ADB_KEY_F5, - [Q_KEY_CODE_F6] =3D ADB_KEY_F6, - [Q_KEY_CODE_F7] =3D ADB_KEY_F7, - [Q_KEY_CODE_F8] =3D ADB_KEY_F8, - [Q_KEY_CODE_F9] =3D ADB_KEY_F9, - [Q_KEY_CODE_F10] =3D ADB_KEY_F10, - [Q_KEY_CODE_F11] =3D ADB_KEY_F11, - [Q_KEY_CODE_F12] =3D ADB_KEY_F12, - [Q_KEY_CODE_PRINT] =3D ADB_KEY_F13, - [Q_KEY_CODE_SYSRQ] =3D ADB_KEY_F13, - [Q_KEY_CODE_SCROLL_LOCK] =3D ADB_KEY_F14, - [Q_KEY_CODE_PAUSE] =3D ADB_KEY_F15, - - [Q_KEY_CODE_NUM_LOCK] =3D ADB_KEY_KP_CLEAR, - [Q_KEY_CODE_KP_EQUALS] =3D ADB_KEY_KP_EQUAL, - [Q_KEY_CODE_KP_DIVIDE] =3D ADB_KEY_KP_DIVIDE, - [Q_KEY_CODE_KP_MULTIPLY] =3D ADB_KEY_KP_MULTIPLY, - [Q_KEY_CODE_KP_SUBTRACT] =3D ADB_KEY_KP_SUBTRACT, - [Q_KEY_CODE_KP_ADD] =3D ADB_KEY_KP_PLUS, - [Q_KEY_CODE_KP_ENTER] =3D ADB_KEY_KP_ENTER, - [Q_KEY_CODE_KP_DECIMAL] =3D ADB_KEY_KP_PERIOD, - [Q_KEY_CODE_KP_0] =3D ADB_KEY_KP_0, - [Q_KEY_CODE_KP_1] =3D ADB_KEY_KP_1, - [Q_KEY_CODE_KP_2] =3D ADB_KEY_KP_2, - [Q_KEY_CODE_KP_3] =3D ADB_KEY_KP_3, - [Q_KEY_CODE_KP_4] =3D ADB_KEY_KP_4, - [Q_KEY_CODE_KP_5] =3D ADB_KEY_KP_5, - [Q_KEY_CODE_KP_6] =3D ADB_KEY_KP_6, - [Q_KEY_CODE_KP_7] =3D ADB_KEY_KP_7, - [Q_KEY_CODE_KP_8] =3D ADB_KEY_KP_8, - [Q_KEY_CODE_KP_9] =3D ADB_KEY_KP_9, - - [Q_KEY_CODE_UP] =3D ADB_KEY_UP, - [Q_KEY_CODE_DOWN] =3D ADB_KEY_DOWN, - [Q_KEY_CODE_LEFT] =3D ADB_KEY_LEFT, - [Q_KEY_CODE_RIGHT] =3D ADB_KEY_RIGHT, - - [Q_KEY_CODE_HELP] =3D ADB_KEY_HELP, - [Q_KEY_CODE_INSERT] =3D ADB_KEY_HELP, - [Q_KEY_CODE_DELETE] =3D ADB_KEY_FORWARD_DELETE, - [Q_KEY_CODE_HOME] =3D ADB_KEY_HOME, - [Q_KEY_CODE_END] =3D ADB_KEY_END, - [Q_KEY_CODE_PGUP] =3D ADB_KEY_PAGE_UP, - [Q_KEY_CODE_PGDN] =3D ADB_KEY_PAGE_DOWN, - - [Q_KEY_CODE_POWER] =3D ADB_KEY_POWER -}; - -static void adb_kbd_put_keycode(void *opaque, int keycode) -{ - KBDState *s =3D opaque; - - if (s->count < sizeof(s->data)) { - s->data[s->wptr] =3D keycode; - if (++s->wptr =3D=3D sizeof(s->data)) - s->wptr =3D 0; - s->count++; - } -} - -static int adb_kbd_poll(ADBDevice *d, uint8_t *obuf) -{ - KBDState *s =3D ADB_KEYBOARD(d); - int keycode; - int olen; - - olen =3D 0; - if (s->count =3D=3D 0) { - return 0; - } - keycode =3D s->data[s->rptr]; - s->rptr++; - if (s->rptr =3D=3D sizeof(s->data)) { - s->rptr =3D 0; - } - s->count--; - /* - * The power key is the only two byte value key, so it is a special ca= se. - * Since 0x7f is not a used keycode for ADB we overload it to indicate= the - * power button when we're storing keycodes in our internal buffer, and - * expand it out to two bytes when we send to the guest. - */ - if (keycode =3D=3D 0x7f) { - obuf[0] =3D 0x7f; - obuf[1] =3D 0x7f; - olen =3D 2; - } else { - obuf[0] =3D keycode; - /* NOTE: the power key key-up is the two byte sequence 0xff 0xff; - * otherwise we could in theory send a second keycode in the second - * byte, but choose not to bother. - */ - obuf[1] =3D 0xff; - olen =3D 2; - } - - return olen; -} - -static int adb_kbd_request(ADBDevice *d, uint8_t *obuf, - const uint8_t *buf, int len) -{ - KBDState *s =3D ADB_KEYBOARD(d); - int cmd, reg, olen; - - if ((buf[0] & 0x0f) =3D=3D ADB_FLUSH) { - /* flush keyboard fifo */ - s->wptr =3D s->rptr =3D s->count =3D 0; - return 0; - } - - cmd =3D buf[0] & 0xc; - reg =3D buf[0] & 0x3; - olen =3D 0; - switch(cmd) { - case ADB_WRITEREG: - switch(reg) { - case 2: - /* LED status */ - break; - case 3: - switch(buf[2]) { - case ADB_CMD_SELF_TEST: - break; - case ADB_CMD_CHANGE_ID: - case ADB_CMD_CHANGE_ID_AND_ACT: - case ADB_CMD_CHANGE_ID_AND_ENABLE: - d->devaddr =3D buf[1] & 0xf; - break; - default: - d->devaddr =3D buf[1] & 0xf; - /* we support handlers: - * 1: Apple Standard Keyboard - * 2: Apple Extended Keyboard (LShift =3D RShift) - * 3: Apple Extended Keyboard (LShift !=3D RShift) - */ - if (buf[2] =3D=3D 1 || buf[2] =3D=3D 2 || buf[2] =3D=3D 3)= { - d->handler =3D buf[2]; - } - break; - } - } - break; - case ADB_READREG: - switch(reg) { - case 0: - olen =3D adb_kbd_poll(d, obuf); - break; - case 1: - break; - case 2: - obuf[0] =3D 0x00; /* XXX: check this */ - obuf[1] =3D 0x07; /* led status */ - olen =3D 2; - break; - case 3: - obuf[0] =3D d->handler; - obuf[1] =3D d->devaddr; - olen =3D 2; - break; - } - break; - } - return olen; -} - -/* This is where keyboard events enter this file */ -static void adb_keyboard_event(DeviceState *dev, QemuConsole *src, - InputEvent *evt) -{ - KBDState *s =3D (KBDState *)dev; - int qcode, keycode; - - qcode =3D qemu_input_key_value_to_qcode(evt->u.key.data->key); - if (qcode >=3D ARRAY_SIZE(qcode_to_adb_keycode)) { - return; - } - /* FIXME: take handler into account when translating qcode */ - keycode =3D qcode_to_adb_keycode[qcode]; - if (keycode =3D=3D NO_KEY) { /* We don't want to send this to the gue= st */ - ADB_DPRINTF("Ignoring NO_KEY\n"); - return; - } - if (evt->u.key.data->down =3D=3D false) { /* if key release event */ - keycode =3D keycode | 0x80; /* create keyboard break code */ - } - - adb_kbd_put_keycode(s, keycode); -} - -static const VMStateDescription vmstate_adb_kbd =3D { - .name =3D "adb_kbd", - .version_id =3D 2, - .minimum_version_id =3D 2, - .fields =3D (VMStateField[]) { - VMSTATE_STRUCT(parent_obj, KBDState, 0, vmstate_adb_device, ADBDev= ice), - VMSTATE_BUFFER(data, KBDState), - VMSTATE_INT32(rptr, KBDState), - VMSTATE_INT32(wptr, KBDState), - VMSTATE_INT32(count, KBDState), - VMSTATE_END_OF_LIST() - } -}; - -static void adb_kbd_reset(DeviceState *dev) -{ - ADBDevice *d =3D ADB_DEVICE(dev); - KBDState *s =3D ADB_KEYBOARD(dev); - - d->handler =3D 1; - d->devaddr =3D ADB_DEVID_KEYBOARD; - memset(s->data, 0, sizeof(s->data)); - s->rptr =3D 0; - s->wptr =3D 0; - s->count =3D 0; -} - -static QemuInputHandler adb_keyboard_handler =3D { - .name =3D "QEMU ADB Keyboard", - .mask =3D INPUT_EVENT_MASK_KEY, - .event =3D adb_keyboard_event, -}; - -static void adb_kbd_realizefn(DeviceState *dev, Error **errp) -{ - ADBKeyboardClass *akc =3D ADB_KEYBOARD_GET_CLASS(dev); - akc->parent_realize(dev, errp); - qemu_input_handler_register(dev, &adb_keyboard_handler); -} - -static void adb_kbd_initfn(Object *obj) -{ - ADBDevice *d =3D ADB_DEVICE(obj); - - d->devaddr =3D ADB_DEVID_KEYBOARD; -} - -static void adb_kbd_class_init(ObjectClass *oc, void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(oc); - ADBDeviceClass *adc =3D ADB_DEVICE_CLASS(oc); - ADBKeyboardClass *akc =3D ADB_KEYBOARD_CLASS(oc); - - akc->parent_realize =3D dc->realize; - dc->realize =3D adb_kbd_realizefn; - set_bit(DEVICE_CATEGORY_INPUT, dc->categories); - - adc->devreq =3D adb_kbd_request; - dc->reset =3D adb_kbd_reset; - dc->vmsd =3D &vmstate_adb_kbd; -} - -static const TypeInfo adb_kbd_type_info =3D { - .name =3D TYPE_ADB_KEYBOARD, - .parent =3D TYPE_ADB_DEVICE, - .instance_size =3D sizeof(KBDState), - .instance_init =3D adb_kbd_initfn, - .class_init =3D adb_kbd_class_init, - .class_size =3D sizeof(ADBKeyboardClass), -}; - -/***************************************************************/ -/* Mouse ADB device */ - -#define ADB_MOUSE(obj) OBJECT_CHECK(MouseState, (obj), TYPE_ADB_MOUSE) - -typedef struct MouseState { - /*< public >*/ - ADBDevice parent_obj; - /*< private >*/ - - int buttons_state, last_buttons_state; - int dx, dy, dz; -} MouseState; - -#define ADB_MOUSE_CLASS(class) \ - OBJECT_CLASS_CHECK(ADBMouseClass, (class), TYPE_ADB_MOUSE) -#define ADB_MOUSE_GET_CLASS(obj) \ - OBJECT_GET_CLASS(ADBMouseClass, (obj), TYPE_ADB_MOUSE) - -typedef struct ADBMouseClass { - /*< public >*/ - ADBDeviceClass parent_class; - /*< private >*/ - - DeviceRealize parent_realize; -} ADBMouseClass; - -static void adb_mouse_event(void *opaque, - int dx1, int dy1, int dz1, int buttons_state) -{ - MouseState *s =3D opaque; - - s->dx +=3D dx1; - s->dy +=3D dy1; - s->dz +=3D dz1; - s->buttons_state =3D buttons_state; -} - - -static int adb_mouse_poll(ADBDevice *d, uint8_t *obuf) -{ - MouseState *s =3D ADB_MOUSE(d); - int dx, dy; - - if (s->last_buttons_state =3D=3D s->buttons_state && - s->dx =3D=3D 0 && s->dy =3D=3D 0) - return 0; - - dx =3D s->dx; - if (dx < -63) - dx =3D -63; - else if (dx > 63) - dx =3D 63; - - dy =3D s->dy; - if (dy < -63) - dy =3D -63; - else if (dy > 63) - dy =3D 63; - - s->dx -=3D dx; - s->dy -=3D dy; - s->last_buttons_state =3D s->buttons_state; - - dx &=3D 0x7f; - dy &=3D 0x7f; - - if (!(s->buttons_state & MOUSE_EVENT_LBUTTON)) - dy |=3D 0x80; - if (!(s->buttons_state & MOUSE_EVENT_RBUTTON)) - dx |=3D 0x80; - - obuf[0] =3D dy; - obuf[1] =3D dx; - return 2; -} - -static int adb_mouse_request(ADBDevice *d, uint8_t *obuf, - const uint8_t *buf, int len) -{ - MouseState *s =3D ADB_MOUSE(d); - int cmd, reg, olen; - - if ((buf[0] & 0x0f) =3D=3D ADB_FLUSH) { - /* flush mouse fifo */ - s->buttons_state =3D s->last_buttons_state; - s->dx =3D 0; - s->dy =3D 0; - s->dz =3D 0; - return 0; - } - - cmd =3D buf[0] & 0xc; - reg =3D buf[0] & 0x3; - olen =3D 0; - switch(cmd) { - case ADB_WRITEREG: - ADB_DPRINTF("write reg %d val 0x%2.2x\n", reg, buf[1]); - switch(reg) { - case 2: - break; - case 3: - switch(buf[2]) { - case ADB_CMD_SELF_TEST: - break; - case ADB_CMD_CHANGE_ID: - case ADB_CMD_CHANGE_ID_AND_ACT: - case ADB_CMD_CHANGE_ID_AND_ENABLE: - d->devaddr =3D buf[1] & 0xf; - break; - default: - d->devaddr =3D buf[1] & 0xf; - /* we support handlers: - * 0x01: Classic Apple Mouse Protocol / 100 cpi operations - * 0x02: Classic Apple Mouse Protocol / 200 cpi operations - * we don't support handlers (at least): - * 0x03: Mouse systems A3 trackball - * 0x04: Extended Apple Mouse Protocol - * 0x2f: Microspeed mouse - * 0x42: Macally - * 0x5f: Microspeed mouse - * 0x66: Microspeed mouse - */ - if (buf[2] =3D=3D 1 || buf[2] =3D=3D 2) { - d->handler =3D buf[2]; - } - break; - } - } - break; - case ADB_READREG: - switch(reg) { - case 0: - olen =3D adb_mouse_poll(d, obuf); - break; - case 1: - break; - case 3: - obuf[0] =3D d->handler; - obuf[1] =3D d->devaddr; - olen =3D 2; - break; - } - ADB_DPRINTF("read reg %d obuf[0] 0x%2.2x obuf[1] 0x%2.2x\n", reg, - obuf[0], obuf[1]); - break; - } - return olen; -} - -static void adb_mouse_reset(DeviceState *dev) -{ - ADBDevice *d =3D ADB_DEVICE(dev); - MouseState *s =3D ADB_MOUSE(dev); - - d->handler =3D 2; - d->devaddr =3D ADB_DEVID_MOUSE; - s->last_buttons_state =3D s->buttons_state =3D 0; - s->dx =3D s->dy =3D s->dz =3D 0; -} - -static const VMStateDescription vmstate_adb_mouse =3D { - .name =3D "adb_mouse", - .version_id =3D 2, - .minimum_version_id =3D 2, - .fields =3D (VMStateField[]) { - VMSTATE_STRUCT(parent_obj, MouseState, 0, vmstate_adb_device, - ADBDevice), - VMSTATE_INT32(buttons_state, MouseState), - VMSTATE_INT32(last_buttons_state, MouseState), - VMSTATE_INT32(dx, MouseState), - VMSTATE_INT32(dy, MouseState), - VMSTATE_INT32(dz, MouseState), - VMSTATE_END_OF_LIST() - } -}; - -static void adb_mouse_realizefn(DeviceState *dev, Error **errp) -{ - MouseState *s =3D ADB_MOUSE(dev); - ADBMouseClass *amc =3D ADB_MOUSE_GET_CLASS(dev); - - amc->parent_realize(dev, errp); - - qemu_add_mouse_event_handler(adb_mouse_event, s, 0, "QEMU ADB Mouse"); -} - -static void adb_mouse_initfn(Object *obj) -{ - ADBDevice *d =3D ADB_DEVICE(obj); - - d->devaddr =3D ADB_DEVID_MOUSE; -} - -static void adb_mouse_class_init(ObjectClass *oc, void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(oc); - ADBDeviceClass *adc =3D ADB_DEVICE_CLASS(oc); - ADBMouseClass *amc =3D ADB_MOUSE_CLASS(oc); - - amc->parent_realize =3D dc->realize; - dc->realize =3D adb_mouse_realizefn; - set_bit(DEVICE_CATEGORY_INPUT, dc->categories); - - adc->devreq =3D adb_mouse_request; - dc->reset =3D adb_mouse_reset; - dc->vmsd =3D &vmstate_adb_mouse; -} - -static const TypeInfo adb_mouse_type_info =3D { - .name =3D TYPE_ADB_MOUSE, - .parent =3D TYPE_ADB_DEVICE, - .instance_size =3D sizeof(MouseState), - .instance_init =3D adb_mouse_initfn, - .class_init =3D adb_mouse_class_init, - .class_size =3D sizeof(ADBMouseClass), -}; - - static void adb_register_types(void) { type_register_static(&adb_bus_type_info); type_register_static(&adb_device_type_info); - type_register_static(&adb_kbd_type_info); - type_register_static(&adb_mouse_type_info); } =20 type_init(adb_register_types) diff --git a/hw/input/trace-events b/hw/input/trace-events index 88150ef7a6..a8d46cb766 100644 --- a/hw/input/trace-events +++ b/hw/input/trace-events @@ -1,5 +1,13 @@ # See docs/devel/tracing.txt for syntax documentation. =20 +# hw/input/adb-kbd.c +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" + # hw/input/ps2.c ps2_put_keycode(void *opaque, int keycode) "%p keycode 0x%02x" ps2_keyboard_event(void *opaque, int qcode, int down, unsigned int modifie= r, unsigned int modifiers) "%p qcode %d down %d modifier 0x%x modifiers 0x%= x" --=20 2.14.3 From nobody Fri May 3 13:09:08 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513885128156969.521146943787; Thu, 21 Dec 2017 11:38:48 -0800 (PST) Received: from localhost ([::1]:37796 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6fq-0007FD-OQ for importer@patchew.org; Thu, 21 Dec 2017 14:38:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60778) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6eA-0006AK-SV for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eS6e6-0005bL-NG for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:50 -0500 Received: from mout.kundenserver.de ([212.227.126.134]:62753) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eS6e6-0005aT-Cl for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:46 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue006 [212.227.15.167]) with ESMTPSA (Nemesis) id 0LqJhV-1exKjV3Z4b-00e2HC; Thu, 21 Dec 2017 20:36:45 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 21 Dec 2017 20:36:37 +0100 Message-Id: <20171221193640.27418-3-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171221193640.27418-1-laurent@vivier.eu> References: <20171221193640.27418-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K0:wJR3hMY8e8QwOQifM8CgrqVVzCltg+v44r41qYQ40iQQ13kWOXx vAFSS2JxSb0aLp5bQDoCG3Fi8j9RMTb0u2QHaNy8ycYVTWtUxgCkJIHDb1qIlBN1CsQBoQC UAqpJ6XExDGBs/ifRtVClRnYK8eSm0vIWgTwSviRV58576VCNO5AHkb0fCnHvII1sUDn4/z VdaSvYwLeRfD7OubDoICA== X-UI-Out-Filterresults: notjunk:1;V01:K0:R+ybfL6k1DY=:tRMDZX1WU8/rO1eO7OnJ57 Sx4FoZ+vHHBBhdg6+Xm6iFk9HpGuWGEniyEw23xv9I36fFnSC9HTPy8zyv1d0vD8MgZ6hGTej FlAnImV/TTtd5o/aGZvV8kbgsotlFqmLQq1P9Z8XFhdmtrEa+BW9KM7WGpzTWfgoV9o7BaEB1 Z7egSNcJBx6FPmV6/wdEgUibxcL/cH7cAeaoSJvXfFkmkn5Ixa4tEADrabH6FxLtR4N2lvL74 1Sdpr0CBXR1vf2JATDgwnUFPXuLrLVNB0GEF+w0MKPTlKQ2pkzF/r7G82LcDycfSLfB8pmLCb JikmKb6JrjJttyZgC3mxIX3/8b+khXFTLUlU1Va148B3zIS/6N+vx0roDVImpsmi1ok3lJ8E3 9M1gAd8db4fW5OgtBArFXKjTO2iXvOx4OG1VX/qJcnfE0vnvqTo6ohPGO4tQ4Fg+Lf8ErSfZ6 6OIxmtUZc1I7nvBAPECdprvFxcQ9QN+muh4R877IGV8OzZIYrG25ftOaqGJgAt3QyfhmzoaLT 9QEmj2W5flvkm/wkOgqvV2XbfZlw45cPtzME7T536yudANGUTn/X6t/CoSQjwoOFqqSm5i00i 5UiwAJv9yM7hAL8MVLk8BqPs6B18VIYCtNnC2fF6R49X1X6g748rL5EJ6ar+5IPBmOvVyNCUo BnoHrK841ngYLs22pC+webTp7momiPs6paGz2xEwtsxcXwFvdO+8BvIe8fNQ087aMs2+9DODr yp1QB4lf3K2sNrsStf0y90oIgR7mMEbXQnFu1ulHgfhddWZ3YXtamBhbc2qOy30UD8Cp5o3b3 frneZvM X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.134 Subject: [Qemu-devel] [PULL 2/5] target/m68k: remove unused variable gen_throws_exception X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 It has been introduced by e6e5906b6e ("ColdFire target."), but the content is never used. Signed-off-by: Laurent Vivier Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Thomas Huth Message-Id: <20171220130815.20708-1-laurent@vivier.eu> --- target/m68k/translate.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/target/m68k/translate.c b/target/m68k/translate.c index b60909222c..dfb2d5dad2 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -181,11 +181,6 @@ static void do_writebacks(DisasContext *s) #define IS_USER(s) s->user #endif =20 -/* XXX: move that elsewhere */ -/* ??? Fix exceptions. */ -static void *gen_throws_exception; -#define gen_last_qop NULL - typedef void (*disas_proc)(CPUM68KState *env, DisasContext *s, uint16_t in= sn); =20 #ifdef DEBUG_DISPATCH @@ -310,7 +305,6 @@ static inline TCGv gen_load(DisasContext * s, int opsiz= e, TCGv addr, int sign) default: g_assert_not_reached(); } - gen_throws_exception =3D gen_last_qop; return tmp; } =20 @@ -331,7 +325,6 @@ static inline void gen_store(DisasContext *s, int opsiz= e, TCGv addr, TCGv val) default: g_assert_not_reached(); } - gen_throws_exception =3D gen_last_qop; } =20 typedef enum { @@ -1001,7 +994,6 @@ static void gen_load_fp(DisasContext *s, int opsize, T= CGv addr, TCGv_ptr fp) } tcg_temp_free(tmp); tcg_temp_free_i64(t64); - gen_throws_exception =3D gen_last_qop; } =20 static void gen_store_fp(DisasContext *s, int opsize, TCGv addr, TCGv_ptr = fp) @@ -1056,7 +1048,6 @@ static void gen_store_fp(DisasContext *s, int opsize,= TCGv addr, TCGv_ptr fp) } tcg_temp_free(tmp); tcg_temp_free_i64(t64); - gen_throws_exception =3D gen_last_qop; } =20 static void gen_ldst_fp(DisasContext *s, int opsize, TCGv addr, @@ -5561,7 +5552,6 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock *tb) gen_tb_start(tb); do { pc_offset =3D dc->pc - pc_start; - gen_throws_exception =3D NULL; tcg_gen_insn_start(dc->pc, dc->cc_op); num_insns++; =20 --=20 2.14.3 From nobody Fri May 3 13:09:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513885250881564.5516272897917; Thu, 21 Dec 2017 11:40:50 -0800 (PST) Received: from localhost ([::1]:37862 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6hm-0000YA-PX for importer@patchew.org; Thu, 21 Dec 2017 14:40:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60782) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6eB-0006Ab-4J for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eS6e7-0005bz-5R for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:51 -0500 Received: from mout.kundenserver.de ([212.227.126.131]:57399) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eS6e6-0005al-Pp for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:47 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue006 [212.227.15.167]) with ESMTPSA (Nemesis) id 0Mfwoa-1eeHqT1E8q-00NCJb; Thu, 21 Dec 2017 20:36:45 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 21 Dec 2017 20:36:38 +0100 Message-Id: <20171221193640.27418-4-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171221193640.27418-1-laurent@vivier.eu> References: <20171221193640.27418-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K0:hx4zbjipZsc3pH59GeSJboC0kJPkKLd8eH4uDnQeBW3Eb3df0ER h9fZjnT5HCvkO+hDrlmqJuwSZMb6+zI7KbWv8UGGlJrBZbS5/ZGmDm2XzHCetEf3Bt/v0bu RUzAVh+N+7jJy7gJADx59vr3Er2/Rij10ZXRepVAh6f/9F1WYNAQu8i8jsD0eX22jzd4wni 6dHhD309tx+IHESUZP3UA== X-UI-Out-Filterresults: notjunk:1;V01:K0:4sVQZATrt+M=:nz3BTgDWo1oDU5cGwLsFjN 0uNve27thNie/c45xDw+Xvila8zcGa0IRls4p8cZSOxUgaDeKpkbaBZhl3iI0pR4SfxWVCy3u AwWRAdwBK6hqr5bK33i8nk5eFDxZycnZtr69Zpmx9SrlVFclb+YBC7gyheHWtOPDGB7KP70Nb 3CP1/KLaH/HyDmRQH6PP8L7NrEnyzpFYq7CPyI038hyH/18HTa7GC0neTJaxBAliB6NQGN1fz aBgiKpMk6KY4Al6es7y0m1mJysj/MOxX6sKOQXXmvQ7JO3O1FYzHRg3xWJ6ZDrFet+ZU3eQQT SnBBV4Ez74iQk0xkwExxZmi21n8ub4wo0RpkYog6OUAanU94CHP+8rDr+zyrpJxl+i2PBhJdJ aNKCFRA3dZjCPH+M5bdvunr8Q4Yn8lWVNJBcmiEA6ZEzK94eIsHw22pDLyszrEfmNjJ88oiJ/ AmtdOuhOmVBiXuzCJ2uZczuKpTDtMEp6CzKW2xSZm8QjFKb3FOZUxTZMRmauKikq2hcAfVL8Q KqoeEb1Xae+MXEof5Mk+YHsVhbKDRsMkczv9z1/V6j1ALkV2ELQDzVcEskSIqz2kYwZofeg8A XX0V6KWxix8Ft+V48+NvADYrdGmaW8G4280woA7kFkvJY9YCve/Xzc0dVIVRRdn8aqL6wFRtP FoOhJdqOxeE37jqRVJnTkIxsc8suy0zGmL3z/8vaTfJg9h9hlArpFuaWN5NIOvL8r5QIzOpcR 48KTBgMAEYD47L4pF90bW0/ePOBTENEz/d2TusVwGz+QUGuKj89MyqM+VfrE8klk7ufgG7kH5 Hz3Mtm/ X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.131 Subject: [Qemu-devel] [PULL 3/5] target/m68k: add monitor.c X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 This allows to use registers content in the monitor. Example: BEFORE: (qemu) print $d0 unknown register AFTER: (qemu) print $d0 0 (qemu) print $sr 0x2000 (qemu) x/10i $pc 0x40010a2a: movew %sr,%d0 0x40010a2c: oril #1792,%d0 0x40010a32: movew %d0,%sr 0x40010a34: movel %a0@,%d0 0x40010a36: btst #3,%d0 0x40010a3a: beqs 0x40010a26 0x40010a3c: movew %sr,%d0 0x40010a3e: andil #63743,%d0 0x40010a44: movew %d0,%sr 0x40010a46: rts Signed-off-by: Laurent Vivier Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson Reviewed-by: Thomas Huth Message-Id: <20171221083057.17942-1-laurent@vivier.eu> --- target/m68k/Makefile.objs | 1 + target/m68k/monitor.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 target/m68k/monitor.c diff --git a/target/m68k/Makefile.objs b/target/m68k/Makefile.objs index 39141ab93d..d143f20270 100644 --- a/target/m68k/Makefile.objs +++ b/target/m68k/Makefile.objs @@ -1,3 +1,4 @@ obj-y +=3D m68k-semi.o obj-y +=3D translate.o op_helper.o helper.o cpu.o fpu_helper.o obj-y +=3D gdbstub.o +obj-$(CONFIG_SOFTMMU) +=3D monitor.o diff --git a/target/m68k/monitor.c b/target/m68k/monitor.c new file mode 100644 index 0000000000..5605323a81 --- /dev/null +++ b/target/m68k/monitor.c @@ -0,0 +1,39 @@ +/* + * QEMU monitor for m68k + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "cpu.h" +#include "monitor/hmp-target.h" + +static const MonitorDef monitor_defs[] =3D { + { "d0", offsetof(CPUM68KState, dregs[0]) }, + { "d1", offsetof(CPUM68KState, dregs[1]) }, + { "d2", offsetof(CPUM68KState, dregs[2]) }, + { "d3", offsetof(CPUM68KState, dregs[3]) }, + { "d4", offsetof(CPUM68KState, dregs[4]) }, + { "d5", offsetof(CPUM68KState, dregs[5]) }, + { "d6", offsetof(CPUM68KState, dregs[6]) }, + { "d7", offsetof(CPUM68KState, dregs[7]) }, + { "a0", offsetof(CPUM68KState, aregs[0]) }, + { "a1", offsetof(CPUM68KState, aregs[1]) }, + { "a2", offsetof(CPUM68KState, aregs[2]) }, + { "a3", offsetof(CPUM68KState, aregs[3]) }, + { "a4", offsetof(CPUM68KState, aregs[4]) }, + { "a5", offsetof(CPUM68KState, aregs[5]) }, + { "a6", offsetof(CPUM68KState, aregs[6]) }, + { "a7", offsetof(CPUM68KState, aregs[7]) }, + { "pc", offsetof(CPUM68KState, pc) }, + { "sr", offsetof(CPUM68KState, sr) }, + { "ssp", offsetof(CPUM68KState, sp[0]) }, + { "usp", offsetof(CPUM68KState, sp[1]) }, + { NULL }, +}; + +const MonitorDef *target_monitor_defs(void) +{ + return monitor_defs; +} --=20 2.14.3 From nobody Fri May 3 13:09:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15138853276731017.6150005741144; Thu, 21 Dec 2017 11:42:07 -0800 (PST) Received: from localhost ([::1]:37932 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6jD-0001fV-NS for importer@patchew.org; Thu, 21 Dec 2017 14:42:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60797) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6eB-0006Ar-Hk for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eS6e7-0005cJ-By for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:51 -0500 Received: from mout.kundenserver.de ([212.227.126.131]:57800) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eS6e7-0005ay-2T for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:47 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue006 [212.227.15.167]) with ESMTPSA (Nemesis) id 0LcJLm-1es7o32zNm-00jpp7; Thu, 21 Dec 2017 20:36:45 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 21 Dec 2017 20:36:39 +0100 Message-Id: <20171221193640.27418-5-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171221193640.27418-1-laurent@vivier.eu> References: <20171221193640.27418-1-laurent@vivier.eu> X-Provags-ID: V03:K0:nWh89Ll2Tg8YGaPwrqolESm6DjMwV1RRJxOgZb3BBwogRiOiUzy uFVu7ORShAqXJt2riTU/C3pogyxSmhOg7K+5rU63IQskaqcwom9+Km88BZq/e0OJqmdTKRs /wYD/DfO4lwOPRoczR7AbjhQ5ndkUPONkWbMzEIG1LscZICKgDhCS7lMrxSY/KXisC6W1c5 ThZEaN1GM1UAt7kn9nYYw== X-UI-Out-Filterresults: notjunk:1;V01:K0:PuC6kFmyxMs=:2Q8glbczweyPQ22aF0ZbWE nvY/KAcuk9mO3pkvv2IIIGnQ443HtS8XKxfaINgVWHBz7ZUWsoXwKawpRPDHFT5zAv/O+UmCc XN2Iojjh+l84yDTQB4RGPgX5aTJo104T4i9zF35I+2CkpJHmFQezkGLgxCsVx9IorR8sm2PmB VjvoiEDSCEV/INizUOWy5PRmT0dNm+LfsnbvSDhCfzXG+s9jDvW6o8KR2MrdqravQTCxXyoFn q+hQ4jJzQaU0z9YqXJUINiltDo4qKLYCSG02LeCQYhwJSfbWkkVyq7awqUSiE9PefE3xBERcl LhEy3LgYB5C1yMRSBjn+x/TZdFXVZuUSfbGytRG06BB+mB+loSsHhgDNupSlYTCNihondm5BZ Db/CW1PZwLCcwEYJsu+sCoN4MgctUFJx4/8z7rMGHh4ee//Eeemm86qiILhS0GXlfGC/W9uSs Sf1ns9IKl0OHKphk3vKkErwVHAaClRV2deIpHtGc2SdzAvXF9UaH9xzGK00QSjpD2L2u664R1 YZqggueL4b8WIEcds+OWcellFJtUqHHw3i2gnqC5VIeb5L+cJ1WK/lbi9oev/6drL71NoymyP e+9J7SYm2/aKFot/mz1+Ehaf3hL3HhxYFiYdVou5+XLnzAN4O+tx5gHHgohQCaRQ3lQ190SOA M0/M05r6FYVGkMAWMb+SVBaqsDyfFm24cnfV4oJoy9VlgcpPj//feWpSyeipZYdEKQ38bN7au xV4tRhvwpSjbf5MkfaSMd/NXRGcjWSC1N7YWMQH+fiIJlUXGAuZ0Btm92fM= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.131 Subject: [Qemu-devel] [PULL 4/5] target/m68k: fix set_cc_op() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The first call of set_cc_op() in a new translation sequence is done with old_op set to CC_OP_DYNAMIC (-1). This will do an out of bound access to the array cc_op_live[]. We fix that by adding an entry in cc_op_live[] for CC_OP_DYNAMIC. Reported-by: Thomas Huth Signed-off-by: Laurent Vivier Reviewed-by: Paolo Bonzini Reviewed-by: Richard Henderson Message-Id: <20171221160558.14151-1-laurent@vivier.eu> --- target/m68k/cpu.h | 2 +- target/m68k/translate.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h index afae5f68ac..5d03764eab 100644 --- a/target/m68k/cpu.h +++ b/target/m68k/cpu.h @@ -182,7 +182,7 @@ void cpu_m68k_set_fpcr(CPUM68KState *env, uint32_t val); */ typedef enum { /* Translator only -- use env->cc_op. */ - CC_OP_DYNAMIC =3D -1, + CC_OP_DYNAMIC, =20 /* Each flag bit computed into cc_[xcnvz]. */ CC_OP_FLAGS, diff --git a/target/m68k/translate.c b/target/m68k/translate.c index dfb2d5dad2..bbda7399ec 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -202,6 +202,7 @@ typedef void (*disas_proc)(CPUM68KState *env, DisasCont= ext *s, uint16_t insn); #endif =20 static const uint8_t cc_op_live[CC_OP_NB] =3D { + [CC_OP_DYNAMIC] =3D CCF_C | CCF_V | CCF_Z | CCF_N | CCF_X, [CC_OP_FLAGS] =3D CCF_C | CCF_V | CCF_Z | CCF_N | CCF_X, [CC_OP_ADDB ... CC_OP_ADDL] =3D CCF_X | CCF_N | CCF_V, [CC_OP_SUBB ... CC_OP_SUBL] =3D CCF_X | CCF_N | CCF_V, --=20 2.14.3 From nobody Fri May 3 13:09:08 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513885138150878.1312100824199; Thu, 21 Dec 2017 11:38:58 -0800 (PST) Received: from localhost ([::1]:37799 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6fy-0007M5-Iu for importer@patchew.org; Thu, 21 Dec 2017 14:38:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60913) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eS6eF-0006EO-QS for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:37:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eS6eB-0005g7-9a for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:55 -0500 Received: from mout.kundenserver.de ([212.227.126.135]:52983) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eS6eA-0005ei-Tu for qemu-devel@nongnu.org; Thu, 21 Dec 2017 14:36:51 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue006 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MICba-1ePLUG0hI6-003rB7; Thu, 21 Dec 2017 20:36:46 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 21 Dec 2017 20:36:40 +0100 Message-Id: <20171221193640.27418-6-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171221193640.27418-1-laurent@vivier.eu> References: <20171221193640.27418-1-laurent@vivier.eu> X-Provags-ID: V03:K0:eXrr3QkpcvOj8gbhjV8iRhxdOfGTtvEuoPqRpWIeFrpxfIM28Z/ kLomjrXwYXG512L2mRTCe4P8gxJGjNZyqZITe2LVFPhw4jDzgx9gPV87qU5DVymKizoB0WD 0fOl7AKZaQAtAUB8j8OFaWs1xwlH0zIQ/VuBZBRyGypASK6Ftr7tv2lePISRtcGs2ItWfOe HXZpXwSZ6AaClR1wUEi+Q== X-UI-Out-Filterresults: notjunk:1;V01:K0:dhS8N1V5BJo=:9rp8VmnCNZuKonnxgWPj9f t68O/lD5FLCG3CEmjGz86HA7bh9nUso5XcWT5UNDO2l0jJPMiZrUBR7CunFoVOoVEwC1pDc2h WwXlUP/46WTJZw70/Xububw/H1sJfxAGZ6x2wvOxGx2GeAfvxJUr/4YCRuyXIHREj8XCZEzuK oBkDCPUeBokFeLCDyDk1/hI+3zABKWBnhVRqrwVWkL3IlHN1EVp4D9nKKV9H92uN8qCxLcUto 0OjmHiqapkTn7fcIzHF1C7DYqYceLWibSB/0gfnWIfi8di+UgoQz0M0fC3xj+ZOJuzn8tQs5I 2O6eG3ElLraQ7pEylN+Yf8NmKqh6KH53N2qYVH1OYBpluMUTI7X4Nmpy3JLtkzwrZOk/vCVqI lDwXfx0+b0L93uo2xr5YXxp1eHvJDyIGoiGxE9Wd10ZqgF2RRRX+C/My6AVHZFec0KZeJyipt 4OINCCcGGvE1cpeB3KPJyf16Vi4+U9VLJtWmtFB4Ik9HE93aQsSHqSD/Pver3QU/MwKOv7GGZ ZrQytZsRxpf7B3FOEtP1RlY0qeU7S2Q8bH8w4z9D8Sf4shDHxlaUiRTRpsFW3VuXF+TmfZuVr +FPmuYGI0q6ofvOu78wGxx3hbtN5jaV/7OkKDePUZhivg84ekBQcWBq8NWDWjA3nQpbgNItw7 CJEcYOEHqqbI+XGZRPEptALoDjLeQSx46bhpudbnAypcGnLlCB9vaKnu+rN+spuLQRtQeYBKN dc2xSc7WthnnEXLdLvv+bKpbOkv4DF4p0kNxQks4LPAuQuee4OffSXurV80= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.135 Subject: [Qemu-devel] [PULL 5/5] tests/boot-serial-test: Add support for the mcf5208evb board X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Huth , Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Thomas Huth We can output a character quite easily here with some few lines of assembly that we provide as a mini-kernel for this board. Signed-off-by: Thomas Huth Message-Id: <1512031988-32490-4-git-send-email-thuth@redhat.com> [lv: add boot-serial-test in check-qtest-m68k] Signed-off-by: Laurent Vivier --- tests/Makefile.include | 2 ++ tests/boot-serial-test.c | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/tests/Makefile.include b/tests/Makefile.include index f8e20d9f5d..77f8183117 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -297,6 +297,8 @@ gcov-files-x86_64-y =3D $(subst i386-softmmu/,x86_64-so= ftmmu/,$(gcov-files-i386-y) =20 check-qtest-alpha-y =3D tests/boot-serial-test$(EXESUF) =20 +check-qtest-m68k-y =3D tests/boot-serial-test$(EXESUF) + check-qtest-mips-y =3D tests/endianness-test$(EXESUF) =20 check-qtest-mips64-y =3D tests/endianness-test$(EXESUF) diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c index d99726919e..dd3828c49b 100644 --- a/tests/boot-serial-test.c +++ b/tests/boot-serial-test.c @@ -16,6 +16,14 @@ #include "qemu/osdep.h" #include "libqtest.h" =20 +static const uint8_t kernel_mcf5208[] =3D { + 0x41, 0xf9, 0xfc, 0x06, 0x00, 0x00, /* lea 0xfc060000,%a0 */ + 0x10, 0x3c, 0x00, 0x54, /* move.b #'T',%d0 */ + 0x11, 0x7c, 0x00, 0x04, 0x00, 0x08, /* move.b #4,8(%a0) Enable= TX */ + 0x11, 0x40, 0x00, 0x0c, /* move.b %d0,12(%a0) Print = 'T' */ + 0x60, 0xfa /* bra.s loop */ +}; + typedef struct testdef { const char *arch; /* Target architecture */ const char *machine; /* Name of the machine */ @@ -41,6 +49,8 @@ static testdef_t tests[] =3D { { "x86_64", "q35", "-device sga", "SGABIOS" }, { "s390x", "s390-ccw-virtio", "-nodefaults -device sclpconsole,chardev=3Dserial0", "virtio device"= }, + { "m68k", "mcf5208evb", "", "TT", sizeof(kernel_mcf5208), kernel_mcf52= 08 }, + { NULL } }; =20 --=20 2.14.3