• Arvind Sankar's avatar
    efi/x86: Don't depend on firmware GDT layout · 90ff2262
    Arvind Sankar authored
    When booting in mixed mode, the firmware's GDT is still installed at
    handover entry in efi32_stub_entry. We save the GDTR for later use in
    __efi64_thunk but we are assuming that descriptor 2 (__KERNEL_CS) is a
    valid 32-bit code segment descriptor and that descriptor 3
    (__KERNEL_DS/__BOOT_DS) is a valid data segment descriptor.
    
    This happens to be true for OVMF (it actually uses descriptor 1 for data
    segments, but descriptor 3 is also setup as data), but we shouldn't
    depend on this being the case.
    
    Fix this by saving the code and data selectors in addition to the GDTR
    in efi32_stub_entry, and restoring them in __efi64_thunk before calling
    the firmware. The UEFI specification guarantees that selectors will be
    flat, so using the DS selector for all the segment registers should be
    enough.
    
    We also need to install our own GDT before initializing segment
    registers in startup_32, so move the GDT load up to the beginning of the
    function.
    
    [ardb: mention mixed mode in the commit log]
    Signed-off-by: default avatarArvind Sankar <nivedita@alum.mit.edu>
    Link: https://lore.kernel.org/r/20200202171353.3736319-3-nivedita@alum.mit.eduSigned-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    90ff2262
head_64.S 15.8 KB