• Kai Huang's avatar
    x86/virt/tdx: Detect TDX during kernel boot · 765a0542
    Kai Huang authored
    Intel Trust Domain Extensions (TDX) protects guest VMs from malicious
    host and certain physical attacks.  A CPU-attested software module
    called 'the TDX module' runs inside a new isolated memory range as a
    trusted hypervisor to manage and run protected VMs.
    
    Pre-TDX Intel hardware has support for a memory encryption architecture
    called MKTME.  The memory encryption hardware underpinning MKTME is also
    used for Intel TDX.  TDX ends up "stealing" some of the physical address
    space from the MKTME architecture for crypto-protection to VMs.  The
    BIOS is responsible for partitioning the "KeyID" space between legacy
    MKTME and TDX.  The KeyIDs reserved for TDX are called 'TDX private
    KeyIDs' or 'TDX KeyIDs' for short.
    
    During machine boot, TDX microcode verifies that the BIOS programmed TDX
    private KeyIDs consistently and correctly programmed across all CPU
    packages.  The MSRs are locked in this state after verification.  This
    is why MSR_IA32_MKTME_KEYID_PARTITIONING gets used for TDX enumeration:
    it indicates not just that the hardware supports TDX, but that all the
    boot-time security checks passed.
    
    The TDX module is expected to be loaded by the BIOS when it enables TDX,
    but the kernel needs to properly initialize it before it can be used to
    create and run any TDX guests.  The TDX module will be initialized by
    the KVM subsystem when KVM wants to use TDX.
    
    Detect platform TDX support by detecting TDX private KeyIDs.
    
    The TDX module itself requires one TDX KeyID as the 'TDX global KeyID'
    to protect its metadata.  Each TDX guest also needs a TDX KeyID for its
    own protection.  Just use the first TDX KeyID as the global KeyID and
    leave the rest for TDX guests.  If no TDX KeyID is left for TDX guests,
    disable TDX as initializing the TDX module alone is useless.
    
    [ dhansen: add X86_FEATURE, replace helper function ]
    Signed-off-by: default avatarKai Huang <kai.huang@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: default avatarIsaku Yamahata <isaku.yamahata@intel.com>
    Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
    Reviewed-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Link: https://lore.kernel.org/all/20231208170740.53979-1-dave.hansen%40intel.com
    765a0542
msr-index.h 43.1 KB