diff --git a/hypervisor/boot/guest/vboot_info.c b/hypervisor/boot/guest/vboot_info.c index bf6a7437e..6059ef71f 100644 --- a/hypervisor/boot/guest/vboot_info.c +++ b/hypervisor/boot/guest/vboot_info.c @@ -93,6 +93,7 @@ static void *get_kernel_load_addr(struct acrn_vm *vm) void *load_addr = NULL; struct vm_sw_info *sw_info = &vm->sw; struct zero_page *zeropage; + struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id); switch (sw_info->kernel_type) { case KERNEL_BZIMAGE: @@ -110,6 +111,9 @@ static void *get_kernel_load_addr(struct acrn_vm *vm) } load_addr = (void *)zeropage; break; + case KERNEL_ZEPHYR: + load_addr = (void *)vm_config->os_config.kernel_load_addr; + break; default: pr_err("Unsupported Kernel type."); break; diff --git a/hypervisor/common/vm_load.c b/hypervisor/common/vm_load.c index 15d4d641e..8c587f36c 100644 --- a/hypervisor/common/vm_load.c +++ b/hypervisor/common/vm_load.c @@ -150,6 +150,14 @@ static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu) __func__, vm->vm_id, vcpu_get_gpreg(vcpu, CPU_REG_RSI)); } +static void prepare_loading_rawimage(struct acrn_vm *vm) +{ + struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info); + const struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id); + + sw_kernel->kernel_entry_addr = (void *)vm_config->os_config.kernel_entry_addr; +} + int32_t direct_boot_sw_loader(struct acrn_vm *vm) { int32_t ret = 0; @@ -185,6 +193,9 @@ int32_t direct_boot_sw_loader(struct acrn_vm *vm) case KERNEL_BZIMAGE: prepare_loading_bzimage(vm, vcpu); break; + case KERNEL_ZEPHYR: + prepare_loading_rawimage(vm); + break; default: pr_err("%s, Loading VM SW failed", __func__); ret = -EINVAL; diff --git a/hypervisor/include/arch/x86/vm_config.h b/hypervisor/include/arch/x86/vm_config.h index f450ea78a..bf79a911d 100644 --- a/hypervisor/include/arch/x86/vm_config.h +++ b/hypervisor/include/arch/x86/vm_config.h @@ -64,6 +64,7 @@ struct vuart_config { enum os_kernel_type { KERNEL_BZIMAGE = 1, + KERNEL_ZEPHYR, }; struct acrn_vm_os_config { @@ -72,6 +73,9 @@ struct acrn_vm_os_config { char kernel_mod_tag[MAX_MOD_TAG_LEN]; /* multiboot module tag for kernel */ char ramdisk_mod_tag[MAX_MOD_TAG_LEN]; /* multiboot module tag for ramdisk */ char bootargs[MAX_BOOTARGS_SIZE]; /* boot args/cmdline */ + uint64_t kernel_load_addr; + uint64_t kernel_entry_addr; + uint64_t kernel_ramdisk_addr; } __aligned(8); struct acrn_vm_pci_ptdev_config {