diff --git a/xen/arch/riscv/include/asm/sbi.h b/xen/arch/riscv/include/asm/sbi.h index ade24a572d..751bae6d66 100644 --- a/xen/arch/riscv/include/asm/sbi.h +++ b/xen/arch/riscv/include/asm/sbi.h @@ -14,8 +14,15 @@ #include -#define SBI_EXT_0_1_CONSOLE_PUTCHAR 0x1 -#define SBI_EXT_0_1_SHUTDOWN 0x8 +#define SBI_EXT_0_1_SET_TIMER 0x0 +#define SBI_EXT_0_1_CONSOLE_PUTCHAR 0x1 +#define SBI_EXT_0_1_CONSOLE_GETCHAR 0x2 +#define SBI_EXT_0_1_CLEAR_IPI 0x3 +#define SBI_EXT_0_1_SEND_IPI 0x4 +#define SBI_EXT_0_1_REMOTE_FENCE_I 0x5 +#define SBI_EXT_0_1_REMOTE_SFENCE_VMA 0x6 +#define SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID 0x7 +#define SBI_EXT_0_1_SHUTDOWN 0x8 #define SBI_EXT_BASE 0x10 #define SBI_EXT_RFENCE 0x52464E43 diff --git a/xen/arch/riscv/vsbi/Makefile b/xen/arch/riscv/vsbi/Makefile index 820eb10ac2..bc5755cb13 100644 --- a/xen/arch/riscv/vsbi/Makefile +++ b/xen/arch/riscv/vsbi/Makefile @@ -1 +1,2 @@ obj-y += core.o +obj-y += legacy-extension.o diff --git a/xen/arch/riscv/vsbi/legacy-extension.c b/xen/arch/riscv/vsbi/legacy-extension.c new file mode 100644 index 0000000000..2e8df191c2 --- /dev/null +++ b/xen/arch/riscv/vsbi/legacy-extension.c @@ -0,0 +1,64 @@ + +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include + +#include +#include + +static void vsbi_print_char(char c) +{ + struct domain *currd = current->domain; + struct domain_console *cons = currd->console; + + if ( !is_console_printable(c) ) + return; + + spin_lock(&cons->lock); + ASSERT(cons->idx < ARRAY_SIZE(cons->buf)); + if ( c != '\n' ) + cons->buf[cons->idx++] = c; + if ( (cons->idx == (ARRAY_SIZE(cons->buf) - 1)) || (c == '\n') ) + { + cons->buf[cons->idx] = '\0'; + guest_printk(currd, XENLOG_G_DEBUG "%s\n", cons->buf); + cons->idx = 0; + } + spin_unlock(&cons->lock); +} + +static int vsbi_legacy_ecall_handler(unsigned long eid, unsigned long fid, + struct cpu_user_regs *regs) +{ + int ret = 0; + + switch ( eid ) + { + case SBI_EXT_0_1_CONSOLE_PUTCHAR: + vsbi_print_char(regs->a0); + break; + + case SBI_EXT_0_1_CONSOLE_GETCHAR: + ret = SBI_ERR_NOT_SUPPORTED; + 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 legacy ecall: EID: #%#lx\n", + __func__, eid); + break; + } + + return ret; +} + +VSBI_EXT(legacy, SBI_EXT_0_1_SET_TIMER, SBI_EXT_0_1_SHUTDOWN, + vsbi_legacy_ecall_handler);