From nobody Wed Nov 27 02:37:57 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1701062557; cv=none; d=zohomail.com; s=zohoarc; b=a448+cbNTFuLIdgQd9rSlaegPA1eeJVMM0USDHofKx4lg+MTn2xycuUJzfuWef1GLg0DgpafubBay8o2hX3k/Lx0yGNHN+K7XUnUDQT9hgBRm2+0/1GJ/FafrAMnEaQx8nOIVYpEESvU3f7bx5/n5hf+fGyxgCSt/c9q2kd6EmU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1701062557; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mrIvw/c7ANbXl/qBEcZRfQxui2zzTTLXuYa9rLTlQvE=; b=bR+MbYWQHFWTuxNT+tdVl1a1xLMzbIWBEMxZdpp6B8VDMl7U4x9ByR+hWWPcH4dLYGzJPhenOOCyqFoxCVpI6rIel3FpxEyAG/oqF3PQpH85YJQI8vQzGJlECzx9LIHyS8eg9TAOTtYVQw/cPFSaqcvPKPSK9O1MKlEte2Nz7tg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1701062557323226.7400505747338; Sun, 26 Nov 2023 21:22:37 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r7U4I-0004S7-72; Mon, 27 Nov 2023 00:22:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r7U4G-0004Rj-ND for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:00 -0500 Received: from mail-ot1-x344.google.com ([2607:f8b0:4864:20::344]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r7U4D-0008Au-At for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:00 -0500 Received: by mail-ot1-x344.google.com with SMTP id 46e09a7af769-6ce322b62aeso2215950a34.3 for ; Sun, 26 Nov 2023 21:21:56 -0800 (PST) Received: from amd.. ([2804:7f0:b402:7782:3e7c:3fff:fe7a:e83b]) by smtp.gmail.com with ESMTPSA id v13-20020aa7808d000000b006cb9f436232sm6392316pff.114.2023.11.26.21.21.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Nov 2023 21:21:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1701062516; x=1701667316; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mrIvw/c7ANbXl/qBEcZRfQxui2zzTTLXuYa9rLTlQvE=; b=N/zxCT0P7gHHdafFKJ9mZgFKUqHtsw9fkL6Ig4h6p4RVvGtiHGz0kpLJgJ2ijVKylN 5qvg8FZUIhp52tabSUF85uoizxkN5F0+4QiWbMfgwSZ68EdwXnw2E13ItaGhOLHAn/dG pLxOOOpmsOAIKIJWOsUly5s1K0fzeYXi4aXvthE+xoj4+vqriNoP1b30sf9ZVmIbfmBA MWzvYOg3y6cB5p44nQ3S+fe3/Vp0P4CsHk5aJDxiW/yg2clD7iVQfyUi+VcU+6OfFpY5 dduMgJncZzG3APN22qGCLXAv75UiKIGEzmpWyH/d2ITffHd7se4RDk68tbQEMYg8/G7w ix6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701062516; x=1701667316; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mrIvw/c7ANbXl/qBEcZRfQxui2zzTTLXuYa9rLTlQvE=; b=KB1KzHkwvJeAApnTdglEUPQbcDNXEnWXbohkpHrxGdo7n121YjZsnGNoeiY/bTpfto /N8TGxq2t4RoqCh1KmG69reFyY0jTtzZesBKT8s8eT6lAZOz8EJDcURy8N7HqLro5xSs sayrLJGt0tDllje/cjPsifAcBmSnhM+rBLJKXi2RwIi+hCKCkgGPyMBlnI8WRup3Hji9 VCZ5FkdzreCN5xpH0saUVVW+SeLjvTsmVj1C8NqTAQQzd71QiCEWMADEJpfxlmhxtOUP AWsc9ic5JfbAxardyeTH3/M2QogeEGxW38dijZuSXJBX+51LO3Gh/4pNNKbMvoSY275o 7UnQ== X-Gm-Message-State: AOJu0Yz1jOaw/HDsbohMGzmxQuxwKw+b40l/L5N1HmYyPJD/ADKKs000 YakqpfoKW2LiZ2hsQYsK98zaMpjtl6haQVymFdrqRnxGaNI= X-Google-Smtp-Source: AGHT+IGwkpaOBVpHGxRq5MC2tUlm5T2F1gq5/+BHzLkwsyr2stcZ+43YxOuHRNADwemLoSJzuIafRg== X-Received: by 2002:a05:6870:88d:b0:1fa:5873:d0fa with SMTP id fx13-20020a056870088d00b001fa5873d0famr1756547oab.50.1701062515423; Sun, 26 Nov 2023 21:21:55 -0800 (PST) From: Gustavo Romero To: qemu-devel@nongnu.org, philmd@linaro.org, peter.maydell@linaro.org, alex.bennee@linaro.org, richard.henderson@linaro.org Cc: thuth@redhat.com, gustavo.romero@linaro.org Subject: [PATCH 1/4] Add ivshmem-flat device Date: Mon, 27 Nov 2023 05:20:21 +0000 Message-Id: <20231127052024.435743-2-gustavo.romero@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127052024.435743-1-gustavo.romero@linaro.org> References: <20231127052024.435743-1-gustavo.romero@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::344; envelope-from=gustavo.romero@linaro.org; helo=mail-ot1-x344.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1701062558112000007 Content-Type: text/plain; charset="utf-8" Add a new device, ivshmem-flat, which is similar to the ivshmem PCI but does not require a PCI bus. It's meant to be used on machines like those with Cortex-M MCUs, which usually lack a PCI/PCIe bus, e.g. lm3s6965evb and mps2-an385. The device currently only supports the sysbus bus. The following is an example on how to create the ivshmem-flat device on a Stellaris machine: $ qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -net none -chardev stdio,id=3Dcon,mux=3Don -serial chardev:con -mon chardev=3Dcon,mode=3Dreadline -chardev socket,path=3D/tmp/ivshmem_socket,id=3Divf -device ivshmem-flat,x-irq-qompath=3D/machine/unattached/= device[1]/nvic/unnamed-gpio-in[0],x-bus-qompath=3D"/sysbus",chardev=3Divf -kernel zephyr_qemu.elf The new device, just like the ivshmem PCI device, supports both peer notification via hardware interrupts and shared memory. The IRQ QOM path for the target machine can be determined by creating the VM without the ivshmem-flat device, going to the QEMU console and listing the QOM nodes with 'info qom-tree'. In the Stellaris example above the input IRQ is in the NVIC IC. The MMRs for status and control (notification) are mapped to the MMIO region at 0x400FF000 (default), whilst the shared memory region start is mapped at addr. 0x40100000 (default), but both addresses can be set when creating the device by using 'x-bus-address-{mmr,shmem}' options, respectively. The device shared memory size can be set using the 'shmem-size' option and it defaults to 4 MiB, which is the default size of shmem allocated by the ivshmem server. Signed-off-by: Gustavo Romero --- docs/system/devices/ivshmem-flat.rst | 89 +++++ hw/arm/mps2.c | 2 + hw/arm/stellaris.c | 5 +- hw/arm/virt.c | 2 + hw/core/sysbus-fdt.c | 1 + hw/misc/Kconfig | 5 + hw/misc/ivshmem-flat.c | 477 +++++++++++++++++++++++++++ hw/misc/meson.build | 2 + hw/misc/trace-events | 18 + include/hw/misc/ivshmem-flat.h | 72 ++++ 10 files changed, 672 insertions(+), 1 deletion(-) create mode 100644 docs/system/devices/ivshmem-flat.rst create mode 100644 hw/misc/ivshmem-flat.c create mode 100644 include/hw/misc/ivshmem-flat.h diff --git a/docs/system/devices/ivshmem-flat.rst b/docs/system/devices/ivs= hmem-flat.rst new file mode 100644 index 0000000000..a10446a18f --- /dev/null +++ b/docs/system/devices/ivshmem-flat.rst @@ -0,0 +1,89 @@ +Inter-VM Shared Memory Flat Device +---------------------------------- + +The ivshmem-flat device is meant to be used on machines that lack a PCI bu= s, +making them unsuitable for the use of the traditional ivshmem device model= ed as +a PCI device. Machines like those with a Cortex-M MCU are good candidates = to use +the ivshmem-flat device. Also, since the flat version maps the control and +status registers directly to the memory, it requires a quite tiny "device +driver" to interact with other VMs, which is useful in some RTOSes, like +Zephyr, which usually run on constrained resource targets. + +Similar to the ivshmem device, the ivshmem-flat device supports both peer +notification via HW interrupts and Inter-VM shared memory. This allows the +device to be used together with the traditional ivshmem, enabling communic= ation +between, for instance, an aarch64 VM (using the traditional ivshmem devic= e and +running Linux), and an arm VM (using the ivshmem-flat device and running Z= ephyr +instead). + +The ivshmem-flat device does not support the use of a ``memdev`` option (s= ee +ivshmem.rst for more details). It relies on the ivshmem server to create a= nd +distribute the proper shared memory file descriptor and the eventfd(s) to = notify +(interrupt) the peers. Therefore, to use this device, it is always necessa= ry to +have an ivshmem server up and running for proper device creation. + +Although the ivshmem-flat supports both peer notification (interrupts) and +shared memory, the interrupt mechanism is optional. If no input IRQ is +specified for the device it is disabled, preventing the VM from notifying = or +being notified by other VMs (a warning will be displayed to the user to in= form +the IRQ mechanism is disabled). The shared memory region is always present. + +The MMRs (INTRMASK, INTRSTATUS, IVPOSITION, and DOORBELL registers) offset= s at +the MMR region, and their functions, follow the ivshmem spec, so they work +exactly as in the ivshmem PCI device (see ./specs/ivshmem-spec.txt). + + +Device Options +-------------- + +The only required options to create an ivshmem-flat device are: (a) the UN= IX +socket where the ivshmem server is listening, usually ``/tmp/ivshmem_socke= t``; +and (b) the bus type to be used by the device, which currently only suppor= ts +"/sysbus" bus type. + +Example: + +.. parsed-literal:: + + |qemu-system-arm| -chardev socket,path=3D/tmp/ivshmem_socket,id=3Divsh= mem_flat -device ivshmem-flat,x-bus-qompath=3D"/sysbus",chardev=3Divshmem_f= lat + +The other options are for fine tuning the device. + +``x-irq-qompath``. Used to inform the device which IRQ input line it can a= ttach +to enable the notification mechanism (IRQ). The ivshmem-flat device curren= tly +only supports notification via vector 0, ignoring other vectors. + +Two examples for different machines follow. + +Stellaris machine (``- machine lm3s6965evb``): + +:: + + x-irq-qompath=3D/machine/unattached/device[1]/nvic/unnamed-gpio-in[0] + +Arm mps2-an385 machine (``-machine mps2-an385``): + +:: + + x-irq-qompath=3D/machine/armv7m/nvic/unnamed-gpio-in[0] + +The available IRQ input lines on a given VM that the ivshmem-flat device c= an be +attached to can be inspected from the QEMU monitor (Ctrl-a + c) with: + +(qemu) info qom-tree + +``x-bus-address-mmr``. Allows changing the address where the MMRs are mapp= ed +into the VM memory layout. Default is 0x400FF000, but this address might be +already taken on some VMs, hence it's necessary to adjust the MMR locatio= n on +some VMs. + + ``x-bus-address-shmem``. Allows changing the address where the shared mem= ory +region is mapped into the VM memory layout. Default is 0x40100000, but this +address might be already taken on some VMs, hence it's necessary to adjust= the +shared memory location. + +``shmem-size``. Allows changing the size (in bytes) of shared memroy regio= n. +Default is 4 MiB, which is the same default value used by the ivshmem serv= er, so +usually it's not necessary to change it. The size must match the size of = the +shared memory reserverd and informed by the ivshmem server, otherwise devi= ce +creation fails. diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c index d92fd60684..2bd0e6ba6e 100644 --- a/hw/arm/mps2.c +++ b/hw/arm/mps2.c @@ -474,6 +474,8 @@ static void mps2_class_init(ObjectClass *oc, void *data) mc->max_cpus =3D 1; mc->default_ram_size =3D 16 * MiB; mc->default_ram_id =3D "mps.ram"; + + machine_class_allow_dynamic_sysbus_dev(mc, "ivshmem-flat"); } =20 static void mps2_an385_class_init(ObjectClass *oc, void *data) diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c index f7e99baf62..792b7b57c1 100644 --- a/hw/arm/stellaris.c +++ b/hw/arm/stellaris.c @@ -28,6 +28,7 @@ #include "hw/watchdog/cmsdk-apb-watchdog.h" #include "migration/vmstate.h" #include "hw/misc/unimp.h" +#include "hw/misc/ivshmem-flat.h" #include "hw/timer/stellaris-gptm.h" #include "hw/qdev-clock.h" #include "qom/object.h" @@ -720,7 +721,7 @@ static void stellaris_adc_fifo_write(StellarisADCState = *s, int n, { int head; =20 - /* TODO: Real hardware has limited size FIFOs. We have a full 16 entr= y=20 + /* TODO: Real hardware has limited size FIFOs. We have a full 16 entry FIFO fir each sequencer. */ head =3D (s->fifo[n].state >> 4) & 0xf; if (s->fifo[n].state & STELLARIS_ADC_FIFO_FULL) { @@ -1344,6 +1345,8 @@ static void lm3s6965evb_class_init(ObjectClass *oc, v= oid *data) mc->init =3D lm3s6965evb_init; mc->ignore_memory_transaction_failures =3D true; mc->default_cpu_type =3D ARM_CPU_TYPE_NAME("cortex-m3"); + + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_IVSHMEM_FLAT); } =20 static const TypeInfo lm3s6965evb_type =3D { diff --git a/hw/arm/virt.c b/hw/arm/virt.c index a13c658bbf..e26f9b54f8 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -80,6 +80,7 @@ #include "hw/virtio/virtio-iommu.h" #include "hw/char/pl011.h" #include "qemu/guest-random.h" +#include "hw/misc/ivshmem-flat.h" =20 #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \ static void virt_##major##_##minor##_class_init(ObjectClass *oc, \ @@ -2938,6 +2939,7 @@ static void virt_machine_class_init(ObjectClass *oc, = void *data) machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE); machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE); machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM); + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_IVSHMEM_FLAT); #ifdef CONFIG_TPM machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS); #endif diff --git a/hw/core/sysbus-fdt.c b/hw/core/sysbus-fdt.c index eebcd28f9a..af43b67577 100644 --- a/hw/core/sysbus-fdt.c +++ b/hw/core/sysbus-fdt.c @@ -495,6 +495,7 @@ static const BindingEntry bindings[] =3D { TYPE_BINDING(TYPE_TPM_TIS_SYSBUS, add_tpm_tis_fdt_node), #endif TYPE_BINDING(TYPE_RAMFB_DEVICE, no_fdt_node), + TYPE_BINDING("ivshmem-flat", no_fdt_node), TYPE_BINDING("", NULL), /* last element */ }; =20 diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig index 6996d265e4..701df866ba 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -63,6 +63,11 @@ config IVSHMEM_DEVICE default y if PCI_DEVICES depends on PCI && LINUX && IVSHMEM && MSI_NONBROKEN =20 +config IVSHMEM_FLAT_DEVICE + bool + default y + depends on LINUX && IVSHMEM + config ECCMEMCTL bool select ECC diff --git a/hw/misc/ivshmem-flat.c b/hw/misc/ivshmem-flat.c new file mode 100644 index 0000000000..31731a38cf --- /dev/null +++ b/hw/misc/ivshmem-flat.c @@ -0,0 +1,477 @@ +/* + * Inter-VM Shared Memory Flat Device + * + * SPDX-FileCopyrightText: 2023 Linaro Ltd. + * SPDX-FileContributor: Gustavo Romero + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include "qemu/error-report.h" +#include "qemu/module.h" +#include "qapi/error.h" +#include "hw/irq.h" +#include "hw/qdev-properties-system.h" +#include "hw/sysbus.h" +#include "chardev/char-fe.h" +#include "exec/address-spaces.h" +#include "trace.h" + +#include "hw/misc/ivshmem-flat.h" + +static int64_t ivshmem_flat_recv_msg(IvshmemFTState *s, int *pfd) +{ + int64_t msg; + int n, ret; + + n =3D 0; + do { + ret =3D qemu_chr_fe_read_all(&s->server_chr, (uint8_t *)&msg + n, + sizeof(msg) - n); + if (ret < 0) { + if (ret =3D=3D -EINTR) { + continue; + } + exit(1); + } + n +=3D ret; + } while (n < sizeof(msg)); + + *pfd =3D qemu_chr_fe_get_msgfd(&s->server_chr); + return le64_to_cpu(msg); +} + +static void ivshmem_flat_irq_handler(void *opaque) +{ + VectorInfo *vi =3D opaque; + EventNotifier *e =3D &vi->event_notifier; + uint16_t vector_id; + const VectorInfo (*v)[64]; + + assert(e->initialized); + + vector_id =3D vi->id; + + /* + * The vector info struct is passed to the handler via the 'opaque' po= inter. + * This struct pointer allows the retrieval of the vector ID and its + * associated event notifier. However, for triggering an interrupt usi= ng + * qemu_set_irq, it's necessary to also have a pointer to the device s= tate, + * i.e., a pointer to the IvshmemFTState struct. Since the vector info + * struct is contained within the IvshmemFTState struct, its pointer c= an be + * used to obtain the pointer to IvshmemFTState through simple pointer= math. + */ + v =3D (void *)(vi - vector_id); /* v =3D &IvshmemPeer->vector[0] */ + IvshmemPeer *own_peer =3D container_of(v, IvshmemPeer, vector); + IvshmemFTState *s =3D container_of(own_peer, IvshmemFTState, own); + + /* Clear event */ + if (!event_notifier_test_and_clear(e)) { + return; + } + + trace_ivshmem_flat_irq_handler(vector_id); + + /* + * Toggle device's output line, which is connected to interrupt contro= ller, + * generating an interrupt request to the CPU. + */ + qemu_set_irq(s->irq, true); + qemu_set_irq(s->irq, false); +} + +static IvshmemPeer *ivshmem_flat_find_peer(IvshmemFTState *s, uint16_t pee= r_id) +{ + IvshmemPeer *peer; + + /* Own ID */ + if (s->own.id =3D=3D peer_id) { + return &s->own; + } + + /* Peer ID */ + QTAILQ_FOREACH(peer, &s->peer, next) { + if (peer->id =3D=3D peer_id) { + return peer; + } + } + + return NULL; +} + +static IvshmemPeer *ivshmem_flat_add_peer(IvshmemFTState *s, uint16_t peer= _id) +{ + IvshmemPeer *new_peer; + + new_peer =3D g_malloc0(sizeof(*new_peer)); + new_peer->id =3D peer_id; + new_peer->vector_counter =3D 0; + + QTAILQ_INSERT_TAIL(&s->peer, new_peer, next); + + trace_ivshmem_flat_new_peer(peer_id); + + return new_peer; +} + +static void ivshmem_flat_remove_peer(IvshmemFTState *s, uint16_t peer_id) +{ + IvshmemPeer *peer; + + peer =3D ivshmem_flat_find_peer(s, peer_id); + assert(peer); + + QTAILQ_REMOVE(&s->peer, peer, next); + for (int n =3D 0; n < peer->vector_counter; n++) { + int efd; + efd =3D event_notifier_get_fd(&(peer->vector[n].event_notifier)); + close(efd); + } + + g_free(peer); +} + +static void ivshmem_flat_add_vector(IvshmemFTState *s, IvshmemPeer *peer, = int vector_fd) +{ + if (peer->vector_counter >=3D IVSHMEM_MAX_VECTOR_NUM) { + trace_ivshmem_flat_add_vector_failure(peer->vector_counter, vector= _fd, peer->id); + close(vector_fd); + + return; + } + + trace_ivshmem_flat_add_vector_success(peer->vector_counter, vector_fd,= peer->id); + + /* + * Set vector ID and its associated eventfd notifier and add them to t= he + * peer. + */ + peer->vector[peer->vector_counter].id =3D peer->vector_counter; + g_unix_set_fd_nonblocking(vector_fd, true, NULL); + event_notifier_init_fd(&peer->vector[peer->vector_counter].event_notif= ier, vector_fd); + + /* + * If it's the device's own ID, register also the handler for the even= tfd so + * the device can be notified by the other peers. + */ + if (peer =3D=3D &s->own) { + qemu_set_fd_handler(vector_fd, ivshmem_flat_irq_handler, NULL, &pe= er->vector); + } + + peer->vector_counter++; +} + +static void ivshmem_flat_process_msg(IvshmemFTState *s, uint64_t msg, int = fd) { + uint16_t peer_id; + IvshmemPeer *peer; + + peer_id =3D msg & 0xFFFF; + peer =3D ivshmem_flat_find_peer(s, peer_id); + + if (!peer) { + peer =3D ivshmem_flat_add_peer(s, peer_id); + } + + if (fd >=3D 0) { + ivshmem_flat_add_vector(s, peer, fd); + } else { /* fd =3D=3D -1, which is received when peers disconnect. */ + ivshmem_flat_remove_peer(s, peer_id); + } +} + +static int ivshmem_flat_can_receive_data(void *opaque) +{ + IvshmemFTState *s =3D opaque; + + assert(s->msg_buffered_bytes < sizeof(s->msg_buf)); + return sizeof(s->msg_buf) - s->msg_buffered_bytes; +} + +static void ivshmem_flat_read_msg(void *opaque, const uint8_t *buf, int si= ze) +{ + IvshmemFTState *s =3D opaque; + int fd; + int64_t msg; + + assert(size >=3D 0 && s->msg_buffered_bytes + size <=3D sizeof(s->msg_= buf)); + memcpy((unsigned char *)&s->msg_buf + s->msg_buffered_bytes, buf, size= ); + s->msg_buffered_bytes +=3D size; + if (s->msg_buffered_bytes < sizeof(s->msg_buf)) { + return; + } + msg =3D le64_to_cpu(s->msg_buf); + s->msg_buffered_bytes =3D 0; + + fd =3D qemu_chr_fe_get_msgfd(&s->server_chr); + + ivshmem_flat_process_msg(s, msg, fd); +} + +/* + * Message sequence from server on new connection: + * _____________________________________ + * |STEP| uint64_t msg | int fd | + * ------------------------------------- + * + * 0 PROTOCOL -1 \ + * 1 OWN PEER ID -1 |-- Header/Greeting + * 2 -1 shmem fd / + * + * 3 PEER IDx Other peer's Vector 0 eventfd + * 4 PEER IDx Other peer's Vector 1 eventfd + * . . + * . . + * . . + * N PEER IDy Other peer's Vector 0 eventfd + * N+1 PEER IDy Other peer's Vector 1 eventfd + * . . + * . . + * . . + * + * ivshmem_flat_recv_msg() calls return 'msg' and 'fd'. + * + * See ./docs/specs/ivshmem-spec.txt for details on the protocol. + */ +static void ivshmem_flat_realize(DeviceState *dev, Error **errp) { + IvshmemFTState *s =3D IVSHMEM_FLAT(dev); + + int64_t protocol_version, msg; + int fd, shmem_fd, vector_fd; + uint16_t peer_id; + + /* Input IRQ line, in the IRQ controller or CPU. */ + Object *oirq; + bool ambiguous =3D false; + + /* Device requires sysbus. */ + if (s->bus_qompath) { + if (strcmp(s->bus_qompath, "/sysbus")) { + error_setg(errp, "ivshmem-flat requires '/sysbus' bus."); + return; + } + } else { + error_setg(errp, "Bus not specified. Use 'x-bus-qompath' to specif= y the bus type."); + return; + } + + /* Check for input IRQ line, if it's provided, connect it. */ + if (s->irq_qompath) { + oirq =3D object_resolve_path_type(s->irq_qompath, TYPE_IRQ, &ambig= uous); + if (ambiguous) { + error_setg(errp, "Specified IRQ is ambiguous. Can't create ivs= hmem-flat device."); + return; + } + + if (!oirq) { + error_setg(errp, "Can't resolve IRQ QOM path."); + return; + } else { + trace_ivshmem_flat_irq_resolved(s->irq_qompath); + } + + /* Connect device out irq line to interrupt controller input irq l= ine. */ + qdev_connect_gpio_out_named(dev, "irq-output", 0, (qemu_irq)(oirq)= ); + + if (qemu_irq_is_connected((qemu_irq)(oirq))) { + trace_ivshmem_flat_irq_connected(); + } + } else { + /* + * If input IRQ is not provided, warn user the device won't be able= to trigger any + * interrupts. + */ + warn_report("Input IRQ not specified, device won't be able to hand= le IRQs!"); + } + + /* Check ivshmem server connection. */ + if (!qemu_chr_fe_backend_connected(&s->server_chr)) { + error_setg(errp, "ivshmem server socket not specified or incorret.= Can't create device.\n"); + return; + } + + /* Step 0 */ + protocol_version =3D ivshmem_flat_recv_msg(s, &fd); + + /* Step 1 */ + msg =3D ivshmem_flat_recv_msg(s, &vector_fd); + peer_id =3D 0xFFFF & msg; + s->own.id =3D peer_id; + s->own.vector_counter =3D 0; + + trace_ivshmem_flat_proto_ver_own_id(protocol_version, s->own.id); + + /* Step 2 */ + msg =3D ivshmem_flat_recv_msg(s, &shmem_fd); + /* Map shmem fd and MMRs into memory regions. */ + if (msg =3D=3D -1 && shmem_fd >=3D 0) { + struct stat fdstat; + + if (fstat(shmem_fd, &fdstat) !=3D 0) { + error_setg(errp, "Could not determine shmem fd size. Can't cre= ate device!"); + + return; + } + trace_ivshmem_flat_shmem_size(fdstat.st_size); + + /* Shmem size provided by the ivshmem server must be equal to devi= ce's shmem size. */ + if (fdstat.st_size !=3D s->shmem_size) { + error_setg(errp, "Can't map shmem fd: shmem size different fro= m device size!"); + return; + } else { + trace_ivshmem_flat_shmem_addr(shmem_fd, s->bus_address_shmem); + memory_region_init_ram_from_fd(&s->shmem, OBJECT(s), "ivshmem-= shmem", fdstat.st_size, + RAM_SHARED, shmem_fd, 0, NULL); + memory_region_add_subregion(get_system_memory(), s->bus_addres= s_shmem, &s->shmem); + + trace_ivshmem_flat_mmr_addr(s->bus_address_mmr); + sysbus_mmio_map(SYS_BUS_DEVICE(s), 0, s->bus_address_mmr); + } + } + + /* + * Beyond step 2 ivshmem_process_msg, called by ivshmem_flat_read_msg = handler -- when data is + * available on the server socket -- will handle the additional messag= es that will be generated + * by the server as peers connect or disconnect. + */ + qemu_chr_fe_set_handlers(&s->server_chr, ivshmem_flat_can_receive_data= , ivshmem_flat_read_msg, + NULL, NULL, s, NULL, true); +} + +static uint64_t ivshmem_flat_iomem_read(void *opaque, hwaddr offset, unsig= ned size) +{ + IvshmemFTState *s =3D opaque; + uint32_t ret; + + trace_ivshmem_flat_read_mmr(offset); + + switch (offset) + { + case INTMASK: + ret =3D 0; /* Ignore read since all bits are reserved in rev 1= . */ + break; + case INTSTATUS: + ret =3D 0; /* Ignore read since all bits are reserved in rev 1= . */ + break; + case IVPOSITION: + ret =3D s->own.id; + break; + case DOORBELL: + trace_ivshmem_flat_read_mmr_doorbell(); /* DOORBELL is write-o= nly */ + ret =3D 0; + break; + default: + /* Should never reach out here due to iomem map range being ex= act. */ + trace_ivshmem_flat_read_write_mmr_invalid(offset); + ret =3D 0; + } + + return ret; +} + +static int ivshmem_flat_interrupt_peer(IvshmemFTState *s, uint16_t peer_id= , uint16_t vector_id) +{ + IvshmemPeer *peer; + + peer =3D ivshmem_flat_find_peer(s, peer_id); + if (!peer) { + trace_ivshmem_flat_interrupt_invalid_peer(peer_id); + return 1; + } + + event_notifier_set(&(peer->vector[vector_id].event_notifier)); + + return 0; +} + +static void ivshmem_flat_iomem_write(void *opaque, hwaddr offset, uint64_t= value, unsigned size) +{ + IvshmemFTState *s =3D opaque; + uint16_t peer_id =3D (value >> 16) & 0xFFFF; + uint16_t vector_id =3D value & 0xFFFF; + + trace_ivshmem_flat_write_mmr(offset); + + switch (offset) { + case INTMASK: + break; + case INTSTATUS: + break; + case IVPOSITION: + break; + case DOORBELL: + trace_ivshmem_flat_interrupt_peer(peer_id, vector_id); + ivshmem_flat_interrupt_peer(s, peer_id, vector_id); + break; + default: + /* Should never reach out here due to iomem map range being exact.= */ + trace_ivshmem_flat_read_write_mmr_invalid(offset); + break; + } + + return; +} + +static const MemoryRegionOps ivshmem_flat_ops =3D { + .read =3D ivshmem_flat_iomem_read, + .write =3D ivshmem_flat_iomem_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .impl =3D { /* Read/write aligned at 32 bits. */ + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + +static void ivshmem_flat_instance_init(Object *obj) +{ + DeviceState *dev =3D DEVICE(obj); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + IvshmemFTState *s =3D IVSHMEM_FLAT(obj); + + /* Init mem region for 4 MMRs (ivshmem_registers), 32 bits each =3D> 1= 6 bytes (0x10) */ + memory_region_init_io(&s->iomem, obj, &ivshmem_flat_ops, s, "ivshmem-m= mr", 0x10); + sysbus_init_mmio(sbd, &s->iomem); + + /* Create one output IRQ that will be connect to the machine's interru= pt controller. */ + qdev_init_gpio_out_named(dev, &s->irq, "irq-output", 1); + + QTAILQ_INIT(&s->peer); +} + +static Property ivshmem_flat_props[] =3D { + DEFINE_PROP_CHR("chardev", IvshmemFTState, server_chr), + DEFINE_PROP_UINT32("shmem-size", IvshmemFTState, shmem_size, 4194304),= /* 4 MiB */ + DEFINE_PROP_STRING("x-irq-qompath", IvshmemFTState, irq_qompath), + DEFINE_PROP_STRING("x-bus-qompath", IvshmemFTState, bus_qompath), + DEFINE_PROP_UINT64("x-bus-address-mmr", IvshmemFTState, bus_address_mm= r, 0x400FF000), + DEFINE_PROP_UINT64("x-bus-address-shmem", IvshmemFTState, bus_address_= shmem, 0x40100000), + DEFINE_PROP_END_OF_LIST(), +}; + +static void ivshmem_flat_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->hotpluggable =3D true; + dc->user_creatable =3D true; + dc->realize =3D ivshmem_flat_realize; + + set_bit(DEVICE_CATEGORY_MISC, dc->categories); + device_class_set_props(dc, ivshmem_flat_props); +} + +static const TypeInfo ivshmem_flat_info =3D { + .name =3D TYPE_IVSHMEM_FLAT, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(IvshmemFTState), + .instance_init =3D ivshmem_flat_instance_init, + .class_init =3D ivshmem_flat_class_init, +}; + +static void ivshmem_flat_register_types(void) +{ + type_register_static(&ivshmem_flat_info); +} + +type_init(ivshmem_flat_register_types); diff --git a/hw/misc/meson.build b/hw/misc/meson.build index d9a370c1de..7b03fc1345 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -36,7 +36,9 @@ system_ss.add(when: 'CONFIG_SIFIVE_U_PRCI', if_true: file= s('sifive_u_prci.c')) =20 subdir('macio') =20 +# ivshmem devices system_ss.add(when: 'CONFIG_IVSHMEM_DEVICE', if_true: files('ivshmem.c')) +system_ss.add(when: 'CONFIG_IVSHMEM_FLAT_DEVICE', if_true: files('ivshmem-= flat.c')) =20 system_ss.add(when: 'CONFIG_ALLWINNER_SRAMC', if_true: files('allwinner-sr= amc.c')) system_ss.add(when: 'CONFIG_ALLWINNER_A10_CCM', if_true: files('allwinner-= a10-ccm.c')) diff --git a/hw/misc/trace-events b/hw/misc/trace-events index e8b2be14c0..19a75c4d45 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -301,3 +301,21 @@ virt_ctrl_instance_init(void *dev) "ctrl: %p" lasi_chip_mem_valid(uint64_t addr, uint32_t val) "access to addr 0x%"PRIx6= 4" is %d" lasi_chip_read(uint64_t addr, uint32_t val) "addr 0x%"PRIx64" val 0x%08x" lasi_chip_write(uint64_t addr, uint32_t val) "addr 0x%"PRIx64" val 0x%08x" + +# ivshmem-flat.c +ivshmem_flat_irq_handler(uint16_t vector_id) "Caught interrupt request: ve= ctor %d" +ivshmem_flat_new_peer(uint16_t peer_id) "New peer ID: %d" +ivshmem_flat_add_vector_failure(uint16_t vector_id, uint32_t vector_fd, ui= nt16_t peer_id) "Failed to add vector %d (fd =3D %d) to peer ID %d, maximum= number of vectors reached" +ivshmem_flat_add_vector_success(uint16_t vector_id, uint32_t vector_fd, ui= nt16_t peer_id) "Successful addition of vector %d (fd =3D %d) to peer ID %d" +ivshmem_flat_irq_resolved(const char *irq_qompath) "IRQ QOM path '%s' corr= ectly resolved" +ivshmem_flat_irq_connected(void) "Device IRQ output line connected to Inte= rrupt Controller IRQ input line" +ivshmem_flat_proto_ver_own_id(uint64_t proto_ver, uint16_t peer_id) "Proto= col Version =3D %lx, Own Peer ID =3D %d" +ivshmem_flat_shmem_size(uint64_t size) "Shmem fd total size is %ld byte(s)" +ivshmem_flat_shmem_addr(uint32_t fd, uint64_t addr) "Mapping shmem fd (%d)= @ %#lx" +ivshmem_flat_mmr_addr(uint64_t addr) "Mapping MMRs @ %#lx" +ivshmem_flat_read_mmr(uint64_t addr_offset) "Read access at offset %ld" +ivshmem_flat_read_mmr_doorbell(void) "DOORBELL register is write-only!" +ivshmem_flat_read_write_mmr_invalid(uint64_t addr_offset) "No ivshmem regi= ster mapped at offset %ld" +ivshmem_flat_interrupt_invalid_peer(uint16_t peer_id) "Can't interrupt non= -existing peer %d" +ivshmem_flat_write_mmr(uint64_t addr_offset) "Write access at offset %ld" +ivshmem_flat_interrupt_peer(uint16_t peer_id, uint16_t vector_id) "Interru= pting peer ID %d, vector %d..." diff --git a/include/hw/misc/ivshmem-flat.h b/include/hw/misc/ivshmem-flat.h new file mode 100644 index 0000000000..2f6f7462f6 --- /dev/null +++ b/include/hw/misc/ivshmem-flat.h @@ -0,0 +1,72 @@ +/* + * Inter-VM Shared Memory Flat Device + * + * SPDX-FileCopyrightText: 2023 Linaro Ltd. + * SPDX-FileContributor: Gustavo Romero + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ + +#ifndef IVSHMEM_FLAT_H +#define IVSHMEM_FLAT_H + +#define IVSHMEM_MAX_VECTOR_NUM 64 + +#define TYPE_IVSHMEM_FLAT "ivshmem-flat" +typedef struct IvshmemFTState IvshmemFTState; + +DECLARE_INSTANCE_CHECKER(IvshmemFTState, IVSHMEM_FLAT, TYPE_IVSHMEM_FLAT) + +/* Ivshmem registers. See ./docs/specs/ivshmem-spec.txt for details. */ +enum ivshmem_registers { + INTMASK =3D 0, + INTSTATUS =3D 4, + IVPOSITION =3D 8, + DOORBELL =3D 12, +}; + +typedef struct VectorInfo { + EventNotifier event_notifier; + uint16_t id; +} VectorInfo; + +typedef struct IvshmemPeer { + QTAILQ_ENTRY(IvshmemPeer) next; + VectorInfo vector[IVSHMEM_MAX_VECTOR_NUM]; + int vector_counter; + uint16_t id; +} IvshmemPeer; + +struct IvshmemFTState { + SysBusDevice parent_obj; + + uint64_t msg_buf; + int msg_buffered_bytes; + + QTAILQ_HEAD(, IvshmemPeer) peer; + IvshmemPeer own; + + CharBackend server_chr; + + char *bus_qompath; + + /* IRQ */ + qemu_irq irq; + char *irq_qompath; + + /* MMRs */ + MemoryRegion iomem; + uint64_t bus_address_mmr; + uint32_t intmask; + uint32_t intstatus; + uint32_t ivposition; + uint32_t doorbell; + + /* Shared memory */ + MemoryRegion shmem; + int shmem_fd; + uint32_t shmem_size; + uint64_t bus_address_shmem; +}; + +#endif /* IVSHMEM_FLAT_H */ --=20 2.34.1 From nobody Wed Nov 27 02:37:57 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1701062590; cv=none; d=zohomail.com; s=zohoarc; b=Zr8M8ROiaXGkAa8UR2lfJpWzvS9FQDiJF5jAeIpDZLrl9gHz/tcwTkx570MEmLbVbEYgabLT3em/5VmcbWuTu2uR2snfaxkH6/tMhIno3/kJZF6gOZ3RmVaR+PVCETYjI/6E10dXlLdhaus19CvTXSZQlT/nJTF7QIiJPQzYSsY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1701062590; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ypraAgK9dC15p7zOrjfOuMTYBF2BK9MBqFt+ed7oWgM=; b=ZXamQoK8xv8hcmjErGRC8+FvRvQIZJQj2BOOIBQbhehH6jJH3/hGDd3jUUqFMcsZzmzdGnG/aLDvoG7N4Uw/93ggNxiNyO+RNP9ruwMr/Pd6ehdENDCcwANKYjznMnozrhEztGbqxisRzV+33r0gIoayc2v9hWnWsHVvve8DKlY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1701062590060800.3394226294391; Sun, 26 Nov 2023 21:23:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r7U4P-0004SW-89; Mon, 27 Nov 2023 00:22:09 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r7U4L-0004SG-Ud for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:06 -0500 Received: from mail-oa1-x41.google.com ([2001:4860:4864:20::41]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r7U4J-0008BG-Lg for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:05 -0500 Received: by mail-oa1-x41.google.com with SMTP id 586e51a60fabf-1fa25d9cddbso914344fac.1 for ; Sun, 26 Nov 2023 21:22:03 -0800 (PST) Received: from amd.. ([2804:7f0:b402:7782:3e7c:3fff:fe7a:e83b]) by smtp.gmail.com with ESMTPSA id v13-20020aa7808d000000b006cb9f436232sm6392316pff.114.2023.11.26.21.21.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Nov 2023 21:22:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1701062522; x=1701667322; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ypraAgK9dC15p7zOrjfOuMTYBF2BK9MBqFt+ed7oWgM=; b=R7A17RlpFU7UTMgVmxPNs2lW1MMuAoQUIyPlTCU8Df7cIZpOmyCgNRZtHGpDs5fmiJ CtW0pdYGUFGlYp0zNRHQY66sHrwvjevkA5g+bsLYVQlUwzW7fvQf9jM5AjgeyOjcKBf1 +OMqqEEKFPyMIIPMmUUEOicHaaeBTNwENofIZlgLUgaCigH9K6kTx1rDjHB/4j5OYaHV BS1HxLkfp1o9XX/4d5/1qGkWfP6Xg0Po04bJv5CWzWeX0Fmobt6ajj1kgwhenFhpp0aQ V4HuWzohecyzvEWEpX6jpdYKw7PEi9+7D3KI/XzlEDHEak4j/qSzg7kQMd70X3vvpKA/ e1gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701062522; x=1701667322; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ypraAgK9dC15p7zOrjfOuMTYBF2BK9MBqFt+ed7oWgM=; b=P8DfBpnc92Zrx7HTWHmsOGABTw4Xt7Timpq/+QQTIUbw+VDaj3iGAYAiKSn5TZUnbF zLOO/hgFEW992P20J+QZRSlvBSklB8pz4ujAu/GydhRwcGbBIdkMLO1gn3PZgbmkPO/t NYySWc2nCc9PX3Q20AAdOFIHrxPAeuBI6XEkCc1UQbxqrd83VXJ6TBTixTfhXdEvxdZF pNTtArATtJAs5DuguYG2OEfbBcNRTOwghA1DXzgp2NBO5Qy3vz8F11+xj0EVjvEES+AI deCoBXKDDY/XhCZj4o0KkuHkY39694YwFSTgs3DeA6hAacWc4ddCPB0Abo4Ak3wEYhvY QmKg== X-Gm-Message-State: AOJu0YxV1PVpIyTrGXorP0ljF1HOjjjgkB3/ROm7r2mn9qEFss58Z3DM TjhjfC74IfYapLuH/Od4r8zCW40gFeIMXhaOuoGQZBiZSpM= X-Google-Smtp-Source: AGHT+IEJXPnNwsS9hPgkcShoAP8RyLu76biS1bieAnxmTqyUu0NXJcEaEaP8fEKtNl9FNKhPkzL8GA== X-Received: by 2002:a05:6870:4712:b0:1f5:c37c:ac37 with SMTP id b18-20020a056870471200b001f5c37cac37mr13667136oaq.30.1701062521454; Sun, 26 Nov 2023 21:22:01 -0800 (PST) From: Gustavo Romero To: qemu-devel@nongnu.org, philmd@linaro.org, peter.maydell@linaro.org, alex.bennee@linaro.org, richard.henderson@linaro.org Cc: thuth@redhat.com, gustavo.romero@linaro.org Subject: [PATCH 2/4] tests/qtest: Reorganize common code in ivshmem-test Date: Mon, 27 Nov 2023 05:20:22 +0000 Message-Id: <20231127052024.435743-3-gustavo.romero@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127052024.435743-1-gustavo.romero@linaro.org> References: <20231127052024.435743-1-gustavo.romero@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2001:4860:4864:20::41; envelope-from=gustavo.romero@linaro.org; helo=mail-oa1-x41.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1701062591447000002 Content-Type: text/plain; charset="utf-8" This commit reorganizes the ivshmem-test qtest by moving common structs, functions, and code that can be utilized by other ivshmem qtests into two new files: ivshmem-utils.h and ivshmem-utils.c. Enum Reg, struct ServerThread, and mktempshm() have been relocated to these new files. Two new functions have been introduced to handle the ivshmem server start/stop: test_ivshmem_server_{start,stop}. To accommodate the new way for starting/stopping the ivshmem server, struct ServerThread now includes two new members: 'server', previously present but not a member of any struct; and 'status', a new member of a new type, ServerStartStatus, used to track and handle service termination properly. Additionally, a new function, mktempsocket(), has been added to help create a unix socket filename, similar to what mktempshm() does for the creation of a shm file. Finally, the ivshmem-test qtest has been adapted to use the new ivhsmem utils. Adjustments in that sense have also been made to meson.build; also 'rt' have been removed as a lib dependency for ivhsmem-test.c. Two lines unrelated to these changes have had their line indentation also fixed in meson.build. Signed-off-by: Gustavo Romero --- tests/qtest/ivshmem-test.c | 113 ++------------------------ tests/qtest/ivshmem-utils.c | 155 ++++++++++++++++++++++++++++++++++++ tests/qtest/ivshmem-utils.h | 56 +++++++++++++ tests/qtest/meson.build | 6 +- 4 files changed, 221 insertions(+), 109 deletions(-) create mode 100644 tests/qtest/ivshmem-utils.c create mode 100644 tests/qtest/ivshmem-utils.h diff --git a/tests/qtest/ivshmem-test.c b/tests/qtest/ivshmem-test.c index 9bf8e78df6..5ce43e2f76 100644 --- a/tests/qtest/ivshmem-test.c +++ b/tests/qtest/ivshmem-test.c @@ -3,17 +3,17 @@ * * Copyright (c) 2014 SUSE LINUX Products GmbH * Copyright (c) 2015 Red Hat, Inc. + * Copyright (c) 2023 Linaro Ltd. * * This work is licensed under the terms of the GNU GPL, version 2 or late= r. * See the COPYING file in the top-level directory. */ =20 -#include "qemu/osdep.h" -#include -#include "contrib/ivshmem-server/ivshmem-server.h" +#include "ivshmem-utils.h" #include "libqos/libqos-pc.h" #include "libqos/libqos-spapr.h" -#include "libqtest.h" + +static ServerThread thread; =20 #define TMPSHMSIZE (1 << 20) static char *tmpshm; @@ -45,13 +45,6 @@ typedef struct _IVState { QPCIDevice *dev; } IVState; =20 -enum Reg { - INTRMASK =3D 0, - INTRSTATUS =3D 4, - IVPOSITION =3D 8, - DOORBELL =3D 12, -}; - static const char* reg2str(enum Reg reg) { switch (reg) { case INTRMASK: @@ -241,54 +234,6 @@ static void test_ivshmem_pair(void) g_free(data); } =20 -typedef struct ServerThread { - GThread *thread; - IvshmemServer *server; - int pipe[2]; /* to handle quit */ -} ServerThread; - -static void *server_thread(void *data) -{ - ServerThread *t =3D data; - IvshmemServer *server =3D t->server; - - while (true) { - fd_set fds; - int maxfd, ret; - - FD_ZERO(&fds); - FD_SET(t->pipe[0], &fds); - maxfd =3D t->pipe[0] + 1; - - ivshmem_server_get_fds(server, &fds, &maxfd); - - ret =3D select(maxfd, &fds, NULL, NULL, NULL); - - if (ret < 0) { - if (errno =3D=3D EINTR) { - continue; - } - - g_critical("select error: %s\n", strerror(errno)); - break; - } - if (ret =3D=3D 0) { - continue; - } - - if (FD_ISSET(t->pipe[0], &fds)) { - break; - } - - if (ivshmem_server_handle_fds(server, &fds, maxfd) < 0) { - g_critical("ivshmem_server_handle_fds() failed\n"); - break; - } - } - - return NULL; -} - static void setup_vm_with_server(IVState *s, int nvectors) { char *cmd; @@ -304,27 +249,12 @@ static void setup_vm_with_server(IVState *s, int nvec= tors) =20 static void test_ivshmem_server(void) { - g_autoptr(GError) err =3D NULL; IVState state1, state2, *s1, *s2; - ServerThread thread; - IvshmemServer server; int ret, vm1, vm2; int nvectors =3D 2; guint64 end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; =20 - ret =3D ivshmem_server_init(&server, tmpserver, tmpshm, true, - TMPSHMSIZE, nvectors, - g_test_verbose()); - g_assert_cmpint(ret, =3D=3D, 0); - - ret =3D ivshmem_server_start(&server); - g_assert_cmpint(ret, =3D=3D, 0); - - thread.server =3D &server; - g_unix_open_pipe(thread.pipe, FD_CLOEXEC, &err); - g_assert_no_error(err); - thread.thread =3D g_thread_new("ivshmem-server", server_thread, &threa= d); - g_assert(thread.thread !=3D NULL); + test_ivshmem_server_start(&thread, tmpserver, tmpshm, nvectors); =20 setup_vm_with_server(&state1, nvectors); s1 =3D &state1; @@ -367,15 +297,7 @@ static void test_ivshmem_server(void) cleanup_vm(s2); cleanup_vm(s1); =20 - if (qemu_write_full(thread.pipe[1], "q", 1) !=3D 1) { - g_error("qemu_write_full: %s", g_strerror(errno)); - } - - g_thread_join(thread.thread); - - ivshmem_server_close(&server); - close(thread.pipe[1]); - close(thread.pipe[0]); + test_ivshmem_server_stop(&thread); } =20 static void test_ivshmem_hotplug_q35(void) @@ -454,31 +376,10 @@ static void cleanup(void) =20 static void abrt_handler(void *data) { + test_ivshmem_server_stop(&thread); cleanup(); } =20 -static gchar *mktempshm(int size, int *fd) -{ - while (true) { - gchar *name; - - name =3D g_strdup_printf("/qtest-%u-%u", getpid(), g_test_rand_int= ()); - *fd =3D shm_open(name, O_CREAT|O_RDWR|O_EXCL, - S_IRWXU|S_IRWXG|S_IRWXO); - if (*fd > 0) { - g_assert(ftruncate(*fd, size) =3D=3D 0); - return name; - } - - g_free(name); - - if (errno !=3D EEXIST) { - perror("shm_open"); - return NULL; - } - } -} - int main(int argc, char **argv) { int ret, fd; diff --git a/tests/qtest/ivshmem-utils.c b/tests/qtest/ivshmem-utils.c new file mode 100644 index 0000000000..5fd8bb76ee --- /dev/null +++ b/tests/qtest/ivshmem-utils.c @@ -0,0 +1,155 @@ +/* + * Common utilities for testing ivshmem devices + * + * SPDX-FileCopyrightText: 2012 SUSE LINUX Products GmbH + * SPDX-FileCopyrightText: 2021 Red Hat, Inc. + * SPDX-FileCopyrightText: 2023 Linaro Ltd. + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ + +#include "ivshmem-utils.h" + +gchar *mktempshm(int size, int *fd) +{ + while (true) { + /* Relative path to the shm filesystem, e.g. '/dev/shm'. */ + gchar *shm_rel_path; + + shm_rel_path =3D g_strdup_printf("/ivshmem_qtest-%u-%u", getpid(), + g_test_rand_int()); + *fd =3D shm_open(shm_rel_path, O_CREAT|O_RDWR|O_EXCL, + S_IRWXU|S_IRWXG|S_IRWXO); + if (*fd > 0) { + g_assert(ftruncate(*fd, size) =3D=3D 0); + return shm_rel_path; + } + + g_free(shm_rel_path); + + if (errno !=3D EEXIST) { + perror("shm_open"); + return NULL; + } + } +} + +gchar *mktempsocket(void) +{ + gchar *server_socket_path; + + server_socket_path =3D g_strdup_printf("/tmp/ivshmem_socket_qtest-%u-%= u", + getpid(), g_test_rand_int()); + return server_socket_path; +} + +static void *server_thread(void *data) +{ + ServerThread *t =3D data; + IvshmemServer *server =3D &t->server; + + while (true) { + fd_set fds; + int maxfd, ret; + + FD_ZERO(&fds); + FD_SET(t->pipe[0], &fds); + maxfd =3D t->pipe[0] + 1; + + ivshmem_server_get_fds(server, &fds, &maxfd); + + ret =3D select(maxfd, &fds, NULL, NULL, NULL); + + if (ret < 0) { + if (errno =3D=3D EINTR) { + continue; + } + + g_critical("select error: %s\n", strerror(errno)); + break; + } + if (ret =3D=3D 0) { + continue; + } + + if (FD_ISSET(t->pipe[0], &fds)) { + break; + } + + if (ivshmem_server_handle_fds(server, &fds, maxfd) < 0) { + g_critical("ivshmem_server_handle_fds() failed\n"); + break; + } + } + + return NULL; +} + +void test_ivshmem_server_start(ServerThread *thread, + const char *server_socket_path, + const char *shm_rel_path, unsigned num_vect= ors) +{ + g_autoptr(GError) err =3D NULL; + int ret; + struct stat shm_st; + char *shm_path; + + g_assert(thread !=3D NULL); + g_assert(server_socket_path !=3D NULL); + g_assert_cmpint(num_vectors, >, 0); + g_assert(shm_rel_path !=3D NULL); + + /* + * Find out shm size. shm_open() deals with relative paths but stat() = needs + * the full path to the shm file. + */ + shm_path =3D g_strdup_printf("/dev/shm%s", shm_rel_path); + ret =3D stat(shm_path, &shm_st); + g_assert_cmpint(ret, =3D=3D, 0); + g_assert_cmpint(shm_st.st_size, >, 0); + + ret =3D ivshmem_server_init(&thread->server, server_socket_path, shm_r= el_path, + true, shm_st.st_size, num_vectors, g_test_verbose()); + g_assert_cmpint(ret, =3D=3D, 0); + ret =3D ivshmem_server_start(&thread->server); + g_assert_cmpint(ret, =3D=3D, 0); + thread->status =3D SERVER; + + g_unix_open_pipe(thread->pipe, FD_CLOEXEC, &err); + g_assert_no_error(err); + thread->status |=3D PIPE; + + thread->thread =3D g_thread_new("ivshmem-server", server_thread, threa= d); + g_assert(thread->thread !=3D NULL); + thread->status |=3D THREAD; +} + +void test_ivshmem_server_stop(ServerThread *thread) +{ + /* + * This function can be called any time on a test error/abort (e.g., i= t can + * be called from the abort handler), including from the + * test_ivshmem_server_start(). Therefore, the start steps (server sta= rted, + * pipe created, and thread created) are tracked when the server start= s and + * then checked below accordingly for proper termination. + */ + + if (thread->status & THREAD) { + /* Ask to exit from thread. */ + if (qemu_write_full(thread->pipe[1], "q", 1) !=3D 1) { + g_error("qemu_write_full: %s", g_strerror(errno)); + } + + /* Wait thread to exit. */ + g_thread_join(thread->thread); + } + + if (thread->status & PIPE) { + close(thread->pipe[1]); + close(thread->pipe[0]); + } + + if (thread->status & SERVER) { + ivshmem_server_close(&thread->server); + } +} diff --git a/tests/qtest/ivshmem-utils.h b/tests/qtest/ivshmem-utils.h new file mode 100644 index 0000000000..c43661caac --- /dev/null +++ b/tests/qtest/ivshmem-utils.h @@ -0,0 +1,56 @@ +/* + * Common utilities for testing ivshmem devices + * + * SPDX-FileCopyrightText: 2012 SUSE LINUX Products GmbH + * SPDX-FileCopyrightText: 2021 Red Hat, Inc. + * SPDX-FileCopyrightText: 2023 Linaro Ltd. + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ + +#ifndef QTEST_IVSHMEM_UTILS_H +#define QTEST_IVSHMEM_UTILS_H + +#include "qemu/osdep.h" +#include +#include "contrib/ivshmem-server/ivshmem-server.h" +#include "libqtest.h" + +enum Reg { + INTRMASK =3D 0, + INTRSTATUS =3D 4, + IVPOSITION =3D 8, + DOORBELL =3D 12, +}; + +enum ServerStartStatus { + SERVER =3D 1, /* Ivshmem server started */ + THREAD =3D 2, /* Thread for monitoring fds created */ + PIPE =3D 4, /* Pipe created */ +}; + +typedef struct ServerThread { + GThread *thread; + IvshmemServer server; + /* + * Pipe is used to communicate with the thread, asking it to terminate= on + * receiving 'q'. + */ + int pipe[2]; + /* + * Server statuses are used to keep track of thread/server/pipe start = since + * test_ivshmem_server_stop can be called at any time on a test error, + * even from test_ivshmem_server_start itself, therefore, they are use= d for + * proper service termination. + */ + enum ServerStartStatus status; +} ServerThread; + +gchar *mktempshm(int size, int *fd); +gchar *mktempsocket(void); +void test_ivshmem_server_start(ServerThread *thread, + const char *server_socket_path, + const char *shm_rel_path, unsigned num_vect= ors); +void test_ivshmem_server_stop(ServerThread *thread); + +#endif /* QTEST_IVSHMEM_UTILS_H */ diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index b071d400b3..b6c4ca937c 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -55,9 +55,9 @@ qtests_i386 =3D \ (config_all_devices.has_key('CONFIG_PVPANIC_ISA') ? ['pvpanic-test'] : [= ]) + \ (config_all_devices.has_key('CONFIG_PVPANIC_PCI') ? ['pvpanic-pci-test']= : []) + \ (config_all_devices.has_key('CONFIG_HDA') ? ['intel-hda-test'] : []) + = \ - (config_all_devices.has_key('CONFIG_I82801B11') ? ['i82801b11-test'] : [= ]) + \ + (config_all_devices.has_key('CONFIG_I82801B11') ? ['i82801b11-test'] : [= ]) + \ (config_all_devices.has_key('CONFIG_IOH3420') ? ['ioh3420-test'] : []) += \ - (config_all_devices.has_key('CONFIG_LPC_ICH9') ? ['lpc-ich9-test'] : [])= + \ + (config_all_devices.has_key('CONFIG_LPC_ICH9') ? ['lpc-ich9-test'] : [])= + \ (config_all_devices.has_key('CONFIG_USB_UHCI') ? ['usb-hcd-uhci-test'] := []) + \ (config_all_devices.has_key('CONFIG_USB_UHCI') and = \ config_all_devices.has_key('CONFIG_USB_EHCI') ? ['usb-hcd-ehci-test'] := []) + \ @@ -305,7 +305,7 @@ qtests =3D { 'cdrom-test': files('boot-sector.c'), 'dbus-vmstate-test': files('migration-helpers.c') + dbus_vmstate1, 'erst-test': files('erst-test.c'), - 'ivshmem-test': [rt, '../../contrib/ivshmem-server/ivshmem-server.c'], + 'ivshmem-test': ['ivshmem-utils.c', '../../contrib/ivshmem-server/ivshme= m-server.c'], 'migration-test': migration_files, 'pxe-test': files('boot-sector.c'), 'qos-test': [chardev, io, qos_test_ss.apply(config_host, strict: false).= sources()], --=20 2.34.1 From nobody Wed Nov 27 02:37:57 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1701062579; cv=none; d=zohomail.com; s=zohoarc; b=ihujhLafJZNMCcQe6Wx5/7Q0s4WZgse3bYSBXz4AP/3YZM5sqD/fC1vFEhQtPqwZ5896UEvgUj+yjdxB0JMTiNbcQOfdu4j+zeX+a3TBkSe5rUmnQ12d8MXKCMhxs30fWxEQOT0BqWH6Ph0aQzk5KERo2j0XoEaQ2nDbWLnPR5M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1701062579; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=/qrtP7sSfrEUApSD9rVL4Ayre6N/0rnGZosMCQPlDJ4=; b=fHQI9qIecBd/nz3d51cel12jWrKfEIQI4SzgJFEhjNLBEDSY3DcDmp/wFrJ1rrdIu2egqAShcx7ouD3LSOgQsM2fvxyLryWN6w4V4Jxujlhgx04CL1OMXTyApMqDQWz2VORtRwQ6ldZiq2ALEue1fhjbmrwfSidugqRkFy4sm3c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1701062579502763.5217146553546; Sun, 26 Nov 2023 21:22:59 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r7U4T-0004T2-Cb; Mon, 27 Nov 2023 00:22:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r7U4Q-0004So-6V for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:10 -0500 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r7U4N-0008BT-7C for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:09 -0500 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-6cbda959062so3186424b3a.1 for ; Sun, 26 Nov 2023 21:22:06 -0800 (PST) Received: from amd.. ([2804:7f0:b402:7782:3e7c:3fff:fe7a:e83b]) by smtp.gmail.com with ESMTPSA id v13-20020aa7808d000000b006cb9f436232sm6392316pff.114.2023.11.26.21.22.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Nov 2023 21:22:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1701062525; x=1701667325; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/qrtP7sSfrEUApSD9rVL4Ayre6N/0rnGZosMCQPlDJ4=; b=ys4ZIn6sU9h8vUIG4Dg+b1+Xd7BQI3LIMFQkDdL78BpP6AAGqny0tCztuS4m3A8Otb zwF2lLd3gcXIEHZOfkbQMQfH+AolN8IgpyB2aMreHBl5PTc+H2giLGp2xNIpdpu5EDZP TVKXHsLTPiDk6/1wFJaFoO2lxA917y7YDw1fFYQTjH5z+2CVpn2kJ+R2tL0iPPLYVwtR EplK6SQIJoQJWcYiao+GI+RXF5p9O0C6UFTSfAK/cs1joUo/Api54uNpH7hxPN2BBDk1 xIolke+od981fngQInSznVdVKGK6ZL9cP4feq5iJfReCkV9Q/hEiFCPtag/U14wOH9A4 YzsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701062525; x=1701667325; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/qrtP7sSfrEUApSD9rVL4Ayre6N/0rnGZosMCQPlDJ4=; b=w2OdXiE6tVpuTYgUIkpf5uQ96BKncdKYMzc+qlKzsJMQL+LMXoQuvFajN+0T2i1HbT jmbIwalJWShOQEQEqhFC3WLnzjnKqBgyY9ThpfowrhW5JkPgj2vbfyAUeYLfE5Yd8RI4 zAZM6xoyAn1V8f2137jGwMVstS3odil9KPgr9YVJdODvuCBmmM5pHxNidJoewboh8cXU eq4dlqQ2fgOeG/2uT8CJ7Kb7uQwYOdm5elFEcgiJcJgdR3Q2qmYfEyJY4oFl4/H9aVkk zRNW24s/6uGO0aoHTpbry1JA2t4Y9MJ1l7lyKKZptkrH5DI8H8MuJzc9x40ppmayLLw5 kJiw== X-Gm-Message-State: AOJu0YwzNBFF7ix4Se2E+1uamdaj2Zmh4x9/m0O94XUgmyyeVsSFArK7 TFh7WQdJfINGzY3zuP51ugxe8mNNLRnXeZcvu5Lic3MU X-Google-Smtp-Source: AGHT+IEG61OU1PAzpK47lBZ3EsdKXPYIO2Ty4+TEtxXX12gpkvEBAVK5PivvUQO/NpcksWKNCoywHw== X-Received: by 2002:a05:6a00:1483:b0:6cb:6c9b:8892 with SMTP id v3-20020a056a00148300b006cb6c9b8892mr12541721pfu.29.1701062525527; Sun, 26 Nov 2023 21:22:05 -0800 (PST) From: Gustavo Romero To: qemu-devel@nongnu.org, philmd@linaro.org, peter.maydell@linaro.org, alex.bennee@linaro.org, richard.henderson@linaro.org Cc: thuth@redhat.com, gustavo.romero@linaro.org Subject: [PATCH 3/4] tests/qtest: Add ivshmem-flat test Date: Mon, 27 Nov 2023 05:20:23 +0000 Message-Id: <20231127052024.435743-4-gustavo.romero@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127052024.435743-1-gustavo.romero@linaro.org> References: <20231127052024.435743-1-gustavo.romero@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::431; envelope-from=gustavo.romero@linaro.org; helo=mail-pf1-x431.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1701062580376000003 Content-Type: text/plain; charset="utf-8" Add qtest for the ivshmem-flat device. Based-on: <20231113230149.321304-1-gustavo.romero@linaro.org> Signed-off-by: Gustavo Romero --- tests/qtest/ivshmem-flat-test.c | 319 ++++++++++++++++++++++++++++++++ tests/qtest/meson.build | 2 + 2 files changed, 321 insertions(+) create mode 100644 tests/qtest/ivshmem-flat-test.c diff --git a/tests/qtest/ivshmem-flat-test.c b/tests/qtest/ivshmem-flat-tes= t.c new file mode 100644 index 0000000000..7a4547637c --- /dev/null +++ b/tests/qtest/ivshmem-flat-test.c @@ -0,0 +1,319 @@ +/* + * Inter-VM Shared Memory Flat Device qtests + * + * SPDX-FileCopyrightText: 2023 Linaro Ltd. + * SPDX-FileContributor: Gustavo Romero + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ + +#include "ivshmem-utils.h" + +#define IVSHMEM_FLAT_MMR_ADDR 0x400FF000 +#define IVSHMEM_FLAT_SHM_ADDR 0x40100000 +#define SHM_SIZE 131072 /* 128k */ + +static ServerThread thread; + +uint32_t *shm_ptr; +char *shm_rel_path; +char *server_socket_path; + +static void cleanup(void) +{ + if (shm_ptr) { + munmap(shm_ptr, SHM_SIZE); + shm_ptr =3D NULL; + } + + if (shm_rel_path) { + shm_unlink(shm_rel_path); + shm_rel_path =3D NULL; + } + + if (server_socket_path) { + unlink(server_socket_path); + server_socket_path =3D NULL; + } +} + +static void abort_handler(void *data) +{ + test_ivshmem_server_stop(&thread); + cleanup(); +} + +/* + * Check if exactly 1 positive pulse (low->high->low) on 'irq' IRQ line ha= ppens + * in 'timeout' second(s). 'irq' must be intercepted using qtest_irq_inter= cept_* + * before this function can be used on it. It returns 0 when pulse is dete= cted, + * otherwise 1. + */ +static int test_ivshmem_flat_irq_positive_pulse(QTestState *qts, int irq, + int timeout) +{ + uint64_t num_raises =3D 0; + uint64_t num_lows =3D 0; + uint64_t end_time; + + end_time =3D g_get_monotonic_time() + timeout * G_TIME_SPAN_SECOND; + do { + if ((num_raises =3D qtest_get_irq_raised_counter(qts, 0))) { + num_lows =3D qtest_get_irq_lowered_counter(qts, 0); + /* Check for 1 raise and 1 low IRQ event. */ + if (num_raises =3D=3D num_lows && num_lows =3D=3D 1) { + return 0; + } else { + g_message("%s: Timeout expired", __func__); + return 1; + } + } + qtest_clock_step(qts, 10000); + } while (g_get_monotonic_time() < end_time); + + return 1; +} + +static inline uint32_t read_reg(QTestState *qts, enum Reg reg) +{ + uint32_t v; + + qtest_memread(qts, IVSHMEM_FLAT_MMR_ADDR + reg, &v, sizeof(v)); + + return v; +} + +static inline void write_reg(QTestState *qts, enum Reg reg, uint32_t v) +{ + qtest_memwrite(qts, IVSHMEM_FLAT_MMR_ADDR + reg, &v, sizeof(v)); +} + +/* + * Setup a test VM with ivshmem-flat device attached, IRQ properly set, and + * connected to the ivshmem-server. + */ +static QTestState *setup_vm(void) +{ + QTestState *qts; + const char *cmd_line; + + cmd_line =3D g_strdup_printf("-machine lm3s6965evb " + "-chardev socket,path=3D%s,id=3Divshm " + "-device ivshmem-flat,chardev=3Divshm," + "x-irq-qompath=3D'/machine/unattached/devic= e[1]/nvic/unnamed-gpio-in[0]'," + "x-bus-qompath=3D'/sysbus',shmem-size=3D%d", + server_socket_path, SHM_SIZE); + qts =3D qtest_init(cmd_line); + + return qts; +} + +static void test_ivshmem_flat_irq(void) +{ + QTestState *vm_state; + uint16_t own_id; + + vm_state =3D setup_vm(); + + qtest_irq_intercept_out_named(vm_state, + "/machine/peripheral-anon/device[0]", + "irq-output"); + + /* IVPOSTION has the device's own ID distributed by the ivshmem-server= . */ + own_id =3D read_reg(vm_state, IVPOSITION); + + /* Make device notify itself. */ + write_reg(vm_state, DOORBELL, (own_id << 16) | 0 /* vector 0 */); + + /* + * Check intercepted device's IRQ output line. Named IRQ line 'irq-out= put' + * was associated to qtest IRQ 0 and after self notification qtest IRQ= 0 + * must be toggled by the device. The test fails if no toggling is det= ected + * in 2 seconds. + */ + g_assert(test_ivshmem_flat_irq_positive_pulse(vm_state, 0, 2) =3D=3D 0= ); + + qtest_quit(vm_state); +} + +static void test_ivshmem_flat_shm_write(void) +{ + QTestState *vm_state; + int num_elements, i; + uint32_t *data; + + vm_state =3D setup_vm(); + + /* Prepare test data with random values. */ + data =3D g_malloc(SHM_SIZE); + num_elements =3D SHM_SIZE/sizeof(*data); + for (i =3D 0; i < num_elements; i++) { + data[i] =3D g_test_rand_int(); + } + + /* + * Write test data to VM address IVSHMEM_FLAT_SHM_ADDR, where the shar= ed + * memory region is located. + */ + qtest_memwrite(vm_state, IVSHMEM_FLAT_SHM_ADDR, data, SHM_SIZE); + + /* + * Since the shared memory fd is mmapped into this test process VMA at + * shm_ptr, every byte written by the VM in its shared memory region s= hould + * also be available in the test process via shm_ptr. Thus, data in sh= m_ptr + * is compared back against the original test data. + */ + for (i =3D 0; i < num_elements; i++) { + g_assert_cmpint(shm_ptr[i], =3D=3D, data[i]); + } + + qtest_quit(vm_state); +} + +static void test_ivshmem_flat_shm_read(void) +{ + QTestState *vm_state; + int num_elements, i; + uint32_t *data; + uint32_t v; + + vm_state =3D setup_vm(); + + /* Prepare test data with random values. */ + data =3D g_malloc(SHM_SIZE); + num_elements =3D SHM_SIZE/sizeof(*data); + for (i =3D 0; i < num_elements; i++) { + data[i] =3D g_test_rand_int(); + } + + /* + * Copy test data to the shared memory region so it can be read from t= he VM + * (IVSHMEM_FLAT_SHM_ADDR location). + */ + memcpy(shm_ptr, data, SHM_SIZE); + + /* Check data */ + for (i =3D 0; i < num_elements; i++) { + qtest_memread(vm_state, IVSHMEM_FLAT_SHM_ADDR + i * sizeof(v), &v, + sizeof(v)); + g_assert_cmpint(v, =3D=3D, data[i]); + } + + qtest_quit(vm_state); +} + +static void test_ivshmem_flat_shm_pair(void) +{ + QTestState *vm0_state, *vm1_state; + uint16_t vm0_peer_id, vm1_peer_id; + int num_elements, i; + uint32_t *data; + uint32_t v; + + vm0_state =3D setup_vm(); + vm1_state =3D setup_vm(); + + /* Get peer ID for the VM so it can be used for one notify each other.= */ + vm0_peer_id =3D read_reg(vm0_state, IVPOSITION); + vm1_peer_id =3D read_reg(vm1_state, IVPOSITION); + + /* Observe vm1 IRQ output line first. */ + qtest_irq_intercept_out_named(vm1_state, + "/machine/peripheral-anon/device[0]", + "irq-output"); + + /* Notify (interrupt) VM1 from VM0. */ + write_reg(vm0_state, DOORBELL, (vm1_peer_id << 16) | 0 /* vector 0 */); + + /* Check if VM1 IRQ output line is toggled after notification from VM0= . */ + g_assert(test_ivshmem_flat_irq_positive_pulse(vm1_state, 0, 2) =3D=3D = 0); + + /* Secondly, observe VM0 IRQ output line first. */ + qtest_irq_intercept_out_named(vm0_state, + "/machine/peripheral-anon/device[0]", + "irq-output"); + + /* ... and do the opposite: notify (interrupt) VM0 from VM1. */ + write_reg(vm1_state, DOORBELL, (vm0_peer_id << 16) | 0 /* vector 0 */); + + /* Check if VM0 IRQ output line is toggled after notification from VM0= . */ + g_assert(test_ivshmem_flat_irq_positive_pulse(vm0_state, 0, 2) =3D=3D = 0); + + /* Prepare test data with random values. */ + data =3D g_malloc(SHM_SIZE); + num_elements =3D SHM_SIZE/sizeof(*data); + for (i =3D 0; i < num_elements; i++) { + data[i] =3D g_test_rand_int(); + } + + /* Write test data on VM0. */ + qtest_memwrite(vm0_state, IVSHMEM_FLAT_SHM_ADDR, data, SHM_SIZE); + + /* Check test data on VM1. */ + for (i =3D 0; i < num_elements; i++) { + qtest_memread(vm1_state, IVSHMEM_FLAT_SHM_ADDR + i * sizeof(v), &v, + sizeof(v)); + g_assert_cmpint(v, =3D=3D, data[i]); + } + + /* Prepare new test data with random values. */ + for (i =3D 0; i < num_elements; i++) { + data[i] =3D g_test_rand_int(); + } + + /* Write test data on VM1. */ + qtest_memwrite(vm1_state, IVSHMEM_FLAT_SHM_ADDR, data, SHM_SIZE); + + /* Check test data on VM0. */ + for (i =3D 0; i < num_elements; i++) { + qtest_memread(vm0_state, IVSHMEM_FLAT_SHM_ADDR + i * sizeof(v), &v, + sizeof(v)); + g_assert_cmpint(v, =3D=3D, data[i]); + } + + qtest_quit(vm0_state); + qtest_quit(vm1_state); +} + +int main(int argc, char *argv[]) +{ + int shm_fd, r; + + g_test_init(&argc, &argv, NULL); + + /* If test fails, stop server, cleanup socket and shm files. */ + qtest_add_abrt_handler(abort_handler, NULL); + + shm_rel_path =3D mktempshm(SHM_SIZE, &shm_fd); + g_assert(shm_rel_path); + + /* + * Map shm to this test's VMA so it's possible to read/write from/to i= t. For + * VMs with the ivhsmem-flat device attached, this region will also be + * mapped in their own memory layout, at IVSHMEM_FLAT_SHM_ADDR (defaul= t). + */ + shm_ptr =3D mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_= fd, 0); + g_assert(shm_ptr !=3D MAP_FAILED); + + server_socket_path =3D mktempsocket(); + /* It never fails, so no assert(). */ + + /* + * Currently, ivshmem-flat device only supports notification via 1 vec= tor, + * i.e. vector 0. + */ + test_ivshmem_server_start(&thread, server_socket_path, shm_rel_path, 1= ); + + /* Register tests. */ + qtest_add_func("/ivshmem-flat/irq", test_ivshmem_flat_irq); + qtest_add_func("/ivshmem-flat/shm-write", test_ivshmem_flat_shm_write); + qtest_add_func("/ivshmem-flat/shm-read", test_ivshmem_flat_shm_read); + qtest_add_func("/ivshmem-flat/pair", test_ivshmem_flat_shm_pair); + + r =3D g_test_run(); + + test_ivshmem_server_stop(&thread); + cleanup(); + + return r; +} diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index b6c4ca937c..e7475c7e23 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -195,6 +195,7 @@ qtests_aspeed =3D \ 'aspeed_smc-test', 'aspeed_gpio-test'] qtests_arm =3D \ + (config_all_devices.has_key('CONFIG_IVSHMEM_FLAT_DEVICE') ? ['ivshmem-fl= at-test'] : []) + \ (config_all_devices.has_key('CONFIG_MPS2') ? ['sse-timer-test'] : []) + \ (config_all_devices.has_key('CONFIG_CMSDK_APB_DUALTIMER') ? ['cmsdk-apb-= dualtimer-test'] : []) + \ (config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-time= r-test'] : []) + \ @@ -306,6 +307,7 @@ qtests =3D { 'dbus-vmstate-test': files('migration-helpers.c') + dbus_vmstate1, 'erst-test': files('erst-test.c'), 'ivshmem-test': ['ivshmem-utils.c', '../../contrib/ivshmem-server/ivshme= m-server.c'], + 'ivshmem-flat-test': ['ivshmem-utils.c', '../../contrib/ivshmem-server/i= vshmem-server.c'], 'migration-test': migration_files, 'pxe-test': files('boot-sector.c'), 'qos-test': [chardev, io, qos_test_ss.apply(config_host, strict: false).= sources()], --=20 2.34.1 From nobody Wed Nov 27 02:37:57 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1701062590; cv=none; d=zohomail.com; s=zohoarc; b=eOJEJI/fFxm03FL+yoQxc5q49CleK863xV4HfgcnBgcolExmvm5WzhGg5fcPNDUWGACX6PAOy1zajynutK3gL8M6OL11Tlvfp9GjjKKTFo/QSyu2ipG+Qts09ddI0h5XPLWXJOFOoS1o8QKfVVeN160/OIamWpug0QANe8/9gUs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1701062590; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=IRRD/Ekj0h83Op/FvtNapJt01xEZPwiTxtAfYesAOBw=; b=PF3Vx1uQ32eJlxeYzQSK4j2+2mJnTEdJxhRbDHzztmzrt1PfXB9AuKFjpaT5GpBfFbyHrSfNH0HRjxoIyid/DyqpuoYwhJjYbZMTJFuTlhg7uo38bs/V5d6HeZrz6IdQAtHq9ZRNnS9kE5e1FFvflm/LCNpoPSmUJktwAV7eroI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1701062590987698.9290464094481; Sun, 26 Nov 2023 21:23:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r7U4Z-0004UK-Ah; Mon, 27 Nov 2023 00:22:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r7U4V-0004TV-Qp for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:16 -0500 Received: from mail-oi1-x235.google.com ([2607:f8b0:4864:20::235]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r7U4T-0008Bk-QM for qemu-devel@nongnu.org; Mon, 27 Nov 2023 00:22:15 -0500 Received: by mail-oi1-x235.google.com with SMTP id 5614622812f47-3b861a3be3eso827775b6e.0 for ; Sun, 26 Nov 2023 21:22:12 -0800 (PST) Received: from amd.. ([2804:7f0:b402:7782:3e7c:3fff:fe7a:e83b]) by smtp.gmail.com with ESMTPSA id v13-20020aa7808d000000b006cb9f436232sm6392316pff.114.2023.11.26.21.22.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Nov 2023 21:22:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1701062532; x=1701667332; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IRRD/Ekj0h83Op/FvtNapJt01xEZPwiTxtAfYesAOBw=; b=hX4y2CqS4ZShaGLUK3HOoE8HWu7vZ781OdDo331QES3bq2j3ekTQAioqi22wf8Lqvu Fv8nLIeMe8iRb+p2wN7/wfwxsVZ+1P6usCORLsF91zR5cq286E6dUrtTzm7DK/htc14N 55ejupTkD2lwQKe+T3Ehv+/JrSCOMJr2nRo25F0iins0ykSQs7dQoICdGPnhdcn/sKZf 7B3eqYgKxhVCMdbDBMMANxh4rjxHXHAmkzyCf26whYactrk3iwzz7faovlOnzXQGZo0p jOO0PoiW672qgGhWznzvx0XFDK3p2QrvpEn4vkjXrmHtDcXOj2v+KPQzFvTR0Yk2pbfj NNMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701062532; x=1701667332; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IRRD/Ekj0h83Op/FvtNapJt01xEZPwiTxtAfYesAOBw=; b=Ov8W5XQRgIevQm0TZBbJyQNBNSYxyE10RDBLhIne5lo6b0AIPjNv/vaTLociYjzNvD W9cJc9RqZZo5FLP2L0fj5hm+MSRErrHM7OySHquwAd8f93MXhTvIYANJk0uithPt/tty u/7RWh648ci4SCQJywkuxoiNgHysj07AFqvPE5VOLZBBlWpnbuqdebAtghCIKfcki3/M COxTENpukF4s4MeIsTDzK62TlvLmAVbXu9Ugodm+AIQuWmlIZ/O3bfHg+pyKuXYPz+Fh qPcta0xON8NTcyUP6pb2bpfnNL1faO9NbwxwSPsOhM0MAe2MWzmtYefo8+XN5KA6uwL1 CVMg== X-Gm-Message-State: AOJu0Yxin/TcqzpxDmkuTOOSM35u6k0YHRkqi5KbYBgJlE9gIp5bCL2q OTHF1aFp8cJT4b4pIB4Tc0NQ9MgSP1F+UFeRYL5AnsLd X-Google-Smtp-Source: AGHT+IGoHhUmlmRE4sSolDjV0Xe1Kz7BdtC+Cnd0gjEuyIlrTDrEt8fOSdHpwDRD1pWAm1EJd1Vqeg== X-Received: by 2002:a05:6808:2115:b0:3b2:dd87:fc with SMTP id r21-20020a056808211500b003b2dd8700fcmr14613191oiw.2.1701062532036; Sun, 26 Nov 2023 21:22:12 -0800 (PST) From: Gustavo Romero To: qemu-devel@nongnu.org, philmd@linaro.org, peter.maydell@linaro.org, alex.bennee@linaro.org, richard.henderson@linaro.org Cc: thuth@redhat.com, gustavo.romero@linaro.org Subject: [PATCH 4/4] hw/misc/ivshmem: Rename ivshmem to ivshmem-pci Date: Mon, 27 Nov 2023 05:20:24 +0000 Message-Id: <20231127052024.435743-5-gustavo.romero@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231127052024.435743-1-gustavo.romero@linaro.org> References: <20231127052024.435743-1-gustavo.romero@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::235; envelope-from=gustavo.romero@linaro.org; helo=mail-oi1-x235.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1701062592522000007 Content-Type: text/plain; charset="utf-8" Because now there is also an MMIO ivshmem device (ivshmem-flat.c), and ivshmem.c is a PCI specific implementation, rename it to ivshmem-pci.c. Signed-off-by: Gustavo Romero Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/misc/{ivshmem.c =3D> ivshmem-pci.c} | 0 hw/misc/meson.build | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename hw/misc/{ivshmem.c =3D> ivshmem-pci.c} (100%) diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem-pci.c similarity index 100% rename from hw/misc/ivshmem.c rename to hw/misc/ivshmem-pci.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 7b03fc1345..6f0a7c31cd 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -37,7 +37,7 @@ system_ss.add(when: 'CONFIG_SIFIVE_U_PRCI', if_true: file= s('sifive_u_prci.c')) subdir('macio') =20 # ivshmem devices -system_ss.add(when: 'CONFIG_IVSHMEM_DEVICE', if_true: files('ivshmem.c')) +system_ss.add(when: 'CONFIG_IVSHMEM_DEVICE', if_true: files('ivshmem-pci.c= ')) system_ss.add(when: 'CONFIG_IVSHMEM_FLAT_DEVICE', if_true: files('ivshmem-= flat.c')) =20 system_ss.add(when: 'CONFIG_ALLWINNER_SRAMC', if_true: files('allwinner-sr= amc.c')) --=20 2.34.1