cpu/x86: Link page tables in stage if possible

When switching back and forth between 32 to 64 bit mode, for example to
call a 32-bits FSP or to call the payload, new page tables in the
respective stage will be linked.

The advantages of this approach are:
- No need to determine a good place for page tables in CBFS that does
  not overlap.
- Works with non memory mapped flash (however all coreboot targets
  currently do support this)
- If later stages can use their own page tables which fits better with
  the vboot RO/RW flow

A disadvantage is that it increases the stage size. This could be
improved upon by using 1G pages and generating the pages at runtime.

Note: qemu cannot have the page tables in the RO boot medium and needs
to relocate them at runtime. This is why keeping the existing code with
page tables in CBFS is done for now.

TEST: Booted to payload on google/vilbox and qemu/q35

Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Change-Id: Ied54b66b930187cba5fbc578a81ed5859a616562
Reviewed-on: https://review.coreboot.org/c/coreboot/+/80337
Reviewed-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Arthur Heymans 2024-02-02 18:49:53 +01:00 committed by Martin L Roth
parent 34684caad5
commit ee83be4d75
13 changed files with 28 additions and 10 deletions

View File

@ -83,9 +83,13 @@ config USE_EXP_X86_64_SUPPORT
is an experimental option: do not enable unless one wants to test it
and has the means to recover a system when coreboot fails to boot.
config PAGE_TABLES_IN_CBFS
bool
default n
config ARCH_X86_64_PGTBL_LOC
hex "x86_64 page table location in CBFS"
depends on ARCH_BOOTBLOCK_X86_64
depends on ARCH_BOOTBLOCK_X86_64 && PAGE_TABLES_IN_CBFS
default 0xfffe9000
help
The position where to place pagetables. Needs to be known at

View File

@ -163,7 +163,7 @@ addrsize_set_high:
subl $4, %esp
#if ENV_X86_64
setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
setup_longmode $PM4LE
movd %mm2, %rdi
shlq $32, %rdi

View File

@ -214,7 +214,7 @@ end_microcode_update:
andl $0xfffffff0, %esp
#if ENV_X86_64
setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
setup_longmode $PM4LE
movd %mm2, %rdi
shlq $32, %rdi

View File

@ -363,7 +363,7 @@ fill_cache:
subl $4, %esp
#if ENV_X86_64
setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
setup_longmode $PM4LE
movd %mm2, %rdi
shlq $32, %rdi /* BIST */

View File

@ -9,13 +9,15 @@ else
PAGETABLE_SRC := pt.S
endif
all_x86-y += $(PAGETABLE_SRC)
# Add --defsym=_start=0 to suppress a linker warning.
$(objcbfs)/pt: $(dir)/$(PAGETABLE_SRC) $(obj)/config.h
$(CC_bootblock) $(CFLAGS_bootblock) $(CPPFLAGS_bootblock) -o $@.tmp $< -Wl,--section-start=.rodata=$(CONFIG_ARCH_X86_64_PGTBL_LOC),--defsym=_start=0
$(OBJCOPY_ramstage) -Obinary -j .rodata $@.tmp $@
rm $@.tmp
cbfs-files-y += pagetables
cbfs-files-$(CONFIG_PAGE_TABLES_IN_CBFS) += pagetables
pagetables-file := $(objcbfs)/pt
pagetables-type := raw
pagetables-compression := none

View File

@ -11,9 +11,11 @@
#if ENV_X86_64
.code32
#if CONFIG(PAGE_TABLES_IN_CBFS)
#if (CONFIG_ARCH_X86_64_PGTBL_LOC & 0xfff) > 0
#error pagetables must be 4KiB aligned!
#endif
#endif
#include <cpu/x86/msr.h>
#if defined(__RAMSTAGE__)

View File

@ -44,7 +44,7 @@ protected_mode_call_wrapper:
movl %eax, %ebx
/* Preserves ebx */
setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
setup_longmode $PM4LE
/* Place return value in rax */
movl %ebx, %eax

View File

@ -21,7 +21,7 @@ long_mode_call_3arg:
mov %esp, %ebp
/* Enter long mode, preserves ebx */
setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
setup_longmode $PM4LE
/* Align stack */
movabs $0xfffffffffffffff0, %rax

View File

@ -18,7 +18,7 @@
#define _GEN_PAGE(a) (_PRES + _RW + _US + _PS + _A + _D + (a))
.global PM4LE
.align 32
.align 4096
PM4LE:
.quad _GEN_DIR(PDPE_table)

View File

@ -30,6 +30,11 @@ config VBOOT
select GBB_FLAG_DISABLE_FWMP
if ARCH_BOOTBLOCK_X86_64
config PAGE_TABLES_IN_CBFS
bool
default y
# Need to install page tables in DRAM as the virtual MMU has problems translating paging
# request when the page table resides in emulated ROM. This causes undefined behaviour
# when handling data requests, as well as fetching and decoding instructions

View File

@ -32,6 +32,11 @@ config FMDFILE
default "src/mainboard/\$(CONFIG_MAINBOARD_DIR)/vboot-rwab-16M.fmd" if VBOOT_SLOTS_RW_AB
if ARCH_BOOTBLOCK_X86_64
config PAGE_TABLES_IN_CBFS
bool
default y
# Need to install page tables in DRAM as the virtual MMU has problems translating paging
# request when the page table resides in emulated ROM. This causes undefined behaviour
# when handling data requests, as well as fetching and decoding instructions

View File

@ -28,7 +28,7 @@ bootblock_pre_c_entry:
post_code(POSTCODE_BOOTBLOCK_PRE_C_ENTRY)
#if ENV_X86_64
setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
setup_longmode $PM4LE
#endif
/* Clear .bss section */

View File

@ -280,7 +280,7 @@ car_init_done:
andl $0xfffffff0, %esp
#if ENV_X86_64
setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
setup_longmode $PM4LE
movd %mm2, %rdi
shlq $32, %rdi