• Tom Lendacky's avatar
    x86/sev: Use the GHCB protocol when available for SNP CPUID requests · 6bc6f7d9
    Tom Lendacky authored
    SNP retrieves the majority of CPUID information from the SNP CPUID page.
    But there are times when that information needs to be supplemented by the
    hypervisor, for example, obtaining the initial APIC ID of the vCPU from
    leaf 1.
    
    The current implementation uses the MSR protocol to retrieve the data from
    the hypervisor, even when a GHCB exists. The problem arises when an NMI
    arrives on return from the VMGEXIT. The NMI will be immediately serviced
    and may generate a #VC requiring communication with the hypervisor.
    
    Since a GHCB exists in this case, it will be used. As part of using the
    GHCB, the #VC handler will write the GHCB physical address into the GHCB
    MSR and the #VC will be handled.
    
    When the NMI completes, processing resumes at the site of the VMGEXIT
    which is expecting to read the GHCB MSR and find a CPUID MSR protocol
    response. Since the NMI handling overwrote the GHCB MSR response, the
    guest will see an invalid reply from the hypervisor and self-terminate.
    
    Fix this problem by using the GHCB when it is available. Any NMI
    received is properly handled because the GHCB contents are copied into
    a backup page and restored on NMI exit, thus preserving the active GHCB
    request or result.
    
      [ bp: Touchups. ]
    
    Fixes: ee0bfa08 ("x86/compressed/64: Add support for SEV-SNP CPUID table in #VC handlers")
    Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    Cc: <stable@kernel.org>
    Link: https://lore.kernel.org/r/a5856fa1ebe3879de91a8f6298b6bbd901c61881.1690578565.git.thomas.lendacky@amd.com
    6bc6f7d9
sev-shared.c 28.8 KB