Skip to content

Commit 0baf537

Browse files
jsun26intelwenlingz
authored andcommitted
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>
1 parent 1906def commit 0baf537

File tree

2 files changed

+43
-21
lines changed

2 files changed

+43
-21
lines changed

hypervisor/boot/guest/vboot_info.c

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,16 @@
2828
/**
2929
* @pre vm != NULL && mbi != NULL
3030
*/
31-
static void init_vm_ramdisk_info(struct acrn_vm *vm, struct multiboot_module *mod)
31+
static void init_vm_ramdisk_info(struct acrn_vm *vm, const struct multiboot_module *mod)
3232
{
3333
void *mod_addr = hpa2hva((uint64_t)mod->mm_mod_start);
34-
uint32_t mod_size = mod->mm_mod_end - mod->mm_mod_start;
3534

36-
vm->sw.ramdisk_info.src_addr = mod_addr;
37-
vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr + vm->sw.kernel_info.kernel_size;
38-
vm->sw.ramdisk_info.load_addr = (void *)round_page_up((uint64_t)vm->sw.ramdisk_info.load_addr);
39-
vm->sw.ramdisk_info.size = mod_size;
35+
if ((mod_addr != NULL) && (mod->mm_mod_end > mod->mm_mod_start)) {
36+
vm->sw.ramdisk_info.src_addr = mod_addr;
37+
vm->sw.ramdisk_info.load_addr = vm->sw.kernel_info.kernel_load_addr + vm->sw.kernel_info.kernel_size;
38+
vm->sw.ramdisk_info.load_addr = (void *)round_page_up((uint64_t)vm->sw.ramdisk_info.load_addr);
39+
vm->sw.ramdisk_info.size = mod->mm_mod_end - mod->mm_mod_start;
40+
}
4041
}
4142

4243
/* 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
8889
}
8990
}
9091

92+
/**
93+
* @pre vm != NULL
94+
*/
9195
static void *get_kernel_load_addr(struct acrn_vm *vm)
9296
{
9397
void *load_addr = NULL;
@@ -125,9 +129,9 @@ static void *get_kernel_load_addr(struct acrn_vm *vm)
125129
}
126130

127131
/**
128-
* @pre vm != NULL && mbi != NULL
132+
* @pre vm != NULL && mod != NULL
129133
*/
130-
static int32_t init_vm_kernel_info(struct acrn_vm *vm, struct multiboot_module *mod)
134+
static int32_t init_vm_kernel_info(struct acrn_vm *vm, const struct multiboot_module *mod)
131135
{
132136
struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id);
133137

@@ -136,16 +140,18 @@ static int32_t init_vm_kernel_info(struct acrn_vm *vm, struct multiboot_module *
136140

137141
vm->sw.kernel_type = vm_config->os_config.kernel_type;
138142
vm->sw.kernel_info.kernel_src_addr = hpa2hva((uint64_t)mod->mm_mod_start);
139-
vm->sw.kernel_info.kernel_size = mod->mm_mod_end - mod->mm_mod_start;
140-
vm->sw.kernel_info.kernel_load_addr = get_kernel_load_addr(vm);
143+
if ((vm->sw.kernel_info.kernel_src_addr != NULL) && (mod->mm_mod_end > mod->mm_mod_start)){
144+
vm->sw.kernel_info.kernel_size = mod->mm_mod_end - mod->mm_mod_start;
145+
vm->sw.kernel_info.kernel_load_addr = get_kernel_load_addr(vm);
146+
}
141147

142148
return (vm->sw.kernel_info.kernel_load_addr == NULL) ? (-EINVAL) : 0;
143149
}
144150

145151
/**
146152
* @pre vm != NULL && mbi != NULL
147153
*/
148-
static void init_vm_bootargs_info(struct acrn_vm *vm, struct multiboot_info *mbi)
154+
static void init_vm_bootargs_info(struct acrn_vm *vm, const struct multiboot_info *mbi)
149155
{
150156
struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id);
151157
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
171177
}
172178

173179
/* Kernel bootarg and zero page are right before the kernel image */
174-
if (vm->sw.bootargs_info.size > 0) {
180+
if (vm->sw.bootargs_info.size > 0U) {
175181
vm->sw.bootargs_info.load_addr = vm->sw.kernel_info.kernel_load_addr - (MEM_1K * 8U);
176182
} else {
177183
vm->sw.bootargs_info.load_addr = NULL;
178184
}
179185
}
180186

181-
static uint32_t get_mod_idx_by_tag(struct multiboot_module *mods, uint32_t mods_count, const char *tag)
187+
/* @pre mods != NULL
188+
*/
189+
static uint32_t get_mod_idx_by_tag(const struct multiboot_module *mods, uint32_t mods_count, const char *tag)
182190
{
183191
uint32_t i, ret = INVALID_MOD_IDX;
184192
uint32_t tag_len = strnlen_s(tag, MAX_MOD_TAG_LEN);
185193

186-
for (i = 0; i < mods_count; i++) {
194+
for (i = 0U; i < mods_count; i++) {
187195
const char *mm_string = (char *)hpa2hva((uint64_t)mods[i].mm_string);
188196
uint32_t mm_str_len = strnlen_s(mm_string, MAX_MOD_TAG_LEN);
189197

190198
/* when do file stitch by tool, the tag in mm_string might be followed with 0x0d or 0x0a */
191199
if ((mm_str_len >= tag_len) && (strncmp(mm_string, tag, tag_len) == 0)
192-
&& ((mm_string[tag_len] == 0x0d)
193-
|| (mm_string[tag_len] == 0x0a)
194-
|| (mm_string[tag_len] == 0))){
200+
&& ((*(mm_string + tag_len) == 0x0d)
201+
|| (*(mm_string + tag_len) == 0x0a)
202+
|| (*(mm_string + tag_len) == 0))){
195203
ret = i;
196204
break;
197205
}
@@ -201,7 +209,7 @@ static uint32_t get_mod_idx_by_tag(struct multiboot_module *mods, uint32_t mods_
201209

202210
/* @pre vm != NULL && mbi != NULL
203211
*/
204-
static int32_t init_vm_sw_load(struct acrn_vm *vm, struct multiboot_info *mbi)
212+
static int32_t init_vm_sw_load(struct acrn_vm *vm, const struct multiboot_info *mbi)
205213
{
206214
struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id);
207215
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)
210218

211219
dev_dbg(ACRN_DBG_BOOT, "mod counts=%d\n", mbi->mi_mods_count);
212220

213-
mod_idx = get_mod_idx_by_tag(mods, mbi->mi_mods_count, vm_config->os_config.kernel_mod_tag);
214-
if (mod_idx != INVALID_MOD_IDX) {
215-
ret = init_vm_kernel_info(vm, &mods[mod_idx]);
221+
if (mods != NULL) {
222+
mod_idx = get_mod_idx_by_tag(mods, mbi->mi_mods_count, vm_config->os_config.kernel_mod_tag);
223+
if (mod_idx != INVALID_MOD_IDX) {
224+
ret = init_vm_kernel_info(vm, &mods[mod_idx]);
225+
}
216226
}
217227

218228
if (ret == 0) {

hypervisor/common/vm_load.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ static uint32_t create_zeropage_e820(struct zero_page *zp, const struct acrn_vm
5050
return entry_num;
5151
}
5252

53+
/**
54+
* @pre vm != NULL
55+
*/
5356
static uint64_t create_zero_page(struct acrn_vm *vm)
5457
{
5558
struct zero_page *zeropage;
@@ -98,6 +101,9 @@ static uint64_t create_zero_page(struct acrn_vm *vm)
98101
return gpa;
99102
}
100103

104+
/**
105+
* @pre vm != NULL
106+
*/
101107
static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu)
102108
{
103109
uint32_t i;
@@ -150,6 +156,9 @@ static void prepare_loading_bzimage(struct acrn_vm *vm, struct acrn_vcpu *vcpu)
150156
__func__, vm->vm_id, vcpu_get_gpreg(vcpu, CPU_REG_RSI));
151157
}
152158

159+
/**
160+
* @pre vm != NULL
161+
*/
153162
static void prepare_loading_rawimage(struct acrn_vm *vm)
154163
{
155164
struct sw_kernel_info *sw_kernel = &(vm->sw.kernel_info);
@@ -158,6 +167,9 @@ static void prepare_loading_rawimage(struct acrn_vm *vm)
158167
sw_kernel->kernel_entry_addr = (void *)vm_config->os_config.kernel_entry_addr;
159168
}
160169

170+
/**
171+
* @pre vm != NULL
172+
*/
161173
int32_t direct_boot_sw_loader(struct acrn_vm *vm)
162174
{
163175
int32_t ret = 0;

0 commit comments

Comments
 (0)