[RFC PATCH v3 4/6] virt: bao: add I/O dispatcher driver
Will Deacon
will at kernel.org
Tue Aug 11 02:29:35 PDT 2026
On Fri, Aug 07, 2026 at 08:39:31AM +0100, João Peixoto wrote:
> Add the Bao I/O dispatcher, used by backend VMs to service I/O on behalf
> of frontend guests. It bridges Bao's Remote I/O mechanism to userspace
> VirtIO backend device models.
>
> Each backend device has a contiguous shared-memory region for exchanging
> I/O buffers with its frontend and an interrupt the hypervisor uses to
> signal pending requests. Userspace drives the dispatcher through a set of
> ioctls on a misc character device.
>
> Co-developed-by: José Martins <jose at osyx.tech>
> Signed-off-by: José Martins <jose at osyx.tech>
> Co-developed-by: David Cerdeira <davidmcerdeira at osyx.tech>
> Signed-off-by: David Cerdeira <davidmcerdeira at osyx.tech>
> Signed-off-by: João Peixoto <jpeixoto at osyx.tech>
> ---
> diff --git a/arch/arm64/include/asm/bao.h b/arch/arm64/include/asm/bao.h
> index ab9b283168e3..1dc09a2c261b 100644
> --- a/arch/arm64/include/asm/bao.h
> +++ b/arch/arm64/include/asm/bao.h
> @@ -14,6 +14,7 @@
> #define __ASM_ARM64_BAO_H
>
> #include <linux/arm-smccc.h>
> +#include <linux/bao.h>
>
> static inline unsigned long bao_ipcshmem_hypercall(unsigned long hypercall_id,
> unsigned long ipcshmem_id)
> @@ -28,4 +29,33 @@ static inline unsigned long bao_ipcshmem_hypercall(unsigned long hypercall_id,
> return res.a0;
> }
>
> +static inline unsigned long
> +bao_remio_hypercall(struct bao_remio_hypercall_ctx *ctx)
> +{
> + register int x0 asm("x0") =
> + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_64,
> + ARM_SMCCC_OWNER_VENDOR_HYP, BAO_REMIO_HYPERCALL_ID);
> + register u64 x1 asm("x1") = ctx->dm_id;
> + register u64 x2 asm("x2") = ctx->addr;
> + register u64 x3 asm("x3") = ctx->op;
> + register u64 x4 asm("x4") = ctx->value;
> + register u64 x5 asm("x5") = ctx->request_id;
> + register u64 x6 asm("x6") = 0;
> +
> + asm volatile("hvc 0\n\t"
> + : "=r"(x0), "=r"(x1), "=r"(x2), "=r"(x3), "=r"(x4),
> + "=r"(x5), "=r"(x6)
> + : "r"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5)
> + : "memory");
> +
> + ctx->addr = x1;
> + ctx->op = x2;
> + ctx->value = x3;
> + ctx->access_width = x4;
> + ctx->request_id = x5;
> + ctx->npend_req = x6;
> +
> + return x0;
> +}
Why aren't you using SMCCC for this? You should be able to use that (like
you did for bao_ipcshmem_hypercall()) and then there would be no need to
add any code to arch/arm64/.
Will
More information about the linux-arm-kernel
mailing list