diff --git a/hypervisor/arch/riscv/guest/vsbi.c b/hypervisor/arch/riscv/guest/vsbi.c index 5e12e99a9..23b211de4 100644 --- a/hypervisor/arch/riscv/guest/vsbi.c +++ b/hypervisor/arch/riscv/guest/vsbi.c @@ -109,4 +109,15 @@ void init_vsbi(struct acrn_vm *vm) } } } + if (is_service_vm(vm)) { + /* pass machine IDs from SBI to SOS */ + vm->arch_vm.mvendorid = sbi_get_mvendorid(); + vm->arch_vm.marchid = sbi_get_marchid(); + vm->arch_vm.mimpid = sbi_get_mimpid(); + } else { + /* set dummy machine IDs for guest VMs */ + vm->arch_vm.mvendorid = VSBI_ACRN_MVENDORID; + vm->arch_vm.marchid = VSBI_ACRN_MARCHID; + vm->arch_vm.mimpid = VSBI_ACRN_MIMPID; + } } diff --git a/hypervisor/arch/riscv/guest/vsbi/vsbi_base.c b/hypervisor/arch/riscv/guest/vsbi/vsbi_base.c index 10d41c8f6..92d2de339 100644 --- a/hypervisor/arch/riscv/guest/vsbi/vsbi_base.c +++ b/hypervisor/arch/riscv/guest/vsbi/vsbi_base.c @@ -15,20 +15,26 @@ static int32_t vcpu_sbi_base_ecall_handler(struct acrn_vcpu *vcpu, __unused uint uint64_t func_id, uint64_t *args, struct vsbi_ret *out) { int ret = SBI_SUCCESS; - sbiret r; const struct acrn_vsbi_extension *e; switch (func_id) { case SBI_BASE_FID_GET_SPEC_VERSION: - case SBI_BASE_FID_GET_IMP_VERSION: + out->value = VSBI_SPEC_VERSION_MAJOR << 24 | VSBI_SPEC_VERSION_MINOR; + break; case SBI_BASE_FID_GET_IMP_ID: + out->value = VSBI_ACRN_IMPID; + break; + case SBI_BASE_FID_GET_IMP_VERSION: + out->value = VSBI_ACRN_VERSION_MAJOR << 24 | VSBI_ACRN_VERSION_MINOR; + break; case SBI_BASE_FID_GET_MVENDORID: + out->value = vcpu->vm->arch_vm.mvendorid;; + break; case SBI_BASE_FID_GET_MARCHID: + out->value = vcpu->vm->arch_vm.marchid; + break; case SBI_BASE_FID_GET_MIMPID: - /* TODO: Dummy. For now just passthrough everything */ - r = sbi_ecall(0, 0, 0, 0, 0, 0, func_id, SBI_EID_BASE); - ret = r.error; - out->value = r.value; + out->value = vcpu->vm->arch_vm.mimpid; break; case SBI_BASE_FID_PROBE_EXT: e = vcpu_find_extension(vcpu, args[0]); @@ -36,6 +42,7 @@ static int32_t vcpu_sbi_base_ecall_handler(struct acrn_vcpu *vcpu, __unused uint break; default: ret = SBI_ERR_NOT_SUPPORTED; + break; } return ret; diff --git a/hypervisor/include/arch/riscv/asm/guest/vm.h b/hypervisor/include/arch/riscv/asm/guest/vm.h index 3de19a6b8..15fccc51d 100644 --- a/hypervisor/include/arch/riscv/asm/guest/vm.h +++ b/hypervisor/include/arch/riscv/asm/guest/vm.h @@ -21,6 +21,9 @@ struct vm_arch { const struct acrn_vsbi_extension *vsbi_exts[MAX_NUM_SUPPORTED_VSBI_EXT]; uint16_t n_vsbi_exts; + uint64_t mvendorid; + uint64_t marchid; + uint64_t mimpid; }; struct acrn_vcpu; diff --git a/hypervisor/include/arch/riscv/asm/guest/vsbi.h b/hypervisor/include/arch/riscv/asm/guest/vsbi.h index 69a88829c..be84f2361 100644 --- a/hypervisor/include/arch/riscv/asm/guest/vsbi.h +++ b/hypervisor/include/arch/riscv/asm/guest/vsbi.h @@ -8,6 +8,18 @@ #define RISCV_VSBI_H #include +#include + +#define VSBI_SPEC_VERSION_MAJOR 0x2U +#define VSBI_SPEC_VERSION_MINOR 0x0U +#define VSBI_SPEC_VERSION (VSBI_SPEC_VERSION_MAJOR << 24 | VSBI_SPEC_VERSION_MINOR) +#define VSBI_ACRN_VERSION_MAJOR HV_API_MAJOR_VERSION +#define VSBI_ACRN_VERSION_MINOR HV_API_MINOR_VERSION +#define VSBI_ACRN_VERSION (VSBI_ACRN_VERSION_MAJOR << 24 | VSBI_ACRN_VERSION_MINOR) +#define VSBI_ACRN_IMPID 55U /* FIXME: once official ID confirmed */ +#define VSBI_ACRN_MVENDORID 0U /* dummy MVENDORID for guest VM */ +#define VSBI_ACRN_MARCHID 0U /* dummy MARCHID for guest VM */ +#define VSBI_ACRN_MIMPID 0U /* dummy MIMPID for guest VM */ #define MAX_NUM_SUPPORTED_VSBI_EXT 8