Skip to content

Commit 3892bd0

Browse files
fyin1lijinxia
authored andcommitted
hv: refine the address used in sbl multiboot code
Update the structure definition to define the address type (HVA vs HPA vs GPA) explicitly. Convert address to HVA before access the GPA/HPA type of address. Signed-off-by: Yin Fengwei <fengwei.yin@intel.com>
1 parent 437ed88 commit 3892bd0

File tree

4 files changed

+30
-24
lines changed

4 files changed

+30
-24
lines changed

hypervisor/arch/x86/guest/guest.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,13 +416,14 @@ void init_e820(void)
416416
unsigned int i;
417417

418418
if (boot_regs[0] == MULTIBOOT_INFO_MAGIC) {
419-
struct multiboot_info *mbi =
420-
(struct multiboot_info *)((uint64_t)boot_regs[1]);
419+
struct multiboot_info *mbi = (struct multiboot_info *)
420+
(HPA2HVA((uint64_t)boot_regs[1]));
421+
421422
pr_info("Multiboot info detected\n");
422423
if ((mbi->mi_flags & 0x40U) != 0U) {
423424
struct multiboot_mmap *mmap =
424425
(struct multiboot_mmap *)
425-
((uint64_t)mbi->mi_mmap_addr);
426+
HPA2HVA((uint64_t)mbi->mi_mmap_addr);
426427
e820_entries = mbi->mi_mmap_length/
427428
sizeof(struct multiboot_mmap);
428429
if (e820_entries > E820_MAX_ENTRIES) {

hypervisor/boot/sbl/multiboot.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ static void parse_other_modules(struct vm *vm,
2828

2929
for (i = 0; i < mods_count; i++) {
3030
int type_len = 0;
31-
const char *start = (const char *) (uint64_t)mods[i].mm_string;
31+
const char *start = HPA2HVA((uint64_t)mods[i].mm_string);
3232
const char *end;
33-
void *mod_addr = (void *)(uint64_t)mods[i].mm_mod_start;
33+
void *mod_addr = HPA2HVA((uint64_t)mods[i].mm_mod_start);
3434
uint32_t mod_size = mods[i].mm_mod_end - mods[i].mm_mod_start;
3535

3636
dev_dbg(ACRN_DBG_BOOT, "other mod-%d start=0x%x, end=0x%x",
@@ -48,7 +48,8 @@ static void parse_other_modules(struct vm *vm,
4848
type_len = end - start;
4949
if (strncmp("FIRMWARE", start, type_len) == 0) {
5050
char dyn_bootargs[100] = {0};
51-
void *load_addr = vm->sw.linux_info.bootargs_load_addr;
51+
void *load_addr = GPA2HVA(vm,
52+
(uint64_t)vm->sw.linux_info.bootargs_load_addr);
5253
uint32_t args_size = vm->sw.linux_info.bootargs_size;
5354
static int copy_once = 1;
5455

@@ -72,7 +73,8 @@ static void parse_other_modules(struct vm *vm,
7273

7374
} else if (strncmp("RAMDISK", start, type_len) == 0) {
7475
vm->sw.linux_info.ramdisk_src_addr = mod_addr;
75-
vm->sw.linux_info.ramdisk_load_addr = mod_addr;
76+
vm->sw.linux_info.ramdisk_load_addr =
77+
mods[i].mm_mod_start;
7678
vm->sw.linux_info.ramdisk_size = mod_size;
7779
} else if (strncmp("SeedList", start, type_len) == 0) {
7880
parse_seed_list(mod_addr);
@@ -116,7 +118,7 @@ int init_vm0_boot_info(struct vm *vm)
116118
return -EINVAL;
117119
}
118120

119-
mbi = (struct multiboot_info *)((uint64_t)boot_regs[1]);
121+
mbi = HPA2HVA((uint64_t)boot_regs[1]);
120122

121123
dev_dbg(ACRN_DBG_BOOT, "Multiboot detected, flag=0x%x", mbi->mi_flags);
122124
if ((mbi->mi_flags & MULTIBOOT_INFO_HAS_MODS) == 0U) {
@@ -127,7 +129,7 @@ int init_vm0_boot_info(struct vm *vm)
127129
dev_dbg(ACRN_DBG_BOOT, "mod counts=%d\n", mbi->mi_mods_count);
128130

129131
/* mod[0] is for kernel&cmdline, other mod for ramdisk/firmware info*/
130-
mods = (struct multiboot_module *)(uint64_t)mbi->mi_mods_addr;
132+
mods = (struct multiboot_module *)HPA2HVA((uint64_t)mbi->mi_mods_addr);
131133

132134
dev_dbg(ACRN_DBG_BOOT, "mod0 start=0x%x, end=0x%x",
133135
mods[0].mm_mod_start, mods[0].mm_mod_end);
@@ -136,11 +138,11 @@ int init_vm0_boot_info(struct vm *vm)
136138

137139
vm->sw.kernel_type = VM_LINUX_GUEST;
138140
vm->sw.kernel_info.kernel_src_addr =
139-
(void *)(uint64_t)mods[0].mm_mod_start;
141+
HPA2HVA((uint64_t)mods[0].mm_mod_start);
140142
vm->sw.kernel_info.kernel_size =
141143
mods[0].mm_mod_end - mods[0].mm_mod_start;
142-
vm->sw.kernel_info.kernel_load_addr =
143-
get_kernel_load_addr(vm->sw.kernel_info.kernel_src_addr);
144+
vm->sw.kernel_info.kernel_load_addr = (void *)HVA2GPA(vm,
145+
get_kernel_load_addr(vm->sw.kernel_info.kernel_src_addr));
144146

145147

146148
/*
@@ -153,7 +155,8 @@ int init_vm0_boot_info(struct vm *vm)
153155

154156
cmd_dst = kernel_cmdline;
155157
cmd_src = HPA2HVA((uint64_t)mbi->mi_cmdline);
156-
strncpy_s(cmd_dst, MEM_2K, cmd_src, strnlen_s(cmd_src, MEM_2K));
158+
strncpy_s(cmd_dst, MEM_2K, cmd_src,
159+
strnlen_s(cmd_src, MEM_2K));
157160
off = strnlen_s(cmd_dst, MEM_2K);
158161
cmd_dst[off] = ' '; /* insert space */
159162
off += 1;
@@ -168,9 +171,10 @@ int init_vm0_boot_info(struct vm *vm)
168171
strnlen_s(kernel_cmdline, MEM_2K);
169172
} else {
170173
vm->sw.linux_info.bootargs_src_addr =
171-
(void *)(uint64_t)mods[0].mm_string;
174+
HPA2HVA((uint64_t)mods[0].mm_string);
172175
vm->sw.linux_info.bootargs_size =
173-
strnlen_s((char *)(uint64_t) mods[0].mm_string, MEM_2K);
176+
strnlen_s(HPA2HVA((uint64_t)mods[0].mm_string),
177+
MEM_2K);
174178
}
175179

176180
vm->sw.linux_info.bootargs_load_addr = (void *)BOOT_ARGS_LOAD_ADDR;

hypervisor/include/arch/x86/guest/vm.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,21 @@ struct vm_hw_info {
3030
};
3131

3232
struct sw_linux {
33-
void *ramdisk_src_addr;
34-
void *ramdisk_load_addr;
33+
void *ramdisk_src_addr; /* HVA */
34+
void *ramdisk_load_addr; /* GPA */
3535
uint32_t ramdisk_size;
36-
void *bootargs_src_addr;
37-
void *bootargs_load_addr;
36+
void *bootargs_src_addr; /* HVA */
37+
void *bootargs_load_addr; /* GPA */
3838
uint32_t bootargs_size;
39-
void *dtb_src_addr;
40-
void *dtb_load_addr;
39+
void *dtb_src_addr; /* HVA */
40+
void *dtb_load_addr; /* GPA */
4141
uint32_t dtb_size;
4242
};
4343

4444
struct sw_kernel_info {
45-
void *kernel_src_addr;
46-
void *kernel_load_addr;
47-
void *kernel_entry_addr;
45+
void *kernel_src_addr; /* HVA */
46+
void *kernel_load_addr; /* GPA */
47+
void *kernel_entry_addr; /* GPA */
4848
uint32_t kernel_size;
4949
};
5050

hypervisor/include/hypervisor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#define HVA2HPA(x) ((uint64_t)(x))
3535
/* gpa --> hpa -->hva */
3636
#define GPA2HVA(vm, x) HPA2HVA(gpa2hpa(vm, x))
37+
#define HVA2GPA(vm, x) hpa2gpa(vm, HVA2HPA(x))
3738
#endif /* !ASSEMBLER */
3839

3940
#endif /* HYPERVISOR_H */

0 commit comments

Comments
 (0)