mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
42a43638a4
commit
aaa1607b16
3 files changed
+89
No files matched your search
@@ -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,2 +1,3 @@
|
||||
obj-y += base-extension.o
|
||||
obj-y += core.o
|
||||
obj-y += legacy-extension.o
|
||||
@@ -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)
|
||||