[PATCH RFC 3/3] lib: sbi: Add VIRQ ecall extension

Andrew Jones andrew.jones at oss.qualcomm.com
Fri Feb 13 13:03:17 PST 2026


On Fri, Feb 13, 2026 at 02:04:59PM -0500, Raymond Mao wrote:
> From: Raymond Mao <raymond.mao at riscstar.com>
> 
> Add vendor SBI extension ecall for VIRQ.
> This allows S-mode payload to pop/complete the next pending VIRQ has
> couried into the current domain.
> 
> Signed-off-by: Raymond Mao <raymond.mao at riscstar.com>
> ---
>  include/sbi/sbi_ecall_interface.h | 18 ++++++++++
>  lib/sbi/Kconfig                   |  5 +++
>  lib/sbi/objects.mk                |  3 ++
>  lib/sbi/sbi_ecall_virq.c          | 57 +++++++++++++++++++++++++++++++
>  4 files changed, 83 insertions(+)
>  create mode 100644 lib/sbi/sbi_ecall_virq.c
> 
> diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h
> index 76624e3f..9cb9a7eb 100644
> --- a/include/sbi/sbi_ecall_interface.h
> +++ b/include/sbi/sbi_ecall_interface.h
> @@ -126,6 +126,24 @@
>  #define SBI_EXT_FWFT_SET		0x0
>  #define SBI_EXT_FWFT_GET		0x1
>  
> +#ifdef CONFIG_SBI_ECALL_VIRQ
> +
> +/* Vendor extension base range is defined by the SBI spec. Choose a private ID. */
> +#define SBI_EXT_VIRQ			0x0900524d

I'm not sure where this number comes from. I'd expect it to be
0x56495251 == "VIRQ"

> +
> +/* Function IDs for SBI_EXT_VIRQ */
> +#define SBI_EXT_VIRQ_POP		0
> +#define SBI_EXT_VIRQ_COMPLETE		1
> +
> +/*
> + * SBI_EXT_VIRQ_POP
> + * Returns:
> + *   a0: SBI error code (0 for success)
> + *   a1: next pending hwirq (0 if none pending)
                         ^ virq, but...

how about creating an SBI function which allows registering a shared
memory region (as several SBI extensions already do) and then place a
bitmap in that shared memory which represents all virqs (a set bit means
that that virq is pending). That would allow S-mode to immediately get
all pending virqs in its SSE handler and we wouldn't need to worry about
a queue filling up. The downside is that S-mode wouldn't necessarily
handle the virqs in FIFO order. But, that can be a feature, because the
queue forces FIFO order whereas S-mode may need to handle them in some
priority order instead.

> + */
> +
> +#endif
> +
>  enum sbi_fwft_feature_t {
>  	SBI_FWFT_MISALIGNED_EXC_DELEG		= 0x0,
>  	SBI_FWFT_LANDING_PAD			= 0x1,
> diff --git a/lib/sbi/Kconfig b/lib/sbi/Kconfig
> index c6cc04bc..8479f861 100644
> --- a/lib/sbi/Kconfig
> +++ b/lib/sbi/Kconfig
> @@ -69,4 +69,9 @@ config SBI_ECALL_SSE
>  config SBI_ECALL_MPXY
>  	bool "MPXY extension"
>  	default y
> +
> +config SBI_ECALL_VIRQ
> +	bool "VIRQ extension"
> +	default y
> +
>  endmenu
> diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk
> index 07d13229..18e590ab 100644
> --- a/lib/sbi/objects.mk
> +++ b/lib/sbi/objects.mk
> @@ -64,6 +64,9 @@ libsbi-objs-$(CONFIG_SBI_ECALL_SSE) += sbi_ecall_sse.o
>  carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_MPXY) += ecall_mpxy
>  libsbi-objs-$(CONFIG_SBI_ECALL_MPXY) += sbi_ecall_mpxy.o
>  
> +carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_VIRQ) += ecall_virq
> +libsbi-objs-$(CONFIG_SBI_ECALL_VIRQ) += sbi_ecall_virq.o
> +
>  libsbi-objs-y += sbi_bitmap.o
>  libsbi-objs-y += sbi_bitops.o
>  libsbi-objs-y += sbi_console.o
> diff --git a/lib/sbi/sbi_ecall_virq.c b/lib/sbi/sbi_ecall_virq.c
> new file mode 100644
> index 00000000..b192598e
> --- /dev/null
> +++ b/lib/sbi/sbi_ecall_virq.c
> @@ -0,0 +1,57 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2026 RISCstar Solutions.
> + *
> + * Author: Raymond Mao <raymond.mao at riscstar.com>
> + */
> +
> +#include <sbi/sbi_console.h>
> +#include <sbi/sbi_ecall.h>
> +#include <sbi/sbi_ecall_interface.h>
> +#include <sbi/sbi_error.h>
> +#include <sbi/sbi_trap.h>
> +#include <sbi/sbi_virq.h>
> +
> +static int sbi_ecall_virq_handler(unsigned long extid,
> +				  unsigned long funcid,
> +				  struct sbi_trap_regs *regs,
> +				  struct sbi_ecall_return *out)
> +{
> +	(void)extid;
> +
> +	sbi_printf("[ECALL VIRQ] VIRQ ecall handler, funcid: %ld\n", funcid);

You'll want to get rid of these print statements when posting without the
RFC.

Thanks,
drew



More information about the opensbi mailing list