* Various fixes and improvements for the functional tests

* Refresh CI container files with the latest changes from libvirt-ci
 * Clean up keyboard code of the next-cube machine to get rid of a legacy API
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmct48QRHHRodXRoQHJl
 ZGhhdC5jb20ACgkQLtnXdP5wLbUAzw//fOgAe+rNX10KIEWaHzTlw6EPRUHbKEo+
 yvy9mZ4CYiK3PfojuW6u9Mt32RIGFjLRUPC+ljZggjbxY2DUjzAUGx/kSwf0bzwE
 8eRKRvd+l3ZFKklwDd7YQh+/O38P/uAq+T0AZQv/9h7rr0wPD6O+sVpKjVN4akuh
 66Ekz974bDFaVJi8iIix0WCPCUFMZwWQqxaQrnoBH3wN8Ibc6Ermchs7aa1e6KNh
 DoX519JVNofXbugONNnqEjp43tbx/hzPZFyWf9tyX8ehp6+8po0zcZZwqdRkWhuv
 BkESKPz8rHuQOGMjm8rAnjmDEsbpJ+vOfn/ShdyAERv78mTNWwSvYVwq5zfpcTCt
 9gpCNhhFzFLKlbDeIfgy9ky4R8Gzrww3icLzCsLlat6YCK547YkSr57BsYXJzLX4
 /NUYsaJ1RPdutwgNnmSzhBhObtUik3rFYH5aD0ETWZBdVY8ig5OqGpJ29P5zo860
 ROVFn4RX/XpmODOpYez4dwKVetR5SLHNG1aqduWKOwhAxPzLxK5OghjYkGf0bsel
 gA9t7A1TafgneYxJARKi7esD39xeUzhfzdzCOIOLXJga5kD2/bvZnQ4tkoLPl8QR
 iQEp1z758XmSFTYfzGUDA7SgIOzi9JG5dqtzcqJklr9wYurxwMYmqicJqA4ImoQt
 fZV/axe8Em0=
 =YRCB
 -----END PGP SIGNATURE-----

Merge tag 'pull-request-2024-11-08' of https://gitlab.com/thuth/qemu into staging

* Various fixes and improvements for the functional tests
* Refresh CI container files with the latest changes from libvirt-ci
* Clean up keyboard code of the next-cube machine to get rid of a legacy API

# -----BEGIN PGP SIGNATURE-----
#
# iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmct48QRHHRodXRoQHJl
# ZGhhdC5jb20ACgkQLtnXdP5wLbUAzw//fOgAe+rNX10KIEWaHzTlw6EPRUHbKEo+
# yvy9mZ4CYiK3PfojuW6u9Mt32RIGFjLRUPC+ljZggjbxY2DUjzAUGx/kSwf0bzwE
# 8eRKRvd+l3ZFKklwDd7YQh+/O38P/uAq+T0AZQv/9h7rr0wPD6O+sVpKjVN4akuh
# 66Ekz974bDFaVJi8iIix0WCPCUFMZwWQqxaQrnoBH3wN8Ibc6Ermchs7aa1e6KNh
# DoX519JVNofXbugONNnqEjp43tbx/hzPZFyWf9tyX8ehp6+8po0zcZZwqdRkWhuv
# BkESKPz8rHuQOGMjm8rAnjmDEsbpJ+vOfn/ShdyAERv78mTNWwSvYVwq5zfpcTCt
# 9gpCNhhFzFLKlbDeIfgy9ky4R8Gzrww3icLzCsLlat6YCK547YkSr57BsYXJzLX4
# /NUYsaJ1RPdutwgNnmSzhBhObtUik3rFYH5aD0ETWZBdVY8ig5OqGpJ29P5zo860
# ROVFn4RX/XpmODOpYez4dwKVetR5SLHNG1aqduWKOwhAxPzLxK5OghjYkGf0bsel
# gA9t7A1TafgneYxJARKi7esD39xeUzhfzdzCOIOLXJga5kD2/bvZnQ4tkoLPl8QR
# iQEp1z758XmSFTYfzGUDA7SgIOzi9JG5dqtzcqJklr9wYurxwMYmqicJqA4ImoQt
# fZV/axe8Em0=
# =YRCB
# -----END PGP SIGNATURE-----
# gpg: Signature made Fri 08 Nov 2024 10:11:16 GMT
# gpg:                using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5
# gpg:                issuer "thuth@redhat.com"
# gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full]
# gpg:                 aka "Thomas Huth <thuth@redhat.com>" [full]
# gpg:                 aka "Thomas Huth <huth@tuxfamily.org>" [full]
# gpg:                 aka "Thomas Huth <th.huth@posteo.de>" [unknown]
# Primary key fingerprint: 27B8 8847 EEE0 2501 18F3  EAB9 2ED9 D774 FE70 2DB5

* tag 'pull-request-2024-11-08' of https://gitlab.com/thuth/qemu:
  ui/input-legacy.c: remove unused legacy qemu_add_kbd_event_handler() function
  next-kbd: convert to use qemu_input_handler_register()
  tests: refresh package lists with latest libvirt-ci
  tests/functional: Split the test_aarch64_sbsaref test
  tests/functional: Bump timeouts of functional tests
  tests/functional: Provide the user with hints where to find more log files
  tests/functional: Fix the ppc64_hv and the ppc_40p test for read-only assets
  test/functional: Fix Aspeed buildroot tests
  tests/functional: Convert the riscv_opensbi avocado test into a standalone test
  scripts/checkpatch.pl: Ignore ObjC #import lines for operator spacing

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2024-11-08 14:47:29 +00:00
commit 134b443512
28 changed files with 391 additions and 340 deletions

View File

@ -10,7 +10,7 @@ CROSS_PKGS=''
MAKE='/usr/local/bin/gmake'
NINJA='/usr/local/bin/ninja'
PACKAGING_COMMAND='pkg'
PIP3='/usr/local/bin/pip-3.8'
PIP3='/usr/local/bin/pip'
PKGS='alsa-lib bash bison bzip2 ca_root_nss capstone4 ccache cmocka ctags curl cyrus-sasl dbus diffutils dtc flex fusefs-libs3 gettext git glib gmake gnutls gsed gtk-vnc gtk3 json-c libepoxy libffi libgcrypt libjpeg-turbo libnfs libslirp libspice-server libssh libtasn1 llvm lzo2 meson mtools ncurses nettle ninja opencv pixman pkgconf png py311-numpy py311-pillow py311-pip py311-pyyaml py311-sphinx py311-sphinx_rtd_theme py311-tomli python3 rpm2cpio rust rust-bindgen-cli sdl2 sdl2_image snappy sndio socat spice-protocol tesseract usbredir virglrenderer vte3 xorriso zstd'
PYPI_PKGS=''
PYTHON='/usr/local/bin/python3'

View File

@ -329,6 +329,7 @@ F: hw/intc/riscv*
F: include/hw/riscv/
F: linux-user/host/riscv32/
F: linux-user/host/riscv64/
F: tests/functional/test_riscv*
F: tests/tcg/riscv64/
RISC-V XThead* extensions
@ -923,7 +924,7 @@ F: hw/misc/sbsa_ec.c
F: hw/watchdog/sbsa_gwdt.c
F: include/hw/watchdog/sbsa_gwdt.h
F: docs/system/arm/sbsa.rst
F: tests/functional/test_aarch64_sbsaref.py
F: tests/functional/test_aarch64_sbsaref*.py
Sharp SL-5500 (Collie) PDA
M: Peter Maydell <peter.maydell@linaro.org>

View File

@ -68,7 +68,6 @@ struct NextKBDState {
uint16_t shift;
};
static void queue_code(void *opaque, int code);
/* lots of magic numbers here */
static uint32_t kbd_read_byte(void *opaque, hwaddr addr)
@ -166,68 +165,70 @@ static const MemoryRegionOps kbd_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
static void nextkbd_event(void *opaque, int ch)
{
/*
* Will want to set vars for caps/num lock
* if (ch & 0x80) -> key release
* there's also e0 escaped scancodes that might need to be handled
*/
queue_code(opaque, ch);
}
static const int qcode_to_nextkbd_keycode[] = {
[Q_KEY_CODE_ESC] = 0x49,
[Q_KEY_CODE_1] = 0x4a,
[Q_KEY_CODE_2] = 0x4b,
[Q_KEY_CODE_3] = 0x4c,
[Q_KEY_CODE_4] = 0x4d,
[Q_KEY_CODE_5] = 0x50,
[Q_KEY_CODE_6] = 0x4f,
[Q_KEY_CODE_7] = 0x4e,
[Q_KEY_CODE_8] = 0x1e,
[Q_KEY_CODE_9] = 0x1f,
[Q_KEY_CODE_0] = 0x20,
[Q_KEY_CODE_MINUS] = 0x1d,
[Q_KEY_CODE_EQUAL] = 0x1c,
[Q_KEY_CODE_BACKSPACE] = 0x1b,
static const unsigned char next_keycodes[128] = {
0x00, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x50, 0x4F,
0x4E, 0x1E, 0x1F, 0x20, 0x1D, 0x1C, 0x1B, 0x00,
0x42, 0x43, 0x44, 0x45, 0x48, 0x47, 0x46, 0x06,
0x07, 0x08, 0x00, 0x00, 0x2A, 0x00, 0x39, 0x3A,
0x3B, 0x3C, 0x3D, 0x40, 0x3F, 0x3E, 0x2D, 0x2C,
0x2B, 0x26, 0x00, 0x00, 0x31, 0x32, 0x33, 0x34,
0x35, 0x37, 0x36, 0x2e, 0x2f, 0x30, 0x00, 0x00,
0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
[Q_KEY_CODE_Q] = 0x42,
[Q_KEY_CODE_W] = 0x43,
[Q_KEY_CODE_E] = 0x44,
[Q_KEY_CODE_R] = 0x45,
[Q_KEY_CODE_T] = 0x48,
[Q_KEY_CODE_Y] = 0x47,
[Q_KEY_CODE_U] = 0x46,
[Q_KEY_CODE_I] = 0x06,
[Q_KEY_CODE_O] = 0x07,
[Q_KEY_CODE_P] = 0x08,
[Q_KEY_CODE_RET] = 0x2a,
[Q_KEY_CODE_A] = 0x39,
[Q_KEY_CODE_S] = 0x3a,
[Q_KEY_CODE_D] = 0x3b,
[Q_KEY_CODE_F] = 0x3c,
[Q_KEY_CODE_G] = 0x3d,
[Q_KEY_CODE_H] = 0x40,
[Q_KEY_CODE_J] = 0x3f,
[Q_KEY_CODE_K] = 0x3e,
[Q_KEY_CODE_L] = 0x2d,
[Q_KEY_CODE_SEMICOLON] = 0x2c,
[Q_KEY_CODE_APOSTROPHE] = 0x2b,
[Q_KEY_CODE_GRAVE_ACCENT] = 0x26,
[Q_KEY_CODE_Z] = 0x31,
[Q_KEY_CODE_X] = 0x32,
[Q_KEY_CODE_C] = 0x33,
[Q_KEY_CODE_V] = 0x34,
[Q_KEY_CODE_B] = 0x35,
[Q_KEY_CODE_N] = 0x37,
[Q_KEY_CODE_M] = 0x36,
[Q_KEY_CODE_COMMA] = 0x2e,
[Q_KEY_CODE_DOT] = 0x2f,
[Q_KEY_CODE_SLASH] = 0x30,
[Q_KEY_CODE_SPC] = 0x38,
};
static void queue_code(void *opaque, int code)
static void nextkbd_put_keycode(NextKBDState *s, int keycode)
{
NextKBDState *s = NEXTKBD(opaque);
KBDQueue *q = &s->queue;
int key = code & KD_KEYMASK;
int release = code & 0x80;
static int ext;
if (code == 0xE0) {
ext = 1;
}
if (code == 0x2A || code == 0x1D || code == 0x36) {
if (code == 0x2A) {
s->shift = KD_LSHIFT;
} else if (code == 0x36) {
s->shift = KD_RSHIFT;
ext = 0;
} else if (code == 0x1D && !ext) {
s->shift = KD_LCOMM;
} else if (code == 0x1D && ext) {
ext = 0;
s->shift = KD_RCOMM;
}
return;
} else if (code == (0x2A | 0x80) || code == (0x1D | 0x80) ||
code == (0x36 | 0x80)) {
s->shift = 0;
return;
}
if (q->count >= KBD_QUEUE_SIZE) {
return;
}
q->data[q->wptr] = next_keycodes[key] | release;
q->data[q->wptr] = keycode;
if (++q->wptr == KBD_QUEUE_SIZE) {
q->wptr = 0;
}
@ -241,6 +242,53 @@ static void queue_code(void *opaque, int code)
/* s->update_irq(s->update_arg, 1); */
}
static void nextkbd_event(DeviceState *dev, QemuConsole *src, InputEvent *evt)
{
NextKBDState *s = NEXTKBD(dev);
int qcode, keycode;
bool key_down = evt->u.key.data->down;
qcode = qemu_input_key_value_to_qcode(evt->u.key.data->key);
if (qcode >= ARRAY_SIZE(qcode_to_nextkbd_keycode)) {
return;
}
/* Shift key currently has no keycode, so handle separately */
if (qcode == Q_KEY_CODE_SHIFT) {
if (key_down) {
s->shift |= KD_LSHIFT;
} else {
s->shift &= ~KD_LSHIFT;
}
}
if (qcode == Q_KEY_CODE_SHIFT_R) {
if (key_down) {
s->shift |= KD_RSHIFT;
} else {
s->shift &= ~KD_RSHIFT;
}
}
keycode = qcode_to_nextkbd_keycode[qcode];
if (!keycode) {
return;
}
/* If key release event, create keyboard break code */
if (!key_down) {
keycode |= 0x80;
}
nextkbd_put_keycode(s, keycode);
}
static const QemuInputHandler nextkbd_handler = {
.name = "QEMU NeXT Keyboard",
.mask = INPUT_EVENT_MASK_KEY,
.event = nextkbd_event,
};
static void nextkbd_reset(DeviceState *dev)
{
NextKBDState *nks = NEXTKBD(dev);
@ -256,7 +304,7 @@ static void nextkbd_realize(DeviceState *dev, Error **errp)
memory_region_init_io(&s->mr, OBJECT(dev), &kbd_ops, s, "next.kbd", 0x1000);
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mr);
qemu_add_kbd_event_handler(nextkbd_event, s);
qemu_input_handler_register(dev, &nextkbd_handler);
}
static const VMStateDescription nextkbd_vmstate = {

View File

@ -70,8 +70,6 @@ typedef struct QEMUPutMouseEntry QEMUPutMouseEntry;
typedef struct QEMUPutKbdEntry QEMUPutKbdEntry;
typedef struct QEMUPutLEDEntry QEMUPutLEDEntry;
QEMUPutKbdEntry *qemu_add_kbd_event_handler(QEMUPutKBDEvent *func,
void *opaque);
QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
void *opaque, int absolute,
const char *name);

View File

@ -2246,7 +2246,7 @@ sub process {
}
}
# Check operator spacing.
if (!($line=~/\#\s*include/)) {
if (!($line=~/\#\s*(include|import)/)) {
my $ops = qr{
<<=|>>=|<=|>=|==|!=|
\+=|-=|\*=|\/=|%=|\^=|\|=|&=|

View File

@ -1,63 +0,0 @@
# OpenSBI boot test for RISC-V machines
#
# Copyright (c) 2022, Ventana Micro
#
# This work is licensed under the terms of the GNU GPL, version 2 or
# later. See the COPYING file in the top-level directory.
from avocado_qemu import QemuSystemTest
from avocado_qemu import wait_for_console_pattern
class RiscvOpenSBI(QemuSystemTest):
"""
:avocado: tags=accel:tcg
"""
timeout = 5
def boot_opensbi(self):
self.vm.set_console()
self.vm.launch()
wait_for_console_pattern(self, 'Platform Name')
wait_for_console_pattern(self, 'Boot HART MEDELEG')
def test_riscv32_spike(self):
"""
:avocado: tags=arch:riscv32
:avocado: tags=machine:spike
"""
self.boot_opensbi()
def test_riscv64_spike(self):
"""
:avocado: tags=arch:riscv64
:avocado: tags=machine:spike
"""
self.boot_opensbi()
def test_riscv32_sifive_u(self):
"""
:avocado: tags=arch:riscv32
:avocado: tags=machine:sifive_u
"""
self.boot_opensbi()
def test_riscv64_sifive_u(self):
"""
:avocado: tags=arch:riscv64
:avocado: tags=machine:sifive_u
"""
self.boot_opensbi()
def test_riscv32_virt(self):
"""
:avocado: tags=arch:riscv32
:avocado: tags=machine:virt
"""
self.boot_opensbi()
def test_riscv64_virt(self):
"""
:avocado: tags=arch:riscv64
:avocado: tags=machine:virt
"""
self.boot_opensbi()

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -109,6 +105,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libglusterfs-dev:amd64 \
libgnutls28-dev:amd64 \
libgtk-3-dev:amd64 \
libgtk-vnc-2.0-dev:amd64 \
libibverbs-dev:amd64 \
libiscsi-dev:amd64 \
libjemalloc-dev:amd64 \
@ -120,6 +117,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:amd64 \
libnuma-dev:amd64 \
libpam0g-dev:amd64 \
libpcre2-dev:amd64 \
libpipewire-0.3-dev:amd64 \
libpixman-1-dev:amd64 \
libpmem-dev:amd64 \
@ -134,6 +132,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:amd64 \
libslirp-dev:amd64 \
libsnappy-dev:amd64 \
libsndio-dev:amd64 \
libspice-protocol-dev:amd64 \
libspice-server-dev:amd64 \
libssh-gcrypt-dev:amd64 \
libsystemd-dev:amd64 \

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -109,6 +105,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libglusterfs-dev:arm64 \
libgnutls28-dev:arm64 \
libgtk-3-dev:arm64 \
libgtk-vnc-2.0-dev:arm64 \
libibverbs-dev:arm64 \
libiscsi-dev:arm64 \
libjemalloc-dev:arm64 \
@ -120,6 +117,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:arm64 \
libnuma-dev:arm64 \
libpam0g-dev:arm64 \
libpcre2-dev:arm64 \
libpipewire-0.3-dev:arm64 \
libpixman-1-dev:arm64 \
libpng-dev:arm64 \
@ -133,6 +131,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:arm64 \
libslirp-dev:arm64 \
libsnappy-dev:arm64 \
libsndio-dev:arm64 \
libspice-protocol-dev:arm64 \
libspice-server-dev:arm64 \
libssh-gcrypt-dev:arm64 \
libsystemd-dev:arm64 \

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -109,6 +105,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libglusterfs-dev:armhf \
libgnutls28-dev:armhf \
libgtk-3-dev:armhf \
libgtk-vnc-2.0-dev:armhf \
libibverbs-dev:armhf \
libiscsi-dev:armhf \
libjemalloc-dev:armhf \
@ -120,6 +117,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:armhf \
libnuma-dev:armhf \
libpam0g-dev:armhf \
libpcre2-dev:armhf \
libpipewire-0.3-dev:armhf \
libpixman-1-dev:armhf \
libpng-dev:armhf \
@ -133,6 +131,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:armhf \
libslirp-dev:armhf \
libsnappy-dev:armhf \
libsndio-dev:armhf \
libspice-protocol-dev:armhf \
libspice-server-dev:armhf \
libssh-gcrypt-dev:armhf \
libsystemd-dev:armhf \

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -109,6 +105,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libglusterfs-dev:i386 \
libgnutls28-dev:i386 \
libgtk-3-dev:i386 \
libgtk-vnc-2.0-dev:i386 \
libibverbs-dev:i386 \
libiscsi-dev:i386 \
libjemalloc-dev:i386 \
@ -120,6 +117,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:i386 \
libnuma-dev:i386 \
libpam0g-dev:i386 \
libpcre2-dev:i386 \
libpipewire-0.3-dev:i386 \
libpixman-1-dev:i386 \
libpng-dev:i386 \
@ -133,6 +131,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:i386 \
libslirp-dev:i386 \
libsnappy-dev:i386 \
libsndio-dev:i386 \
libspice-protocol-dev:i386 \
libspice-server-dev:i386 \
libssh-gcrypt-dev:i386 \
libsystemd-dev:i386 \

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -115,6 +111,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:mips64el \
libnuma-dev:mips64el \
libpam0g-dev:mips64el \
libpcre2-dev:mips64el \
libpipewire-0.3-dev:mips64el \
libpixman-1-dev:mips64el \
libpng-dev:mips64el \
@ -126,6 +123,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:mips64el \
libslirp-dev:mips64el \
libsnappy-dev:mips64el \
libsndio-dev:mips64el \
libspice-protocol-dev:mips64el \
libspice-server-dev:mips64el \
libssh-gcrypt-dev:mips64el \
libsystemd-dev:mips64el \

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -108,6 +104,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libglusterfs-dev:mipsel \
libgnutls28-dev:mipsel \
libgtk-3-dev:mipsel \
libgtk-vnc-2.0-dev:mipsel \
libibverbs-dev:mipsel \
libiscsi-dev:mipsel \
libjemalloc-dev:mipsel \
@ -119,6 +116,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:mipsel \
libnuma-dev:mipsel \
libpam0g-dev:mipsel \
libpcre2-dev:mipsel \
libpipewire-0.3-dev:mipsel \
libpixman-1-dev:mipsel \
libpng-dev:mipsel \
@ -132,6 +130,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:mipsel \
libslirp-dev:mipsel \
libsnappy-dev:mipsel \
libsndio-dev:mipsel \
libspice-protocol-dev:mipsel \
libspice-server-dev:mipsel \
libssh-gcrypt-dev:mipsel \
libsystemd-dev:mipsel \

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -109,6 +105,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libglusterfs-dev:ppc64el \
libgnutls28-dev:ppc64el \
libgtk-3-dev:ppc64el \
libgtk-vnc-2.0-dev:ppc64el \
libibverbs-dev:ppc64el \
libiscsi-dev:ppc64el \
libjemalloc-dev:ppc64el \
@ -120,6 +117,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:ppc64el \
libnuma-dev:ppc64el \
libpam0g-dev:ppc64el \
libpcre2-dev:ppc64el \
libpipewire-0.3-dev:ppc64el \
libpixman-1-dev:ppc64el \
libpng-dev:ppc64el \
@ -133,6 +131,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:ppc64el \
libslirp-dev:ppc64el \
libsnappy-dev:ppc64el \
libsndio-dev:ppc64el \
libspice-protocol-dev:ppc64el \
libspice-server-dev:ppc64el \
libssh-gcrypt-dev:ppc64el \
libsystemd-dev:ppc64el \

View File

@ -31,10 +31,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
git \
hostname \
libglib2.0-dev \
libgtk-vnc-2.0-dev \
libpcre2-dev \
libsndio-dev \
libspice-protocol-dev \
llvm \
locales \
make \
@ -109,6 +105,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libglusterfs-dev:s390x \
libgnutls28-dev:s390x \
libgtk-3-dev:s390x \
libgtk-vnc-2.0-dev:s390x \
libibverbs-dev:s390x \
libiscsi-dev:s390x \
libjemalloc-dev:s390x \
@ -120,6 +117,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libnfs-dev:s390x \
libnuma-dev:s390x \
libpam0g-dev:s390x \
libpcre2-dev:s390x \
libpipewire-0.3-dev:s390x \
libpixman-1-dev:s390x \
libpng-dev:s390x \
@ -133,6 +131,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libselinux1-dev:s390x \
libslirp-dev:s390x \
libsnappy-dev:s390x \
libsndio-dev:s390x \
libspice-protocol-dev:s390x \
libssh-gcrypt-dev:s390x \
libsystemd-dev:s390x \
libtasn1-6-dev:s390x \

View File

@ -35,7 +35,6 @@ exec "$@"\n' > /usr/bin/nosync && \
git \
glib2-devel \
glibc-langpack-en \
gtk-vnc2-devel \
hostname \
llvm \
make \
@ -44,7 +43,6 @@ exec "$@"\n' > /usr/bin/nosync && \
ninja-build \
nmap-ncat \
openssh-clients \
pcre-static \
python3 \
python3-PyYAML \
python3-numpy \
@ -58,7 +56,6 @@ exec "$@"\n' > /usr/bin/nosync && \
sed \
socat \
sparse \
spice-protocol \
swtpm \
tar \
tesseract \
@ -89,6 +86,7 @@ RUN nosync dnf install -y \
mingw64-gettext \
mingw64-glib2 \
mingw64-gnutls \
mingw64-gtk-vnc2 \
mingw64-gtk3 \
mingw64-libepoxy \
mingw64-libgcrypt \

View File

@ -11,24 +11,27 @@ endif
# Timeouts for individual tests that can be slow e.g. with debugging enabled
test_timeouts = {
'aarch64_raspi4' : 120,
'aarch64_sbsaref' : 600,
'aarch64_virt' : 360,
'acpi_bits' : 240,
'aarch64_raspi4' : 480,
'aarch64_sbsaref_alpine' : 720,
'aarch64_sbsaref_freebsd' : 720,
'aarch64_virt' : 720,
'acpi_bits' : 420,
'arm_aspeed' : 600,
'arm_bpim2u' : 360,
'arm_bpim2u' : 500,
'arm_collie' : 180,
'arm_orangepi' : 540,
'arm_raspi2' : 120,
'arm_tuxrun' : 120,
'arm_tuxrun' : 240,
'arm_sx1' : 360,
'mips_malta' : 120,
'netdev_ethtool' : 180,
'ppc_40p' : 240,
'ppc64_hv' : 1000,
'ppc64_powernv' : 240,
'ppc64_pseries' : 240,
'ppc64_tuxrun' : 240,
's390x_ccw_virtio' : 240,
'ppc64_powernv' : 480,
'ppc64_pseries' : 480,
'ppc64_tuxrun' : 420,
'riscv64_tuxrun' : 120,
's390x_ccw_virtio' : 420,
}
tests_generic_system = [
@ -47,6 +50,8 @@ tests_aarch64_system_thorough = [
'aarch64_raspi3',
'aarch64_raspi4',
'aarch64_sbsaref',
'aarch64_sbsaref_alpine',
'aarch64_sbsaref_freebsd',
'aarch64_virt',
'multiprocess',
]
@ -146,18 +151,26 @@ tests_ppc64_system_thorough = [
'ppc64_tuxrun',
]
tests_rx_system_thorough = [
'rx_gdbsim',
tests_riscv32_system_quick = [
'riscv_opensbi',
]
tests_riscv32_system_thorough = [
'riscv32_tuxrun',
]
tests_riscv64_system_quick = [
'riscv_opensbi',
]
tests_riscv64_system_thorough = [
'riscv64_tuxrun',
]
tests_rx_system_thorough = [
'rx_gdbsim',
]
tests_s390x_system_thorough = [
's390x_ccw_virtio',
's390x_topology',
@ -273,8 +286,8 @@ foreach speed : ['quick', 'thorough']
env: test_env,
args: [testpath],
protocol: 'tap',
timeout: test_timeouts.get(test, 60),
priority: test_timeouts.get(test, 60),
timeout: test_timeouts.get(test, 90),
priority: test_timeouts.get(test, 90),
suite: suites)
endforeach
endforeach

View File

@ -45,10 +45,10 @@ class QemuBaseTest(unittest.TestCase):
os.makedirs(self.workdir, exist_ok=True)
self.logdir = self.workdir
self.log_filename = os.path.join(self.logdir, 'base.log')
self.log = logging.getLogger('qemu-test')
self.log.setLevel(logging.DEBUG)
self._log_fh = logging.FileHandler(os.path.join(self.logdir,
'base.log'), mode='w')
self._log_fh = logging.FileHandler(self.log_filename, mode='w')
self._log_fh.setLevel(logging.DEBUG)
fileFormatter = logging.Formatter(
'%(asctime)s - %(levelname)s: %(message)s')
@ -68,7 +68,14 @@ class QemuBaseTest(unittest.TestCase):
tr = pycotap.TAPTestRunner(message_log = pycotap.LogMode.LogToError,
test_output_log = pycotap.LogMode.LogToError)
unittest.main(module = None, testRunner = tr, argv=["__dummy__", path])
res = unittest.main(module = None, testRunner = tr, exit = False,
argv=["__dummy__", path])
for (test, message) in res.result.errors + res.result.failures:
print('More information on ' + test.id() + ' could be found here:'
'\n %s' % test.log_filename, file=sys.stderr)
if hasattr(test, 'console_log_name'):
print(' %s' % test.console_log_name, file=sys.stderr)
sys.exit(not res.result.wasSuccessful())
class QemuUserTest(QemuBaseTest):
@ -101,8 +108,9 @@ class QemuSystemTest(QemuBaseTest):
console_log = logging.getLogger('console')
console_log.setLevel(logging.DEBUG)
self._console_log_fh = logging.FileHandler(os.path.join(self.workdir,
'console.log'), mode='w')
self.console_log_name = os.path.join(self.workdir, 'console.log')
self._console_log_fh = logging.FileHandler(self.console_log_name,
mode='w')
self._console_log_fh.setLevel(logging.DEBUG)
fileFormatter = logging.Formatter('%(asctime)s: %(message)s')
self._console_log_fh.setFormatter(fileFormatter)

View File

@ -16,6 +16,42 @@ from qemu_test import interrupt_interactive_console_until_pattern
from qemu_test.utils import lzma_uncompress
from unittest import skipUnless
def fetch_firmware(test):
"""
Flash volumes generated using:
Toolchain from Debian:
aarch64-linux-gnu-gcc (Debian 12.2.0-14) 12.2.0
Used components:
- Trusted Firmware v2.11.0
- Tianocore EDK2 4d4f569924
- Tianocore EDK2-platforms 3f08401
"""
# Secure BootRom (TF-A code)
fs0_xz_path = Aarch64SbsarefMachine.ASSET_FLASH0.fetch()
fs0_path = os.path.join(test.workdir, "SBSA_FLASH0.fd")
lzma_uncompress(fs0_xz_path, fs0_path)
# Non-secure rom (UEFI and EFI variables)
fs1_xz_path = Aarch64SbsarefMachine.ASSET_FLASH1.fetch()
fs1_path = os.path.join(test.workdir, "SBSA_FLASH1.fd")
lzma_uncompress(fs1_xz_path, fs1_path)
for path in [fs0_path, fs1_path]:
with open(path, "ab+") as fd:
fd.truncate(256 << 20) # Expand volumes to 256MiB
test.set_machine('sbsa-ref')
test.vm.set_console()
test.vm.add_args(
"-drive", f"if=pflash,file={fs0_path},format=raw",
"-drive", f"if=pflash,file={fs1_path},format=raw",
)
class Aarch64SbsarefMachine(QemuSystemTest):
"""
@ -35,45 +71,9 @@ class Aarch64SbsarefMachine(QemuSystemTest):
'20240619-148232/edk2/SBSA_FLASH1.fd.xz'),
'c6ec39374c4d79bb9e9cdeeb6db44732d90bb4a334cec92002b3f4b9cac4b5ee')
def fetch_firmware(self):
"""
Flash volumes generated using:
Toolchain from Debian:
aarch64-linux-gnu-gcc (Debian 12.2.0-14) 12.2.0
Used components:
- Trusted Firmware v2.11.0
- Tianocore EDK2 4d4f569924
- Tianocore EDK2-platforms 3f08401
"""
# Secure BootRom (TF-A code)
fs0_xz_path = self.ASSET_FLASH0.fetch()
fs0_path = os.path.join(self.workdir, "SBSA_FLASH0.fd")
lzma_uncompress(fs0_xz_path, fs0_path)
# Non-secure rom (UEFI and EFI variables)
fs1_xz_path = self.ASSET_FLASH1.fetch()
fs1_path = os.path.join(self.workdir, "SBSA_FLASH1.fd")
lzma_uncompress(fs1_xz_path, fs1_path)
for path in [fs0_path, fs1_path]:
with open(path, "ab+") as fd:
fd.truncate(256 << 20) # Expand volumes to 256MiB
self.set_machine('sbsa-ref')
self.vm.set_console()
self.vm.add_args(
"-drive", f"if=pflash,file={fs0_path},format=raw",
"-drive", f"if=pflash,file={fs1_path},format=raw",
)
def test_sbsaref_edk2_firmware(self):
self.fetch_firmware()
fetch_firmware(self)
self.vm.add_args('-cpu', 'cortex-a57')
self.vm.launch()
@ -101,90 +101,5 @@ class Aarch64SbsarefMachine(QemuSystemTest):
wait_for_console_pattern(self, "UEFI firmware (version 1.0")
interrupt_interactive_console_until_pattern(self, "QEMU SBSA-REF Machine")
ASSET_ALPINE_ISO = Asset(
('https://dl-cdn.alpinelinux.org/'
'alpine/v3.17/releases/aarch64/alpine-standard-3.17.2-aarch64.iso'),
'5a36304ecf039292082d92b48152a9ec21009d3a62f459de623e19c4bd9dc027')
# This tests the whole boot chain from EFI to Userspace
# We only boot a whole OS for the current top level CPU and GIC
# Other test profiles should use more minimal boots
def boot_alpine_linux(self, cpu=None):
self.fetch_firmware()
iso_path = self.ASSET_ALPINE_ISO.fetch()
self.vm.set_console()
self.vm.add_args(
"-drive", f"file={iso_path},media=cdrom,format=raw",
)
if cpu:
self.vm.add_args("-cpu", cpu)
self.vm.launch()
wait_for_console_pattern(self, "Welcome to Alpine Linux 3.17")
def test_sbsaref_alpine_linux_cortex_a57(self):
self.boot_alpine_linux("cortex-a57")
def test_sbsaref_alpine_linux_default_cpu(self):
self.boot_alpine_linux()
def test_sbsaref_alpine_linux_max_pauth_off(self):
self.boot_alpine_linux("max,pauth=off")
def test_sbsaref_alpine_linux_max_pauth_impdef(self):
self.boot_alpine_linux("max,pauth-impdef=on")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
def test_sbsaref_alpine_linux_max(self):
self.boot_alpine_linux("max")
ASSET_FREEBSD_ISO = Asset(
('https://download.freebsd.org/releases/arm64/aarch64/ISO-IMAGES/'
'14.1/FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.iso'),
'44cdbae275ef1bb6dab1d5fbb59473d4f741e1c8ea8a80fd9e906b531d6ad461')
# This tests the whole boot chain from EFI to Userspace
# We only boot a whole OS for the current top level CPU and GIC
# Other test profiles should use more minimal boots
def boot_freebsd14(self, cpu=None):
self.fetch_firmware()
img_path = self.ASSET_FREEBSD_ISO.fetch()
self.vm.set_console()
self.vm.add_args(
"-drive", f"file={img_path},format=raw,snapshot=on",
)
if cpu:
self.vm.add_args("-cpu", cpu)
self.vm.launch()
wait_for_console_pattern(self, 'Welcome to FreeBSD!')
def test_sbsaref_freebsd14_cortex_a57(self):
self.boot_freebsd14("cortex-a57")
def test_sbsaref_freebsd14_default_cpu(self):
self.boot_freebsd14()
def test_sbsaref_freebsd14_max_pauth_off(self):
self.boot_freebsd14("max,pauth=off")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
def test_sbsaref_freebsd14_max_pauth_impdef(self):
self.boot_freebsd14("max,pauth-impdef=on")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
def test_sbsaref_freebsd14_max(self):
self.boot_freebsd14("max")
if __name__ == '__main__':
QemuSystemTest.main()

View File

@ -0,0 +1,64 @@
#!/usr/bin/env python3
#
# Functional test that boots a kernel and checks the console
#
# SPDX-FileCopyrightText: 2023-2024 Linaro Ltd.
# SPDX-FileContributor: Philippe Mathieu-Daudé <philmd@linaro.org>
# SPDX-FileContributor: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later
import os
from qemu_test import QemuSystemTest, Asset
from qemu_test import wait_for_console_pattern
from qemu_test import interrupt_interactive_console_until_pattern
from unittest import skipUnless
from test_aarch64_sbsaref import fetch_firmware
class Aarch64SbsarefAlpine(QemuSystemTest):
ASSET_ALPINE_ISO = Asset(
('https://dl-cdn.alpinelinux.org/'
'alpine/v3.17/releases/aarch64/alpine-standard-3.17.2-aarch64.iso'),
'5a36304ecf039292082d92b48152a9ec21009d3a62f459de623e19c4bd9dc027')
# This tests the whole boot chain from EFI to Userspace
# We only boot a whole OS for the current top level CPU and GIC
# Other test profiles should use more minimal boots
def boot_alpine_linux(self, cpu=None):
fetch_firmware(self)
iso_path = self.ASSET_ALPINE_ISO.fetch()
self.vm.set_console()
self.vm.add_args(
"-drive", f"file={iso_path},media=cdrom,format=raw",
)
if cpu:
self.vm.add_args("-cpu", cpu)
self.vm.launch()
wait_for_console_pattern(self, "Welcome to Alpine Linux 3.17")
def test_sbsaref_alpine_linux_cortex_a57(self):
self.boot_alpine_linux("cortex-a57")
def test_sbsaref_alpine_linux_default_cpu(self):
self.boot_alpine_linux()
def test_sbsaref_alpine_linux_max_pauth_off(self):
self.boot_alpine_linux("max,pauth=off")
def test_sbsaref_alpine_linux_max_pauth_impdef(self):
self.boot_alpine_linux("max,pauth-impdef=on")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
def test_sbsaref_alpine_linux_max(self):
self.boot_alpine_linux("max")
if __name__ == '__main__':
QemuSystemTest.main()

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python3
#
# Functional test that boots a kernel and checks the console
#
# SPDX-FileCopyrightText: 2023-2024 Linaro Ltd.
# SPDX-FileContributor: Philippe Mathieu-Daudé <philmd@linaro.org>
# SPDX-FileContributor: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
#
# SPDX-License-Identifier: GPL-2.0-or-later
import os
from qemu_test import QemuSystemTest, Asset
from qemu_test import wait_for_console_pattern
from qemu_test import interrupt_interactive_console_until_pattern
from unittest import skipUnless
from test_aarch64_sbsaref import fetch_firmware
class Aarch64SbsarefFreeBSD(QemuSystemTest):
ASSET_FREEBSD_ISO = Asset(
('https://download.freebsd.org/releases/arm64/aarch64/ISO-IMAGES/'
'14.1/FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.iso'),
'44cdbae275ef1bb6dab1d5fbb59473d4f741e1c8ea8a80fd9e906b531d6ad461')
# This tests the whole boot chain from EFI to Userspace
# We only boot a whole OS for the current top level CPU and GIC
# Other test profiles should use more minimal boots
def boot_freebsd14(self, cpu=None):
fetch_firmware(self)
img_path = self.ASSET_FREEBSD_ISO.fetch()
self.vm.set_console()
self.vm.add_args(
"-drive", f"file={img_path},format=raw,snapshot=on",
)
if cpu:
self.vm.add_args("-cpu", cpu)
self.vm.launch()
wait_for_console_pattern(self, 'Welcome to FreeBSD!')
def test_sbsaref_freebsd14_cortex_a57(self):
self.boot_freebsd14("cortex-a57")
def test_sbsaref_freebsd14_default_cpu(self):
self.boot_freebsd14()
def test_sbsaref_freebsd14_max_pauth_off(self):
self.boot_freebsd14("max,pauth=off")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
def test_sbsaref_freebsd14_max_pauth_impdef(self):
self.boot_freebsd14("max,pauth-impdef=on")
@skipUnless(os.getenv('QEMU_TEST_TIMEOUT_EXPECTED'),
'Test might timeout due to PAuth emulation')
def test_sbsaref_freebsd14_max(self):
self.boot_freebsd14("max")
if __name__ == '__main__':
QemuSystemTest.main()

2
tests/functional/test_arm_aspeed.py Normal file → Executable file
View File

@ -125,7 +125,7 @@ class AST2x00Machine(LinuxKernelTest):
def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
self.require_netdev('user')
self.vm.set_console()
self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw,read-only=true',
'-net', 'nic', '-net', 'user')
self.vm.launch()

View File

@ -99,7 +99,8 @@ class HypervisorTest(QemuSystemTest):
self.vm.add_args("-kernel", self.vmlinuz)
self.vm.add_args("-initrd", self.initramfs)
self.vm.add_args("-smp", "4", "-m", "2g")
self.vm.add_args("-drive", f"file={self.iso_path},format=raw,if=none,id=drive0")
self.vm.add_args("-drive", f"file={self.iso_path},format=raw,if=none,"
"id=drive0,read-only=true")
self.vm.launch()
wait_for_console_pattern(self, 'Welcome to Alpine Linux 3.18')

View File

@ -46,7 +46,8 @@ class IbmPrep40pMachine(QemuSystemTest):
self.vm.set_console()
self.vm.add_args('-bios', bios_path,
'-fda', drive_path)
'-drive',
f"file={drive_path},format=raw,if=floppy,read-only=true")
self.vm.launch()
os_banner = 'NetBSD 4.0 (GENERIC) #0: Sun Dec 16 00:49:40 PST 2007'
wait_for_console_pattern(self, os_banner)

View File

@ -0,0 +1,36 @@
#!/usr/bin/env python3
#
# OpenSBI boot test for RISC-V machines
#
# Copyright (c) 2022, Ventana Micro
#
# This work is licensed under the terms of the GNU GPL, version 2 or
# later. See the COPYING file in the top-level directory.
from qemu_test import QemuSystemTest
from qemu_test import wait_for_console_pattern
class RiscvOpenSBI(QemuSystemTest):
timeout = 5
def boot_opensbi(self):
self.vm.set_console()
self.vm.launch()
wait_for_console_pattern(self, 'Platform Name')
wait_for_console_pattern(self, 'Boot HART MEDELEG')
def test_riscv_spike(self):
self.set_machine('spike')
self.boot_opensbi()
def test_riscv_sifive_u(self):
self.set_machine('sifive_u')
self.boot_opensbi()
def test_riscv_virt(self):
self.set_machine('virt')
self.boot_opensbi()
if __name__ == '__main__':
QemuSystemTest.main()

@ -1 +1 @@
Subproject commit 6b19006b2cbe01adea6a857c71860a8e7ba7ddd7
Subproject commit 9ad3f70bde9865d5ad18f36d256d472e72b5cbf3

View File

@ -17,6 +17,9 @@ mappings:
libepoxy:
mips64el-deb:
gtk-vnc:
mips64el-deb:
mesa-libgbm:
mips64el-deb:

View File

@ -5,7 +5,7 @@
"make": "/usr/local/bin/gmake",
"ninja": "/usr/local/bin/ninja",
"packaging_command": "pkg",
"pip3": "/usr/local/bin/pip-3.8",
"pip3": "/usr/local/bin/pip",
"pkgs": [
"alsa-lib",
"bash",

View File

@ -109,43 +109,6 @@ void qmp_send_key(KeyValueList *keys, bool has_hold_time, int64_t hold_time,
g_free(up);
}
static void legacy_kbd_event(DeviceState *dev, QemuConsole *src,
InputEvent *evt)
{
QEMUPutKbdEntry *entry = (QEMUPutKbdEntry *)dev;
int scancodes[3], i, count;
InputKeyEvent *key = evt->u.key.data;
if (!entry || !entry->put_kbd) {
return;
}
count = qemu_input_key_value_to_scancode(key->key,
key->down,
scancodes);
for (i = 0; i < count; i++) {
entry->put_kbd(entry->opaque, scancodes[i]);
}
}
static const QemuInputHandler legacy_kbd_handler = {
.name = "legacy-kbd",
.mask = INPUT_EVENT_MASK_KEY,
.event = legacy_kbd_event,
};
QEMUPutKbdEntry *qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
{
QEMUPutKbdEntry *entry;
entry = g_new0(QEMUPutKbdEntry, 1);
entry->put_kbd = func;
entry->opaque = opaque;
entry->s = qemu_input_handler_register((DeviceState *)entry,
&legacy_kbd_handler);
qemu_input_handler_activate(entry->s);
return entry;
}
static void legacy_mouse_event(DeviceState *dev, QemuConsole *src,
InputEvent *evt)
{