HV: misra fix for patch set of Zephyr enabling

- add @pre condition remark;
- fix of NULL pointer check;

Tracked-On: #3214

Signed-off-by: Victor Sun <victor.sun@intel.com>
This commit is contained in:
Victor Sun 2019-06-04 22:41:52 +08:00 committed by wenlingz
parent 1906def29e
commit 0baf537a2c
2 changed files with 43 additions and 21 deletions

View File

@ -28,15 +28,16 @@
/** /**
* @pre vm != NULL && mbi != NULL * @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); 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; if ((mod_addr != NULL) && (mod->mm_mod_end > mod->mm_mod_start)) {
vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr + vm->sw.kernel_info.kernel_size; vm->sw.ramdisk_info.src_addr = mod_addr;
vm->sw.ramdisk_info.load_addr = (void *)round_page_up((uint64_t)vm->sw.ramdisk_info.load_addr); vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr + vm->sw.kernel_info.kernel_size;
vm->sw.ramdisk_info.size = mod_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: /* 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) static void *get_kernel_load_addr(struct acrn_vm *vm)
{ {
void *load_addr = NULL; 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); 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_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_src_addr = hpa2hva((uint64_t)mod->mm_mod_start);
vm->sw.kernel_info.kernel_size = mod->mm_mod_end - mod->mm_mod_start; if ((vm->sw.kernel_info.kernel_src_addr != NULL) && (mod->mm_mod_end > mod->mm_mod_start)){
vm->sw.kernel_info.kernel_load_addr = get_kernel_load_addr(vm); 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; 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 * @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); struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id);
char *bootargs = vm_config->os_config.bootargs; 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 */ /* 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); vm->sw.bootargs_info.load_addr = vm->sw.kernel_info.kernel_load_addr - (MEM_1K * 8U);
} else { } else {
vm->sw.bootargs_info.load_addr = NULL; 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 i, ret = INVALID_MOD_IDX;
uint32_t tag_len = strnlen_s(tag, MAX_MOD_TAG_LEN); 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); 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); 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 */ /* 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) if ((mm_str_len >= tag_len) && (strncmp(mm_string, tag, tag_len) == 0)
&& ((mm_string[tag_len] == 0x0d) && ((*(mm_string + tag_len) == 0x0d)
|| (mm_string[tag_len] == 0x0a) || (*(mm_string + tag_len) == 0x0a)
|| (mm_string[tag_len] == 0))){ || (*(mm_string + tag_len) == 0))){
ret = i; ret = i;
break; 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 /* @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 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); 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); 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 (mods != NULL) {
if (mod_idx != INVALID_MOD_IDX) { mod_idx = get_mod_idx_by_tag(mods, mbi->mi_mods_count, vm_config->os_config.kernel_mod_tag);
ret = init_vm_kernel_info(vm, &mods[mod_idx]); if (mod_idx != INVALID_MOD_IDX) {
ret = init_vm_kernel_info(vm, &mods[mod_idx]);
}
} }
if (ret == 0) { if (ret == 0) {

View File

@ -50,6 +50,9 @@ static uint32_t create_zeropage_e820(struct zero_page *zp, const struct acrn_vm
return entry_num; return entry_num;
} }
/**
* @pre vm != NULL
*/
static uint64_t create_zero_page(struct acrn_vm *vm) static uint64_t create_zero_page(struct acrn_vm *vm)
{ {
struct zero_page *zeropage; struct zero_page *zeropage;
@ -98,6 +101,9 @@ static uint64_t create_zero_page(struct acrn_vm *vm)
return gpa; return gpa;
} }
/**
* @pre vm != NULL
*/
static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu) static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu)
{ {
uint32_t i; 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)); __func__, vm->vm_id, vcpu_get_gpreg(vcpu, CPU_REG_RSI));
} }
/**
* @pre vm != NULL
*/
static void prepare_loading_rawimage(struct acrn_vm *vm) static void prepare_loading_rawimage(struct acrn_vm *vm)
{ {
struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info); 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; 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 direct_boot_sw_loader(struct acrn_vm *vm)
{ {
int32_t ret = 0; int32_t ret = 0;