xen/riscv: add RISC-V virtual SBI base extension support for guests

Add support of virtual SBI base extension calls for RISC-V guests, delegating
hardware-specific queries to the underlying SBI and handling version and
firmware ID queries directly.

The changes include:
1. Define new SBI base extension function IDs (SBI_EXT_BASE_GET_MVENDORID,
   SBI_EXT_BASE_GET_MARCHID, SBI_EXT_BASE_GET_MIMPID).
2. Introduce XEN_SBI_VER_MAJOR, XEN_SBI_VER_MINOR for imeplenataion of
   SBI_EXT_BASE_GET_SPEC_VERSION.
4. Introduce SBI_XEN_IMPID to implement SBI_EXT_BASE_GET_IMP_ID.
5. Implement handling of SBI base extension functions, including version,
   firmware ID, and machine-specific queries.

Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Oleksii Kurochko authored and Jan Beulich committed 2026-01-06 10:55:56 +01:00
1 parent 42a43638a4
commit aaa1607b16
3 files changed
+89

No files matched your search

+6
View File
@@ -14,6 +14,9 @@
#include <xen/cpumask.h>
/* SBI-defined implementation ID */
#define SBI_XEN_IMPID 7
#define SBI_EXT_0_1_SET_TIMER 0x0
#define SBI_EXT_0_1_CONSOLE_PUTCHAR 0x1
#define SBI_EXT_0_1_CONSOLE_GETCHAR 0x2
@@ -32,6 +35,9 @@
#define SBI_EXT_BASE_GET_IMP_ID 0x1
#define SBI_EXT_BASE_GET_IMP_VERSION 0x2
#define SBI_EXT_BASE_PROBE_EXT 0x3
#define SBI_EXT_BASE_GET_MVENDORID 0x4
#define SBI_EXT_BASE_GET_MARCHID 0x5
#define SBI_EXT_BASE_GET_MIMPID 0x6
/* SBI function IDs for RFENCE extension */
#define SBI_EXT_RFENCE_REMOTE_FENCE_I 0x0
+1
View File
@@ -1,2 +1,3 @@
obj-y += base-extension.o
obj-y += core.o
obj-y += legacy-extension.o
+82
View File
@@ -0,0 +1,82 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <xen/lib.h>
#include <xen/sched.h>
#include <xen/version.h>
#include <asm/processor.h>
#include <asm/sbi.h>
#include <asm/vsbi.h>
/* Xen-controlled SBI version reported to guests */
#define XEN_SBI_VER_MAJOR 0
#define XEN_SBI_VER_MINOR 2
static int vsbi_base_ecall_handler(unsigned long eid, unsigned long fid,
struct cpu_user_regs *regs)
{
int ret = 0;
struct sbiret sbi_ret;
ASSERT(eid == SBI_EXT_BASE);
switch ( fid )
{
case SBI_EXT_BASE_GET_SPEC_VERSION:
regs->a1 = MASK_INSR(XEN_SBI_VER_MAJOR, SBI_SPEC_VERSION_MAJOR_MASK) |
XEN_SBI_VER_MINOR;
break;
case SBI_EXT_BASE_GET_IMP_ID:
regs->a1 = SBI_XEN_IMPID;
break;
case SBI_EXT_BASE_GET_IMP_VERSION:
regs->a1 = (xen_major_version() << 16) | xen_minor_version();
break;
case SBI_EXT_BASE_GET_MVENDORID:
case SBI_EXT_BASE_GET_MARCHID:
case SBI_EXT_BASE_GET_MIMPID:
if ( is_hardware_domain(current->domain) )
{
sbi_ret = sbi_ecall(SBI_EXT_BASE, fid, 0, 0, 0, 0, 0, 0);
ret = sbi_ret.error;
regs->a1 = sbi_ret.value;
}
else
/*
* vSBI should present a consistent, virtualized view to guests.
* In particular, DomU-visible data must remain stable across
* migration and must not expose hardware-specific details.
*
* These register(s) must be readable in any implementation,
* but a value of 0 can be returned to indicate the field
* is not implemented.
*/
regs->a1 = 0;
break;
case SBI_EXT_BASE_PROBE_EXT:
regs->a1 = vsbi_find_extension(regs->a0) ? 1 : 0;
break;
default:
/*
* TODO: domain_crash() is acceptable here while things are still under
* development.
* It shouldn't stay like this in the end though: guests should not
* be punished like this for something Xen hasn't implemented.
*/
domain_crash(current->domain,
"%s: Unsupported ecall: EID: #%#lx FID: #%lu\n",
__func__, eid, fid);
break;
}
return ret;
}
VSBI_EXT(base, SBI_EXT_BASE, SBI_EXT_BASE, vsbi_base_ecall_handler)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.