From: "João Peixoto" <jpeixoto@osyx.tech>
To: gregkh@linuxfoundation.org, will@kernel.org
Cc: catalin.marinas@arm.com, andrew.jones@oss.qualcomm.com,
pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu,
alex@ghiti.fr, krzk+dt@kernel.org, robh@kernel.org,
conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org,
rdunlap@infradead.org, jose@osyx.tech, davidmcerdeira@osyx.tech,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-riscv@lists.infradead.org, linux-doc@vger.kernel.org,
devicetree@vger.kernel.org
Subject: [PATCH v5 0/3] virt: bao: add Bao hypervisor IPC and I/O dispatcher drivers
Date: Sat, 7 Nov 2026 08:06:49 +0000 [thread overview]
Message-ID: <cover.1794038390.git.jpeixoto@osyx.tech> (raw)
This series adds guest-side drivers for the Bao static-partitioning
hypervisor: an IPC shared-memory driver, an I/O dispatcher that lets a
backend guest service VirtIO I/O for frontend guests, their UAPI and a
MAINTAINERS entry.
Bao is a lightweight static-partitioning hypervisor for embedded and
safety-critical systems (https://github.com/bao-project).
- The IPC shared-memory driver lets Bao guests exchange data through a
shared-memory region split into a read and a write channel, exposed
as a misc character device (read(), write(), mmap()). The channels
are declared on the kernel command line.
- The I/O dispatcher bridges Bao's Remote I/O mechanism to a userspace
VMM: the VMM creates each device model from /dev/bao, receives the
frontend's MMIO accesses and completes them, with ioeventfd/irqfd
support for the fast paths.
Changes since v4
----------------
All findings of the Sashiko review of v4 are addressed:
- creating a device model (BAO_IOCTL_CREATE_DM) requires CAP_SYS_RAWIO,
is refused under lockdown, rejects shared-memory regions overlapping
System RAM and claims the region with request_mem_region(), mirroring
/dev/mem;
- the notification line is requested exclusively and is checked against
the sources the interrupt controller declares before it is mapped,
since irqchip drivers trust the specifiers they are given (a PLIC
line above riscv,ndev wrote out of bounds). Its mapping is not
disposed when request_irq() fails, though: irq_create_of_mapping()
returns the existing mapping of a line that is already mapped without
counting its users, so disposing it would free the interrupt of
whoever owns the line. A leftover mapping is reused when the line is
mapped again;
- a request that cannot be delivered is completed and fetching goes on,
so pending requests are no longer stranded;
- the ioeventfds and irqfds of a device model are bounded (256 each) and
their flags validated; requests still queued when a client is
destroyed are completed back to the hypervisor;
- the IPC driver registers its devices only once every channel has been
parsed and mapped, and never unwinds a device it has registered.
Other changes:
- the requests handed to the VMM are tracked: a completion must name one
of them and only provides its value, so userspace can no longer pick
the hypercall operation (an ASK lost a request), and the requests a
VMM leaves behind when it exits are completed on release;
- a device model id can only be bound to one file descriptor at a time;
- RISC-V: the hypercall status is taken from the SBI value (a1), where
Bao returns it, not from the SBI error (a0), which is always 0; a
failed hypercall was taken as a success. Both drivers depend on
RISCV_SBI, so M-mode kernels no longer fail to build them;
- mmap goes through .mmap_prepare and only shared mappings are allowed;
.compat_ioctl is set, the structures having the same layout for 32-bit
userspace; DM_GET_INFO and IO_CLIENT_ATTACH are _IOR; the ioctl table
reserves 0xA7 00-0F;
- bao_ipcshmem.channels= is documented in kernel-parameters.txt;
- rebased on v7.4-rc1.
Changes since v3
----------------
The two design comments on v3 changed the shape of the series, which
went from six patches to three.
- No device tree (Krzysztof Kozlowski): both bindings and the "bao"
vendor prefix are dropped. The IPC channels are a software contract
between the hypervisor and the guest and are declared on the kernel
command line (bao_ipcshmem.channels=...). The set of device models a
backend serves is a contract between the hypervisor and the VMM, so,
following drivers/virt/acrn, the I/O dispatcher exposes a single
/dev/bao control device and the VMM creates each device model with
BAO_IOCTL_CREATE_DM (shared-memory region + notification line), which
returns a per-DM file descriptor; the DM lives as long as the
descriptor. The notification line is resolved against the device
tree's root interrupt parent, like any device's interrupt.
- No architecture code (Will Deacon): the hypercall helpers live in
drivers/virt/bao/bao_hypercall.h and use arm_smccc_hvc() for the IPC
hypercall and, because the Remote I/O hypercall returns the request
in x1-x6, the SMCCC v1.2 arm_smccc_1_2_hvc(). RISC-V uses sbi_ecall()
for IPC and a local ecall for Remote I/O (see open items). 32-bit Arm
has no SMCCC v1.2 helper, so the I/O dispatcher is limited to arm64
and RISC-V for now; the IPC driver still supports 32-bit Arm through
SMCCC v1.1 (HAVE_ARM_SMCCC).
- The standalone "consolidate the IPC hypercall ID" patch is folded into
the driver patches (Andrew Jones).
- All findings of the Sashiko review of v3 are addressed. Details are in
the per-patch changelogs.
- The ioctl type is 0xA7: 7.3-rc1 registered 0xA6 for memory allocation
profiling.
Testing
-------
Built on v7.4-rc1 with GCC 15 (W=1) for arm64, arm and riscv, at every
commit, and with clang 21 (W=1) for arm64 and riscv. Run-time tested
under Bao v2.0.0 on QEMU aarch64 virt and QEMU riscv64 virt with the
bao-demos demos: the IPC driver exchanging messages in both directions
between a Linux guest and a FreeRTOS guest, and the I/O dispatcher with
a Linux backend serving console, network and block device models to a
FreeRTOS guest and to Linux guests, including killing and restarting
the VMMs, plus a userspace test of the /dev/bao error paths (privilege,
region and line checks, duplicate ids, limits, completions) run next to
the live VMMs. 32-bit Arm is compile-tested only.
Open items
----------
- RISC-V: the Bao SBI extension still uses the experimental extension
space (0x08000ba0), and the Remote I/O hypercall returns the request
in a2-a7, which does not follow the SBI calling convention (Andrew
Jones, v2). Changing that means a hypervisor ABI change (status in
a0/a1, request through shared memory); the RISC-V support is
experimental until then, or it can be split out of this series if
preferred.
- Bao does not implement the SMCCC vendor-hypervisor UID call, so the
drivers cannot detect the hypervisor yet; adding it is planned on the
hypervisor side.
- The notification line is a line of the interrupt controller the device
tree's root node points at through interrupt-parent; a guest whose
root node has none cannot use the I/O dispatcher yet.
v4: https://lore.kernel.org/all/cover.1790357735.git.jpeixoto@osyx.tech/
v3: https://lore.kernel.org/all/cover.1786010512.git.jpeixoto@osyx.tech/
João Peixoto (3):
virt: bao: add IPC shared-memory driver
virt: bao: add I/O dispatcher driver
MAINTAINERS: add Bao hypervisor entry
.../admin-guide/kernel-parameters.txt | 15 +
.../userspace-api/ioctl/ioctl-number.rst | 2 +
MAINTAINERS | 8 +
drivers/virt/Kconfig | 2 +
drivers/virt/Makefile | 1 +
drivers/virt/bao/Kconfig | 5 +
drivers/virt/bao/Makefile | 4 +
drivers/virt/bao/bao_hypercall.h | 205 ++++++++
drivers/virt/bao/io-dispatcher/Kconfig | 20 +
drivers/virt/bao/io-dispatcher/Makefile | 4 +
drivers/virt/bao/io-dispatcher/bao_drv.h | 401 ++++++++++++++++
drivers/virt/bao/io-dispatcher/dm.c | 438 ++++++++++++++++++
drivers/virt/bao/io-dispatcher/driver.c | 71 +++
drivers/virt/bao/io-dispatcher/intc.c | 186 ++++++++
drivers/virt/bao/io-dispatcher/io_client.c | 430 +++++++++++++++++
.../virt/bao/io-dispatcher/io_dispatcher.c | 173 +++++++
drivers/virt/bao/io-dispatcher/ioeventfd.c | 350 ++++++++++++++
drivers/virt/bao/io-dispatcher/irqfd.c | 321 +++++++++++++
drivers/virt/bao/ipcshmem/Kconfig | 16 +
drivers/virt/bao/ipcshmem/Makefile | 3 +
drivers/virt/bao/ipcshmem/ipcshmem.c | 421 +++++++++++++++++
include/uapi/linux/bao.h | 126 +++++
22 files changed, 3202 insertions(+)
create mode 100644 drivers/virt/bao/Kconfig
create mode 100644 drivers/virt/bao/Makefile
create mode 100644 drivers/virt/bao/bao_hypercall.h
create mode 100644 drivers/virt/bao/io-dispatcher/Kconfig
create mode 100644 drivers/virt/bao/io-dispatcher/Makefile
create mode 100644 drivers/virt/bao/io-dispatcher/bao_drv.h
create mode 100644 drivers/virt/bao/io-dispatcher/dm.c
create mode 100644 drivers/virt/bao/io-dispatcher/driver.c
create mode 100644 drivers/virt/bao/io-dispatcher/intc.c
create mode 100644 drivers/virt/bao/io-dispatcher/io_client.c
create mode 100644 drivers/virt/bao/io-dispatcher/io_dispatcher.c
create mode 100644 drivers/virt/bao/io-dispatcher/ioeventfd.c
create mode 100644 drivers/virt/bao/io-dispatcher/irqfd.c
create mode 100644 drivers/virt/bao/ipcshmem/Kconfig
create mode 100644 drivers/virt/bao/ipcshmem/Makefile
create mode 100644 drivers/virt/bao/ipcshmem/ipcshmem.c
create mode 100644 include/uapi/linux/bao.h
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
--
2.53.0
next reply other threads:[~2026-11-07 8:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-07 8:06 João Peixoto [this message]
2026-11-07 8:06 ` [PATCH v5 1/3] virt: bao: add IPC shared-memory driver João Peixoto
2026-11-07 8:06 ` [PATCH v5 2/3] virt: bao: add I/O dispatcher driver João Peixoto
2026-11-07 8:06 ` [PATCH v5 3/3] MAINTAINERS: add Bao hypervisor entry João Peixoto
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1794038390.git.jpeixoto@osyx.tech \
--to=jpeixoto@osyx.tech \
--cc=alex@ghiti.fr \
--cc=andrew.jones@oss.qualcomm.com \
--cc=aou@eecs.berkeley.edu \
--cc=catalin.marinas@arm.com \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=davidmcerdeira@osyx.tech \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jose@osyx.tech \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=pjw@kernel.org \
--cc=rdunlap@infradead.org \
--cc=robh@kernel.org \
--cc=skhan@linuxfoundation.org \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®