28
28
/**
29
29
* @pre vm != NULL && mbi != NULL
30
30
*/
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 )
32
32
{
33
33
void * mod_addr = hpa2hva ((uint64_t )mod -> mm_mod_start );
34
- uint32_t mod_size = mod -> mm_mod_end - mod -> mm_mod_start ;
35
34
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
+ }
40
41
}
41
42
42
43
/* 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
88
89
}
89
90
}
90
91
92
+ /**
93
+ * @pre vm != NULL
94
+ */
91
95
static void * get_kernel_load_addr (struct acrn_vm * vm )
92
96
{
93
97
void * load_addr = NULL ;
@@ -125,9 +129,9 @@ static void *get_kernel_load_addr(struct acrn_vm *vm)
125
129
}
126
130
127
131
/**
128
- * @pre vm != NULL && mbi != NULL
132
+ * @pre vm != NULL && mod != NULL
129
133
*/
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 )
131
135
{
132
136
struct acrn_vm_config * vm_config = get_vm_config (vm -> vm_id );
133
137
@@ -136,16 +140,18 @@ static int32_t init_vm_kernel_info(struct acrn_vm *vm, struct multiboot_module *
136
140
137
141
vm -> sw .kernel_type = vm_config -> os_config .kernel_type ;
138
142
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
+ }
141
147
142
148
return (vm -> sw .kernel_info .kernel_load_addr == NULL ) ? (- EINVAL ) : 0 ;
143
149
}
144
150
145
151
/**
146
152
* @pre vm != NULL && mbi != NULL
147
153
*/
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 )
149
155
{
150
156
struct acrn_vm_config * vm_config = get_vm_config (vm -> vm_id );
151
157
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
171
177
}
172
178
173
179
/* 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 ) {
175
181
vm -> sw .bootargs_info .load_addr = vm -> sw .kernel_info .kernel_load_addr - (MEM_1K * 8U );
176
182
} else {
177
183
vm -> sw .bootargs_info .load_addr = NULL ;
178
184
}
179
185
}
180
186
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 )
182
190
{
183
191
uint32_t i , ret = INVALID_MOD_IDX ;
184
192
uint32_t tag_len = strnlen_s (tag , MAX_MOD_TAG_LEN );
185
193
186
- for (i = 0 ; i < mods_count ; i ++ ) {
194
+ for (i = 0U ; i < mods_count ; i ++ ) {
187
195
const char * mm_string = (char * )hpa2hva ((uint64_t )mods [i ].mm_string );
188
196
uint32_t mm_str_len = strnlen_s (mm_string , MAX_MOD_TAG_LEN );
189
197
190
198
/* when do file stitch by tool, the tag in mm_string might be followed with 0x0d or 0x0a */
191
199
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 ))){
195
203
ret = i ;
196
204
break ;
197
205
}
@@ -201,7 +209,7 @@ static uint32_t get_mod_idx_by_tag(struct multiboot_module *mods, uint32_t mods_
201
209
202
210
/* @pre vm != NULL && mbi != NULL
203
211
*/
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 )
205
213
{
206
214
struct acrn_vm_config * vm_config = get_vm_config (vm -> vm_id );
207
215
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)
210
218
211
219
dev_dbg (ACRN_DBG_BOOT , "mod counts=%d\n" , mbi -> mi_mods_count );
212
220
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
+ }
216
226
}
217
227
218
228
if (ret == 0 ) {
0 commit comments