When booting the BSP the portion of the code executed from the trampoline page will be using the GDT located in the hypervisor .text.head section rather than the GDT located in the relocated trampoline page.
If skip_realmode is not set the GDT located in the trampoline page will be loaded after having executed the BIOS call, otherwise the GDT from .text.head will be used for all the protected mode trampoline code execution. Note that both gdt_boot_descr and gdt_48 contain the same entries, but the former is located inside the hypervisor .text section, while the later lives in the relocated trampoline page. This is not harmful as-is, as both GDTs contain the same entries, but for consistency with the APs switch the BSP trampoline code to also use the GDT on the relocated trampoline page. Signed-off-by: Roger Pau Monné <roger....@citrix.com> Reviewed-by: Andrew Cooper <andrew.coop...@citrix.com> --- Changes since v1: - Reword comment. --- xen/arch/x86/boot/trampoline.S | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xen/arch/x86/boot/trampoline.S b/xen/arch/x86/boot/trampoline.S index cdecf949b410..c6005fa33d1f 100644 --- a/xen/arch/x86/boot/trampoline.S +++ b/xen/arch/x86/boot/trampoline.S @@ -164,6 +164,9 @@ GLOBAL(trampoline_cpu_started) .code32 trampoline_boot_cpu_entry: + /* Switch to relocated trampoline GDT. */ + lgdt bootsym_rel(gdt_48, 4) + cmpb $0,bootsym_rel(skip_realmode,5) jnz .Lskip_realmode -- 2.40.0