• Tom Lendacky's avatar
    x86/head/64: Switch to KERNEL_CS as soon as new GDT is installed · a37f2699
    Tom Lendacky authored
    The call to startup_64_setup_env() will install a new GDT but does not
    actually switch to using the KERNEL_CS entry until returning from the
    function call.
    
    Commit bcce8290 ("x86/sev: Detect/setup SEV/SME features earlier in
    boot") moved the call to sme_enable() earlier in the boot process and in
    between the call to startup_64_setup_env() and the switch to KERNEL_CS.
    An SEV-ES or an SEV-SNP guest will trigger #VC exceptions during the call
    to sme_enable() and if the CS pushed on the stack as part of the exception
    and used by IRETQ is not mapped by the new GDT, then problems occur.
    Today, the current CS when entering startup_64 is the kernel CS value
    because it was set up by the decompressor code, so no issue is seen.
    
    However, a recent patchset that looked to avoid using the legacy
    decompressor during an EFI boot exposed this bug. At entry to startup_64,
    the CS value is that of EFI and is not mapped in the new kernel GDT. So
    when a #VC exception occurs, the CS value used by IRETQ is not valid and
    the guest boot crashes.
    
    Fix this issue by moving the block that switches to the KERNEL_CS value to
    be done immediately after returning from startup_64_setup_env().
    
    Fixes: bcce8290 ("x86/sev: Detect/setup SEV/SME features earlier in boot")
    Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarJoerg Roedel <jroedel@suse.de>
    Link: https://lore.kernel.org/all/6ff1f28af2829cc9aea357ebee285825f90a431f.1684340801.git.thomas.lendacky%40amd.com
    a37f2699
head_64.S 18.2 KB