diff --git a/hypervisor/arch/x86/cpu.c b/hypervisor/arch/x86/cpu.c index 2b4a43a37..1f8cc1a2a 100644 --- a/hypervisor/arch/x86/cpu.c +++ b/hypervisor/arch/x86/cpu.c @@ -369,7 +369,8 @@ void bsp_boot_init(void) start_tsc = rdtsc(); /* Clear BSS */ - (void)memset(_ld_bss_start, 0U, (size_t)(_ld_bss_end - _ld_bss_start)); + (void)memset(&_ld_bss_start, 0U, + (size_t)(&_ld_bss_end - &_ld_bss_start)); /* Build time sanity checks to make sure hard-coded offset * is matching the actual offset! diff --git a/hypervisor/boot/include/reloc.h b/hypervisor/boot/include/reloc.h old mode 100755 new mode 100644 index ac6de5f1a..a9365852a --- a/hypervisor/boot/include/reloc.h +++ b/hypervisor/boot/include/reloc.h @@ -14,25 +14,25 @@ extern void write_trampoline_sym(void *sym, uint64_t val); extern uint64_t prepare_trampoline(void); /* external symbols that are helpful for relocation */ -extern uint8_t _DYNAMIC[]; -extern const uint8_t _ld_trampoline_load[]; -extern uint8_t _ld_trampoline_start[]; -extern uint8_t _ld_trampoline_end[]; -extern const uint64_t _ld_trampoline_size; +extern uint8_t _DYNAMIC[1]; +extern const uint8_t _ld_trampoline_load; +extern uint8_t _ld_trampoline_start; +extern uint8_t _ld_trampoline_end; +extern const uint64_t _ld_trampoline_size; -extern uint8_t cpu_primary_start_32[]; -extern uint8_t cpu_primary_start_64[]; +extern uint8_t cpu_primary_start_32; +extern uint8_t cpu_primary_start_64; -extern uint8_t trampoline_fixup_cs[]; -extern uint8_t trampoline_fixup_ip[]; -extern uint8_t trampoline_fixup_target[]; -extern uint8_t CPU_Boot_Page_Tables_Start[]; -extern uint8_t CPU_Boot_Page_Tables_ptr[]; -extern uint8_t trampoline_pdpt_addr[]; -extern uint8_t trampoline_gdt_ptr[]; -extern uint8_t trampoline_start64_fixup[]; -extern uint8_t trampoline_spinlock_ptr[]; +extern uint8_t trampoline_fixup_cs; +extern uint8_t trampoline_fixup_ip; +extern uint8_t trampoline_fixup_target; +extern uint8_t CPU_Boot_Page_Tables_Start; +extern uint8_t CPU_Boot_Page_Tables_ptr; +extern uint8_t trampoline_pdpt_addr; +extern uint8_t trampoline_gdt_ptr; +extern uint8_t trampoline_start64_fixup; +extern uint8_t trampoline_spinlock_ptr; -extern uint64_t trampoline_start16_paddr; +extern uint64_t trampoline_start16_paddr; #endif /* RELOCATE_H */ diff --git a/hypervisor/boot/reloc.c b/hypervisor/boot/reloc.c index 35cfe0d86..026f24b20 100644 --- a/hypervisor/boot/reloc.c +++ b/hypervisor/boot/reloc.c @@ -107,8 +107,8 @@ void _relocate(void) * absolute addresses */ trampoline_end = (uint64_t)_ld_trampoline_end - delta; - primary_32_start = (uint64_t)cpu_primary_start_32 - delta; - primary_32_end = (uint64_t)cpu_primary_start_64 - delta; + primary_32_start = (uint64_t)(&cpu_primary_start_32) - delta; + primary_32_end = (uint64_t)(&cpu_primary_start_64) - delta; while (start < end) { if ((ELF64_R_TYPE(start->r_info)) == R_X86_64_RELATIVE) { @@ -168,31 +168,34 @@ static void update_trampoline_code_refs(uint64_t dest_pa) * trampoline code starts in real mode, * so the target addres is HPA */ - val = dest_pa + trampoline_relo_addr(trampoline_fixup_target); + val = dest_pa + trampoline_relo_addr(&trampoline_fixup_target); - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_cs)); + ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_fixup_cs)); *(uint16_t *)(ptr) = (uint16_t)((val >> 4) & 0xFFFFU); - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_ip)); + ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_fixup_ip)); *(uint16_t *)(ptr) = (uint16_t)(val & 0xfU); /* Update temporary page tables */ - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_ptr)); + ptr = HPA2HVA(dest_pa + + trampoline_relo_addr(&CPU_Boot_Page_Tables_ptr)); *(uint32_t *)(ptr) += (uint32_t)dest_pa; - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_Start)); + ptr = HPA2HVA(dest_pa + + trampoline_relo_addr(&CPU_Boot_Page_Tables_Start)); *(uint64_t *)(ptr) += dest_pa; - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_pdpt_addr)); + ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_pdpt_addr)); for (i = 0; i < 4; i++) *(uint64_t *)(ptr + sizeof(uint64_t) * i) += dest_pa; /* update the gdt base pointer with relocated offset */ - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_gdt_ptr)); + ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_gdt_ptr)); *(uint64_t *)(ptr + 2) += dest_pa; /* update trampoline jump pointer with relocated offset */ - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_start64_fixup)); + ptr = HPA2HVA(dest_pa + + trampoline_relo_addr(&trampoline_start64_fixup)); *(uint32_t *)ptr += dest_pa; /* update trampoline's main entry pointer */ @@ -200,7 +203,7 @@ static void update_trampoline_code_refs(uint64_t dest_pa) *(uint64_t *)ptr += get_hv_image_delta(); /* update trampoline's spinlock pointer */ - ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_spinlock_ptr)); + ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_spinlock_ptr)); *(uint64_t *)ptr += get_hv_image_delta(); } @@ -208,7 +211,7 @@ uint64_t prepare_trampoline(void) { uint64_t size, dest_pa; - size = (uint64_t)_ld_trampoline_end - (uint64_t)_ld_trampoline_start; + size = (uint64_t)(&_ld_trampoline_end - &_ld_trampoline_start); #ifndef CONFIG_EFI_STUB dest_pa = e820_alloc_low_memory(CONFIG_LOW_RAM_SIZE); #else @@ -218,7 +221,8 @@ uint64_t prepare_trampoline(void) pr_dbg("trampoline code: %llx size %x", dest_pa, size); /* Copy segment for AP initialization code below 1MB */ - memcpy_s(HPA2HVA(dest_pa), (size_t)size, _ld_trampoline_load, (size_t)size); + memcpy_s(HPA2HVA(dest_pa), (size_t)size, &_ld_trampoline_load, + (size_t)size); update_trampoline_code_refs(dest_pa); trampoline_start16_paddr = dest_pa; diff --git a/hypervisor/include/arch/x86/cpu.h b/hypervisor/include/arch/x86/cpu.h index 821dd9092..e4e6c3792 100644 --- a/hypervisor/include/arch/x86/cpu.h +++ b/hypervisor/include/arch/x86/cpu.h @@ -155,8 +155,8 @@ /**********************************/ /* EXTERNAL VARIABLES */ /**********************************/ -extern uint8_t _ld_bss_start[]; -extern uint8_t _ld_bss_end[]; +extern uint8_t _ld_bss_start; +extern uint8_t _ld_bss_end; /* In trampoline range, hold the jump target which trampline will jump to */ extern uint64_t main_entry[1]; diff --git a/hypervisor/include/arch/x86/guest/guest.h b/hypervisor/include/arch/x86/guest/guest.h index c858798e8..94a581b34 100644 --- a/hypervisor/include/arch/x86/guest/guest.h +++ b/hypervisor/include/arch/x86/guest/guest.h @@ -93,14 +93,14 @@ void init_e820(void); void obtain_e820_mem_info(void); extern uint32_t e820_entries; extern struct e820_entry e820[E820_MAX_ENTRIES]; -extern uint32_t boot_regs[]; +extern uint32_t boot_regs[2]; extern struct e820_mem_params e820_mem; int rdmsr_vmexit_handler(struct vcpu *vcpu); int wrmsr_vmexit_handler(struct vcpu *vcpu); void init_msr_emulation(struct vcpu *vcpu); -extern const char vm_exit[]; +extern const char vm_exit; struct run_context; int vmx_vmrun(struct run_context *context, int ops, int ibrs);