diff --git a/hypervisor/arch/riscv/Makefile b/hypervisor/arch/riscv/Makefile index 451ecda32..1c49b8986 100644 --- a/hypervisor/arch/riscv/Makefile +++ b/hypervisor/arch/riscv/Makefile @@ -74,6 +74,7 @@ VP_C_SRCS += arch/riscv/guest/vsbi.c VP_C_SRCS += arch/riscv/guest/vsbi/vsbi_base.c VP_C_SRCS += arch/riscv/guest/vsbi/vsbi_hsm.c VP_C_SRCS += arch/riscv/guest/vsbi/vsbi_srst.c +VP_C_SRCS += arch/riscv/guest/vsbi/vsbi_acrn.c VM_CFG_C_SRCS += $(SCENARIO_CFG_DIR)/vm_configurations.c VM_CFG_C_SRCS += $(BOARD_CFG_DIR)/pci_dev.c diff --git a/hypervisor/arch/riscv/guest/vsbi.c b/hypervisor/arch/riscv/guest/vsbi.c index d1e8ec6b5..b2dea252e 100644 --- a/hypervisor/arch/riscv/guest/vsbi.c +++ b/hypervisor/arch/riscv/guest/vsbi.c @@ -74,10 +74,12 @@ int32_t vsbi_exit_handler(struct acrn_vcpu *vcpu) extern const struct acrn_vsbi_extension vsbi_ext_base; extern const struct acrn_vsbi_extension vsbi_ext_hsm; extern const struct acrn_vsbi_extension vsbi_ext_srst; +extern const struct acrn_vsbi_extension vsbi_ext_acrn; static const struct acrn_vsbi_extension *vsbi_extensions[MAX_NUM_SUPPORTED_VSBI_EXT] = { &vsbi_ext_base, &vsbi_ext_hsm, &vsbi_ext_srst, + &vsbi_ext_acrn, }; void init_vsbi(struct acrn_vm *vm) diff --git a/hypervisor/arch/riscv/guest/vsbi/vsbi_acrn.c b/hypervisor/arch/riscv/guest/vsbi/vsbi_acrn.c new file mode 100644 index 000000000..f442578d8 --- /dev/null +++ b/hypervisor/arch/riscv/guest/vsbi/vsbi_acrn.c @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2018-2025 Intel Corporation. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include + +#include +#include + +static int32_t vcpu_sbi_acrn_ecall_handler(struct acrn_vcpu *vcpu, __unused uint64_t ext_id, + uint64_t func_id, uint64_t *args, struct vsbi_ret *out) +{ + (void)vcpu; + (void)func_id; + (void)args; + (void)out; + + /* TODO: Hypercall implementation goes here */ + + return 0; +} + +static int32_t vsbi_acrn_probe(struct acrn_vm *vm) +{ + return is_service_vm(vm) ? 0 : -ENOSYS; +} + +const struct acrn_vsbi_extension vsbi_ext_acrn = { + .name = "acrn", + .eid_start = SBI_EID_ACRN, + .eid_end = SBI_EID_ACRN, + .handler = vcpu_sbi_acrn_ecall_handler, + .probe = vsbi_acrn_probe, +}; diff --git a/hypervisor/include/arch/riscv/asm/guest/vsbi.h b/hypervisor/include/arch/riscv/asm/guest/vsbi.h index 6cec8467f..69a88829c 100644 --- a/hypervisor/include/arch/riscv/asm/guest/vsbi.h +++ b/hypervisor/include/arch/riscv/asm/guest/vsbi.h @@ -13,6 +13,13 @@ #define MAX_VSBI_EXTENSION_NAME 16 +/* TODO: This ID is distributed by SBI. + * For now just hardcode a random value that isn't used. + * Change to official ID when ACRN gets an ID. + */ +#define SBI_ACRN_IMPL_ID 0x900 +#define SBI_EID_ACRN (SBI_EID_FIRMWARE_START + SBI_ACRN_IMPL_ID) + struct vsbi_ret { uint64_t value; bool vcpu_retain_pc; diff --git a/hypervisor/include/arch/riscv/asm/sbi.h b/hypervisor/include/arch/riscv/asm/sbi.h index 573d25a5f..3bb9f0793 100644 --- a/hypervisor/include/arch/riscv/asm/sbi.h +++ b/hypervisor/include/arch/riscv/asm/sbi.h @@ -29,6 +29,9 @@ enum sbi_eid { /* Vendor extensions must lie within this range */ SBI_EID_VENDOR_START = 0x09000000, SBI_EID_VENDOR_END = 0x09FFFFFF, + + SBI_EID_FIRMWARE_START = 0x0A000000, + SBI_EID_FIRMWARE_END = 0x0AFFFFFF, }; #define SBI_BASE_FID_GET_SPEC_VERSION 0x0