• Kai Huang's avatar
    x86/virt/tdx: Get module global metadata for module initialization · cf72bc48
    Kai Huang authored
    The TDX module global metadata provides system-wide information about
    the module.
    
    TL;DR:
    
    Use the TDH.SYS.RD SEAMCALL to tell if the module is good or not.
    
    Long Version:
    
    1) Only initialize TDX module with version 1.5 and later
    
    TDX module 1.0 has some compatibility issues with the later versions of
    module, as documented in the "Intel TDX module ABI incompatibilities
    between TDX1.0 and TDX1.5" spec.  Don't bother with module versions that
    do not have a stable ABI.
    
    2) Get the essential global metadata for module initialization
    
    TDX reports a list of "Convertible Memory Region" (CMR) to tell the
    kernel which memory is TDX compatible.  The kernel needs to build a list
    of memory regions (out of CMRs) as "TDX-usable" memory and pass them to
    the TDX module.  The kernel does this by constructing a list of "TD
    Memory Regions" (TDMRs) to cover all these memory regions and passing
    them to the TDX module.
    
    Each TDMR is a TDX architectural data structure containing the memory
    region that the TDMR covers, plus the information to track (within this
    TDMR):
      a) the "Physical Address Metadata Table" (PAMT) to track each TDX
         memory page's status (such as which TDX guest "owns" a given page,
         and
      b) the "reserved areas" to tell memory holes that cannot be used as
         TDX memory.
    
    The kernel needs to get below metadata from the TDX module to build the
    list of TDMRs:
      a) the maximum number of supported TDMRs
      b) the maximum number of supported reserved areas per TDMR and,
      c) the PAMT entry size for each TDX-supported page size.
    
    == Implementation ==
    
    The TDX module has two modes of fetching the metadata: a one field at
    a time, or all in one blob.  Use the field at a time for now.  It is
    slower, but there just are not enough fields now to justify the
    complexity of extra unpacking.
    
    The err_free_tdxmem=>out_put_tdxmem goto looks wonky by itself.  But
    it is the first of a bunch of error handling that will get stuck at
    its site.
    
    [ dhansen: clean up changelog and add a struct to map between
    	   the TDX module fields and 'struct tdx_tdmr_sysinfo' ]
    Signed-off-by: default avatarKai Huang <kai.huang@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Link: https://lore.kernel.org/all/20231208170740.53979-8-dave.hansen%40intel.com
    cf72bc48
tdx.h 3.37 KB