Skip to content

Commit 370998b

Browse files
ZideChen0wenlingz
authored andcommitted
hv: replace MEM_2K with a new macro MAX_BOOTARGS_SIZE for bootargs size
- for all cases of referring guest bootargs size, replace MEM_2K with CONFIG_MAX_BOOTARGS_SIZE for better readability. - remove duplicated MAX_BOOTARGS_SIZE definition from vm_config.h. Also fix one minor issue in general_sw_loader() which uses copy_to_gpa() to copy a string. Since copy_to_gpa() makes use of memncpy_s() to do the job, the size parameter should include the string null ternimator. Tracked-On: #2806 Signed-off-by: Zide Chen <zide.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 12d9772 commit 370998b

File tree

5 files changed

+22
-15
lines changed

5 files changed

+22
-15
lines changed

hypervisor/arch/x86/seed/seed.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ static uint32_t parse_seed_arg(void)
5959
if (cmd_src != NULL) {
6060
for (i = 0U; seed_arg[i].str != NULL; i++) {
6161
len = strnlen_s(seed_arg[i].str, MEM_1K);
62-
arg = strstr_s((const char *)cmd_src, MEM_2K, seed_arg[i].str, len);
62+
arg = strstr_s((const char *)cmd_src, MAX_BOOTARGS_SIZE, seed_arg[i].str, len);
6363
if (arg != NULL) {
6464
arg += len;
6565
seed_arg[i].addr = strtoul_hex(arg);
@@ -71,7 +71,8 @@ static uint32_t parse_seed_arg(void)
7171
*/
7272
arg_end = strchr(arg, ' ');
7373
arg -= len;
74-
len = (arg_end != NULL) ? (uint32_t)(arg_end - arg) : strnlen_s(arg, MEM_2K);
74+
len = (arg_end != NULL) ? (uint32_t)(arg_end - arg) :
75+
strnlen_s(arg, MAX_BOOTARGS_SIZE);
7576
(void)memset((void *)arg, (char)' ', len);
7677
break;
7778
}
@@ -120,7 +121,7 @@ void append_seed_arg(char *cmd_dst, bool vm_is_sos)
120121
boot_params->p_platform_info = sos_vm_hpa2gpa(boot_params->p_platform_info);
121122
}
122123

123-
(void)strncpy_s(cmd_dst, MEM_2K, buf, strnlen_s(buf, MEM_1K));
124+
(void)strncpy_s(cmd_dst, MAX_BOOTARGS_SIZE, buf, strnlen_s(buf, MEM_1K));
124125

125126
break;
126127
}

hypervisor/boot/sbl/multiboot.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* - cmdline from acrn stitching tool. mod[0].mm_string
1919
* We need to merge them together
2020
*/
21-
static char kernel_cmdline[MEM_2K + 1U];
21+
static char kernel_cmdline[MAX_BOOTARGS_SIZE + 1U];
2222

2323
/* now modules support: FIRMWARE & RAMDISK & SeedList */
2424
static void parse_other_modules(struct acrn_vm *vm, const struct multiboot_module *mods, uint32_t mods_count)
@@ -60,14 +60,14 @@ static void parse_other_modules(struct acrn_vm *vm, const struct multiboot_modul
6060
/*copy boot args to load addr, set src=load addr*/
6161
if (copy_once != 0) {
6262
copy_once = 0;
63-
(void)strncpy_s(load_addr, MEM_2K + 1U,
63+
(void)strncpy_s(load_addr, MAX_BOOTARGS_SIZE + 1U,
6464
(const char *)vm->sw.linux_info.bootargs_src_addr,
6565
vm->sw.linux_info.bootargs_size);
6666
vm->sw.linux_info.bootargs_src_addr = load_addr;
6767
}
6868

6969
(void)strncpy_s(load_addr + args_size, 100U, dyn_bootargs, 100U);
70-
vm->sw.linux_info.bootargs_size = strnlen_s(load_addr, MEM_2K);
70+
vm->sw.linux_info.bootargs_size = strnlen_s(load_addr, MAX_BOOTARGS_SIZE);
7171

7272
} else if (strncmp("RAMDISK", start, type_len) == 0) {
7373
vm->sw.linux_info.ramdisk_src_addr = mod_addr;
@@ -97,12 +97,12 @@ static void merge_cmdline(const struct acrn_vm *vm, const char *cmdline, const c
9797
* seed_arg string ends with a white space and '\0', so no aditional delimiter is needed
9898
*/
9999
append_seed_arg(cmd_dst, is_sos_vm(vm));
100-
dst_len = strnlen_s(cmd_dst, MEM_2K);
101-
dst_avail = MEM_2K + 1U - dst_len;
100+
dst_len = strnlen_s(cmd_dst, MAX_BOOTARGS_SIZE);
101+
dst_avail = MAX_BOOTARGS_SIZE + 1U - dst_len;
102102
cmd_dst += dst_len;
103103

104-
cmdline_len = strnlen_s(cmdline, MEM_2K);
105-
cmdstr_len = strnlen_s(cmdstr, MEM_2K);
104+
cmdline_len = strnlen_s(cmdline, MAX_BOOTARGS_SIZE);
105+
cmdstr_len = strnlen_s(cmdstr, MAX_BOOTARGS_SIZE);
106106

107107
/* reserve one character for the delimiter between 2 strings (one white space) */
108108
if ((cmdline_len + cmdstr_len + 1U) >= dst_avail) {
@@ -192,7 +192,7 @@ int32_t sbl_init_vm_boot_info(struct acrn_vm *vm)
192192
vm->sw.kernel_info.kernel_load_addr = (void *)(MEM_1M * 16U);
193193
vm->sw.linux_info.bootargs_src_addr = (void *)vm_config->os_config.bootargs;
194194
vm->sw.linux_info.bootargs_size =
195-
strnlen_s(vm_config->os_config.bootargs, MEM_2K);
195+
strnlen_s(vm_config->os_config.bootargs, MAX_BOOTARGS_SIZE);
196196
} else {
197197
vm->sw.kernel_info.kernel_load_addr =
198198
get_kernel_load_addr(vm->sw.kernel_info.kernel_src_addr);
@@ -206,12 +206,14 @@ int32_t sbl_init_vm_boot_info(struct acrn_vm *vm)
206206
hpa2hva((uint64_t)mods[0].mm_string));
207207

208208
vm->sw.linux_info.bootargs_src_addr = kernel_cmdline;
209-
vm->sw.linux_info.bootargs_size = strnlen_s(kernel_cmdline, MEM_2K);
209+
vm->sw.linux_info.bootargs_size =
210+
strnlen_s(kernel_cmdline, MAX_BOOTARGS_SIZE);
210211
} else {
211212
vm->sw.linux_info.bootargs_src_addr =
212213
hpa2hva((uint64_t)mods[0].mm_string);
213214
vm->sw.linux_info.bootargs_size =
214-
strnlen_s(hpa2hva((uint64_t)mods[0].mm_string), MEM_2K);
215+
strnlen_s(hpa2hva((uint64_t)mods[0].mm_string),
216+
MAX_BOOTARGS_SIZE);
215217
}
216218
}
217219

hypervisor/common/vm_load.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <boot_context.h>
1111
#include <ept.h>
1212
#include <mmu.h>
13+
#include <multiboot.h>
1314
#include <errno.h>
1415
#include <sprintf.h>
1516
#include <logmsg.h>
@@ -146,7 +147,7 @@ int32_t general_sw_loader(struct acrn_vm *vm)
146147
/* Copy Guest OS bootargs to its load location */
147148
(void)copy_to_gpa(vm, linux_info->bootargs_src_addr,
148149
(uint64_t)linux_info->bootargs_load_addr,
149-
(strnlen_s((char *)linux_info->bootargs_src_addr, MEM_2K - 1U) + 1U));
150+
(strnlen_s((char *)linux_info->bootargs_src_addr, MAX_BOOTARGS_SIZE) + 1U));
150151

151152
/* add "hugepagesz=1G hugepages=x" to cmdline for 1G hugepage
152153
* reserving. Current strategy is "total_mem_size in Giga -

hypervisor/include/arch/x86/multiboot.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
#define MULTIBOOT_INFO_HAS_DRIVES 0x00000080U
1515
#define MULTIBOOT_INFO_HAS_LOADER_NAME 0x00000200U
1616

17+
/* maximum lengt of the guest OS' command line parameter string */
18+
#define MAX_BOOTARGS_SIZE 2048U
19+
1720
struct acrn_vm;
1821
struct multiboot_info {
1922
uint32_t mi_flags;

hypervisor/include/arch/x86/vm_config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
#include <types.h>
1111
#include <pci.h>
12+
#include <multiboot.h>
1213

13-
#define MAX_BOOTARGS_SIZE 1024U
1414
#define MAX_CONFIG_NAME_SIZE 32U
1515

1616
#define PLUG_CPU(n) (1U << (n))

0 commit comments

Comments
 (0)