diff --git a/hypervisor/boot/guest/vboot_info.c b/hypervisor/boot/guest/vboot_info.c index 6059ef71f..249670903 100644 --- a/hypervisor/boot/guest/vboot_info.c +++ b/hypervisor/boot/guest/vboot_info.c @@ -28,15 +28,16 @@ /** * @pre vm != NULL && mbi != NULL */ -static void init_vm_ramdisk_info(struct acrn_vm *vm, struct multiboot_module *mod) +static void init_vm_ramdisk_info(struct acrn_vm *vm, const struct multiboot_module *mod) { void *mod_addr = hpa2hva((uint64_t)mod->mm_mod_start); - uint32_t mod_size = mod->mm_mod_end - mod->mm_mod_start; - vm->sw.ramdisk_info.src_addr = mod_addr; - vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr + vm->sw.kernel_info.kernel_size; - vm->sw.ramdisk_info.load_addr = (void *)round_page_up((uint64_t)vm->sw.ramdisk_info.load_addr); - vm->sw.ramdisk_info.size = mod_size; + if ((mod_addr != NULL) && (mod->mm_mod_end > mod->mm_mod_start)) { + vm->sw.ramdisk_info.src_addr = mod_addr; + vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr + vm->sw.kernel_info.kernel_size; + vm->sw.ramdisk_info.load_addr = (void *)round_page_up((uint64_t)vm->sw.ramdisk_info.load_addr); + vm->sw.ramdisk_info.size = mod->mm_mod_end - mod->mm_mod_start; + } } /* There are two sources for sos_vm kernel cmdline: @@ -88,6 +89,9 @@ static void merge_cmdline(const struct acrn_vm *vm, const char *cmdline, const c } } +/** + * @pre vm != NULL + */ static void *get_kernel_load_addr(struct acrn_vm *vm) { void *load_addr = NULL; @@ -125,9 +129,9 @@ static void *get_kernel_load_addr(struct acrn_vm *vm) } /** - * @pre vm != NULL && mbi != NULL + * @pre vm != NULL && mod != NULL */ -static int32_t init_vm_kernel_info(struct acrn_vm *vm, struct multiboot_module *mod) +static int32_t init_vm_kernel_info(struct acrn_vm *vm, const struct multiboot_module *mod) { struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id); @@ -136,8 +140,10 @@ static int32_t init_vm_kernel_info(struct acrn_vm *vm, struct multiboot_module * vm->sw.kernel_type = vm_config->os_config.kernel_type; vm->sw.kernel_info.kernel_src_addr = hpa2hva((uint64_t)mod->mm_mod_start); - vm->sw.kernel_info.kernel_size = mod->mm_mod_end - mod->mm_mod_start; - vm->sw.kernel_info.kernel_load_addr = get_kernel_load_addr(vm); + if ((vm->sw.kernel_info.kernel_src_addr != NULL) && (mod->mm_mod_end > mod->mm_mod_start)){ + vm->sw.kernel_info.kernel_size = mod->mm_mod_end - mod->mm_mod_start; + vm->sw.kernel_info.kernel_load_addr = get_kernel_load_addr(vm); + } return (vm->sw.kernel_info.kernel_load_addr == NULL) ? (-EINVAL) : 0; } @@ -145,7 +151,7 @@ static int32_t init_vm_kernel_info(struct acrn_vm *vm, struct multiboot_module * /** * @pre vm != NULL && mbi != NULL */ -static void init_vm_bootargs_info(struct acrn_vm *vm, struct multiboot_info *mbi) +static void init_vm_bootargs_info(struct acrn_vm *vm, const struct multiboot_info *mbi) { struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id); char *bootargs = vm_config->os_config.bootargs; @@ -171,27 +177,29 @@ static void init_vm_bootargs_info(struct acrn_vm *vm, struct multiboot_info *mbi } /* Kernel bootarg and zero page are right before the kernel image */ - if (vm->sw.bootargs_info.size > 0) { + if (vm->sw.bootargs_info.size > 0U) { vm->sw.bootargs_info.load_addr = vm->sw.kernel_info.kernel_load_addr - (MEM_1K * 8U); } else { vm->sw.bootargs_info.load_addr = NULL; } } -static uint32_t get_mod_idx_by_tag(struct multiboot_module *mods, uint32_t mods_count, const char *tag) +/* @pre mods != NULL + */ +static uint32_t get_mod_idx_by_tag(const struct multiboot_module *mods, uint32_t mods_count, const char *tag) { uint32_t i, ret = INVALID_MOD_IDX; uint32_t tag_len = strnlen_s(tag, MAX_MOD_TAG_LEN); - for (i = 0; i < mods_count; i++) { + for (i = 0U; i < mods_count; i++) { const char *mm_string = (char *)hpa2hva((uint64_t)mods[i].mm_string); uint32_t mm_str_len = strnlen_s(mm_string, MAX_MOD_TAG_LEN); /* when do file stitch by tool, the tag in mm_string might be followed with 0x0d or 0x0a */ if ((mm_str_len >= tag_len) && (strncmp(mm_string, tag, tag_len) == 0) - && ((mm_string[tag_len] == 0x0d) - || (mm_string[tag_len] == 0x0a) - || (mm_string[tag_len] == 0))){ + && ((*(mm_string + tag_len) == 0x0d) + || (*(mm_string + tag_len) == 0x0a) + || (*(mm_string + tag_len) == 0))){ ret = i; break; } @@ -201,7 +209,7 @@ static uint32_t get_mod_idx_by_tag(struct multiboot_module *mods, uint32_t mods_ /* @pre vm != NULL && mbi != NULL */ -static int32_t init_vm_sw_load(struct acrn_vm *vm, struct multiboot_info *mbi) +static int32_t init_vm_sw_load(struct acrn_vm *vm, const struct multiboot_info *mbi) { struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id); struct multiboot_module *mods = (struct multiboot_module *)hpa2hva((uint64_t)mbi->mi_mods_addr); @@ -210,9 +218,11 @@ static int32_t init_vm_sw_load(struct acrn_vm *vm, struct multiboot_info *mbi) dev_dbg(ACRN_DBG_BOOT, "mod counts=%d\n", mbi->mi_mods_count); - mod_idx = get_mod_idx_by_tag(mods, mbi->mi_mods_count, vm_config->os_config.kernel_mod_tag); - if (mod_idx != INVALID_MOD_IDX) { - ret = init_vm_kernel_info(vm, &mods[mod_idx]); + if (mods != NULL) { + mod_idx = get_mod_idx_by_tag(mods, mbi->mi_mods_count, vm_config->os_config.kernel_mod_tag); + if (mod_idx != INVALID_MOD_IDX) { + ret = init_vm_kernel_info(vm, &mods[mod_idx]); + } } if (ret == 0) { diff --git a/hypervisor/common/vm_load.c b/hypervisor/common/vm_load.c index 8c587f36c..696a7ce69 100644 --- a/hypervisor/common/vm_load.c +++ b/hypervisor/common/vm_load.c @@ -50,6 +50,9 @@ static uint32_t create_zeropage_e820(struct zero_page *zp, const struct acrn_vm return entry_num; } +/** + * @pre vm != NULL + */ static uint64_t create_zero_page(struct acrn_vm *vm) { struct zero_page *zeropage; @@ -98,6 +101,9 @@ static uint64_t create_zero_page(struct acrn_vm *vm) return gpa; } +/** + * @pre vm != NULL + */ static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu) { uint32_t i; @@ -150,6 +156,9 @@ static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu) __func__, vm->vm_id, vcpu_get_gpreg(vcpu, CPU_REG_RSI)); } +/** + * @pre vm != NULL + */ static void prepare_loading_rawimage(struct acrn_vm *vm) { struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info); @@ -158,6 +167,9 @@ static void prepare_loading_rawimage(struct acrn_vm *vm) sw_kernel->kernel_entry_addr = (void *)vm_config->os_config.kernel_entry_addr; } +/** + * @pre vm != NULL + */ int32_t direct_boot_sw_loader(struct acrn_vm *vm) { int32_t ret = 0;