From 3892bd04553ee386fe926253e4425e61035b00fe Mon Sep 17 00:00:00 2001 From: Yin Fengwei Date: Wed, 20 Jun 2018 16:42:56 +0800 Subject: [PATCH] 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 --- hypervisor/arch/x86/guest/guest.c | 7 ++++--- hypervisor/boot/sbl/multiboot.c | 28 +++++++++++++++----------- hypervisor/include/arch/x86/guest/vm.h | 18 ++++++++--------- hypervisor/include/hypervisor.h | 1 + 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/hypervisor/arch/x86/guest/guest.c b/hypervisor/arch/x86/guest/guest.c index 3bed34766..7b1582991 100644 --- a/hypervisor/arch/x86/guest/guest.c +++ b/hypervisor/arch/x86/guest/guest.c @@ -416,13 +416,14 @@ void init_e820(void) unsigned int i; if (boot_regs[0] == MULTIBOOT_INFO_MAGIC) { - struct multiboot_info *mbi = - (struct multiboot_info *)((uint64_t)boot_regs[1]); + struct multiboot_info *mbi = (struct multiboot_info *) + (HPA2HVA((uint64_t)boot_regs[1])); + pr_info("Multiboot info detected\n"); if ((mbi->mi_flags & 0x40U) != 0U) { struct multiboot_mmap *mmap = (struct multiboot_mmap *) - ((uint64_t)mbi->mi_mmap_addr); + HPA2HVA((uint64_t)mbi->mi_mmap_addr); e820_entries = mbi->mi_mmap_length/ sizeof(struct multiboot_mmap); if (e820_entries > E820_MAX_ENTRIES) { diff --git a/hypervisor/boot/sbl/multiboot.c b/hypervisor/boot/sbl/multiboot.c index 32795f927..9dbe06dca 100644 --- a/hypervisor/boot/sbl/multiboot.c +++ b/hypervisor/boot/sbl/multiboot.c @@ -28,9 +28,9 @@ static void parse_other_modules(struct vm *vm, for (i = 0; i < mods_count; i++) { int type_len = 0; - const char *start = (const char *) (uint64_t)mods[i].mm_string; + const char *start = HPA2HVA((uint64_t)mods[i].mm_string); const char *end; - void *mod_addr = (void *)(uint64_t)mods[i].mm_mod_start; + void *mod_addr = HPA2HVA((uint64_t)mods[i].mm_mod_start); uint32_t mod_size = mods[i].mm_mod_end - mods[i].mm_mod_start; 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, type_len = end - start; if (strncmp("FIRMWARE", start, type_len) == 0) { char dyn_bootargs[100] = {0}; - void *load_addr = vm->sw.linux_info.bootargs_load_addr; + void *load_addr = GPA2HVA(vm, + (uint64_t)vm->sw.linux_info.bootargs_load_addr); uint32_t args_size = vm->sw.linux_info.bootargs_size; static int copy_once = 1; @@ -72,7 +73,8 @@ static void parse_other_modules(struct vm *vm, } else if (strncmp("RAMDISK", start, type_len) == 0) { vm->sw.linux_info.ramdisk_src_addr = mod_addr; - vm->sw.linux_info.ramdisk_load_addr = mod_addr; + vm->sw.linux_info.ramdisk_load_addr = + mods[i].mm_mod_start; vm->sw.linux_info.ramdisk_size = mod_size; } else if (strncmp("SeedList", start, type_len) == 0) { parse_seed_list(mod_addr); @@ -116,7 +118,7 @@ int init_vm0_boot_info(struct vm *vm) return -EINVAL; } - mbi = (struct multiboot_info *)((uint64_t)boot_regs[1]); + mbi = HPA2HVA((uint64_t)boot_regs[1]); dev_dbg(ACRN_DBG_BOOT, "Multiboot detected, flag=0x%x", mbi->mi_flags); if ((mbi->mi_flags & MULTIBOOT_INFO_HAS_MODS) == 0U) { @@ -127,7 +129,7 @@ int init_vm0_boot_info(struct vm *vm) dev_dbg(ACRN_DBG_BOOT, "mod counts=%d\n", mbi->mi_mods_count); /* mod[0] is for kernel&cmdline, other mod for ramdisk/firmware info*/ - mods = (struct multiboot_module *)(uint64_t)mbi->mi_mods_addr; + mods = (struct multiboot_module *)HPA2HVA((uint64_t)mbi->mi_mods_addr); dev_dbg(ACRN_DBG_BOOT, "mod0 start=0x%x, end=0x%x", mods[0].mm_mod_start, mods[0].mm_mod_end); @@ -136,11 +138,11 @@ int init_vm0_boot_info(struct vm *vm) vm->sw.kernel_type = VM_LINUX_GUEST; vm->sw.kernel_info.kernel_src_addr = - (void *)(uint64_t)mods[0].mm_mod_start; + HPA2HVA((uint64_t)mods[0].mm_mod_start); vm->sw.kernel_info.kernel_size = mods[0].mm_mod_end - mods[0].mm_mod_start; - vm->sw.kernel_info.kernel_load_addr = - get_kernel_load_addr(vm->sw.kernel_info.kernel_src_addr); + vm->sw.kernel_info.kernel_load_addr = (void *)HVA2GPA(vm, + get_kernel_load_addr(vm->sw.kernel_info.kernel_src_addr)); /* @@ -153,7 +155,8 @@ int init_vm0_boot_info(struct vm *vm) cmd_dst = kernel_cmdline; cmd_src = HPA2HVA((uint64_t)mbi->mi_cmdline); - strncpy_s(cmd_dst, MEM_2K, cmd_src, strnlen_s(cmd_src, MEM_2K)); + strncpy_s(cmd_dst, MEM_2K, cmd_src, + strnlen_s(cmd_src, MEM_2K)); off = strnlen_s(cmd_dst, MEM_2K); cmd_dst[off] = ' '; /* insert space */ off += 1; @@ -168,9 +171,10 @@ int init_vm0_boot_info(struct vm *vm) strnlen_s(kernel_cmdline, MEM_2K); } else { vm->sw.linux_info.bootargs_src_addr = - (void *)(uint64_t)mods[0].mm_string; + HPA2HVA((uint64_t)mods[0].mm_string); vm->sw.linux_info.bootargs_size = - strnlen_s((char *)(uint64_t) mods[0].mm_string, MEM_2K); + strnlen_s(HPA2HVA((uint64_t)mods[0].mm_string), + MEM_2K); } vm->sw.linux_info.bootargs_load_addr = (void *)BOOT_ARGS_LOAD_ADDR; diff --git a/hypervisor/include/arch/x86/guest/vm.h b/hypervisor/include/arch/x86/guest/vm.h index bb95b13a0..7d043194d 100644 --- a/hypervisor/include/arch/x86/guest/vm.h +++ b/hypervisor/include/arch/x86/guest/vm.h @@ -30,21 +30,21 @@ struct vm_hw_info { }; struct sw_linux { - void *ramdisk_src_addr; - void *ramdisk_load_addr; + void *ramdisk_src_addr; /* HVA */ + void *ramdisk_load_addr; /* GPA */ uint32_t ramdisk_size; - void *bootargs_src_addr; - void *bootargs_load_addr; + void *bootargs_src_addr; /* HVA */ + void *bootargs_load_addr; /* GPA */ uint32_t bootargs_size; - void *dtb_src_addr; - void *dtb_load_addr; + void *dtb_src_addr; /* HVA */ + void *dtb_load_addr; /* GPA */ uint32_t dtb_size; }; struct sw_kernel_info { - void *kernel_src_addr; - void *kernel_load_addr; - void *kernel_entry_addr; + void *kernel_src_addr; /* HVA */ + void *kernel_load_addr; /* GPA */ + void *kernel_entry_addr; /* GPA */ uint32_t kernel_size; }; diff --git a/hypervisor/include/hypervisor.h b/hypervisor/include/hypervisor.h index 8e3d042f8..6a1c3d768 100644 --- a/hypervisor/include/hypervisor.h +++ b/hypervisor/include/hypervisor.h @@ -34,6 +34,7 @@ #define HVA2HPA(x) ((uint64_t)(x)) /* gpa --> hpa -->hva */ #define GPA2HVA(vm, x) HPA2HVA(gpa2hpa(vm, x)) +#define HVA2GPA(vm, x) hpa2gpa(vm, HVA2HPA(x)) #endif /* !ASSEMBLER */ #endif /* HYPERVISOR_H */