diff --git a/hypervisor/arch/x86/boot/trampoline.S b/hypervisor/arch/x86/boot/trampoline.S index 8b67f4dee..f994402ad 100644 --- a/hypervisor/arch/x86/boot/trampoline.S +++ b/hypervisor/arch/x86/boot/trampoline.S @@ -179,8 +179,7 @@ trampoline_gdt_ptr: .short (trampoline_gdt_end - trampoline_gdt) - 1 .quad trampoline_gdt -/* PML4 and PDPT tables initialized to map first 4 GBytes of memory */ -/* Assumes CPU supports 1GB large pages */ +/* PML4, PDPT, and PD tables initialized to map first 4 GBytes of memory */ .align 4 .global cpu_boot_page_tables_ptr cpu_boot_page_tables_ptr: @@ -198,9 +197,19 @@ cpu_boot_page_tables_start: trampoline_pdpt_addr: address = 0 .rept 4 - /* 0x83 = (PAGE_PRESENT | PAGE_PSE | PAGE_RW) */ - .quad address + 0x83 - address = address + 0x40000000 + /* 0x3 = (PAGE_PRESENT | PAGE_RW) */ + .quad trampoline_pdt_addr + address + 0x3 + /*0x1000 = PAGE_SIZE*/ + address = address + 0x1000 + .endr + /*0x1000 = PAGE_SIZE*/ + .align 0x1000 +trampoline_pdt_addr: + address = 0 + .rept 2048 + /* 0x83 = (PAGE_PSE | PAGE_PRESENT | PAGE_RW) */ + .quad address + 0x83 + address = address + 0x200000 .endr .end diff --git a/hypervisor/arch/x86/trampoline.c b/hypervisor/arch/x86/trampoline.c index 2a31eea70..755b149b0 100644 --- a/hypervisor/arch/x86/trampoline.c +++ b/hypervisor/arch/x86/trampoline.c @@ -59,13 +59,11 @@ uint64_t get_trampoline_start16_paddr(void) return trampoline_start16_paddr; } -/* - * @pre pcpu_has_cap(X86_FEATURE_PAGE1GB) == true - */ static void update_trampoline_code_refs(uint64_t dest_pa) { void *ptr; uint64_t val; + int32_t i; /* * calculate the fixup CS:IP according to fixup target address @@ -89,6 +87,11 @@ static void update_trampoline_code_refs(uint64_t dest_pa) 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)); + 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)); *(uint64_t *)(ptr + 2) += dest_pa;