From: Zhenzhong Duan <zhenzhong.duan@xxxxxxxxx> TDVF enables lvl5 page table before pass to OS/bootloader while OVMF enables lvl4 page table. Check CR4.X86_CR4_LA57 to decide which page table level to use and initialize our own lvl5 page table if TDX. Refactor the common part of setting cr3 in a wrapper function load_page_table(). Signed-off-by: Zhenzhong Duan <zhenzhong.duan@xxxxxxxxx> Reviewed-by: Yu Zhang <yu.c.zhang@xxxxxxxxx> Link: https://lore.kernel.org/r/20220303071907.650203-13-zhenzhong.duan@xxxxxxxxx Signed-off-by: Qian Wen <qian.wen@xxxxxxxxx> --- lib/x86/setup.c | 19 +++++++++++++++++-- x86/efi/efistart64.S | 5 +++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/x86/setup.c b/lib/x86/setup.c index 82a563a3..de2dee38 100644 --- a/lib/x86/setup.c +++ b/lib/x86/setup.c @@ -265,10 +265,23 @@ static efi_status_t setup_rsdp(efi_bootinfo_t *efi_bootinfo) } /* Defined in cstart64.S or efistart64.S */ +extern u8 ptl5; extern u8 ptl4; extern u8 ptl3; extern u8 ptl2; +static void load_page_table(void) +{ + /* + * Load new page table based on the level of firmware provided page + * table. + */ + if (read_cr4() & X86_CR4_LA57) + write_cr3((ulong)&ptl5); + else + write_cr3((ulong)&ptl4); +} + static void setup_page_table(void) { pgd_t *curr_pt; @@ -281,6 +294,9 @@ static void setup_page_table(void) /* Set AMD SEV C-Bit for page table entries */ flags |= get_amd_sev_c_bit_mask(); + /* Level 5 */ + curr_pt = (pgd_t *)&ptl5; + curr_pt[0] = ((phys_addr_t)&ptl4) | flags; /* Level 4 */ curr_pt = (pgd_t *)&ptl4; curr_pt[0] = ((phys_addr_t)&ptl3) | flags; @@ -300,8 +316,7 @@ static void setup_page_table(void) setup_ghcb_pte((pgd_t *)&ptl4); } - /* Load 4-level page table */ - write_cr3((ulong)&ptl4); + load_page_table(); } efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo) diff --git a/x86/efi/efistart64.S b/x86/efi/efistart64.S index e3add79a..1146f83e 100644 --- a/x86/efi/efistart64.S +++ b/x86/efi/efistart64.S @@ -31,6 +31,11 @@ ptl4: . = . + PAGE_SIZE .align PAGE_SIZE +.globl ptl5 +ptl5: + . = . + PAGE_SIZE +.align PAGE_SIZE + .section .init .code64 .text -- 2.25.1