• Kai Huang's avatar
    x86/virt/tdx: Use all system memory when initializing TDX module as TDX memory · abe8dbab
    Kai Huang authored
    Start to transit out the "multi-steps" to initialize the TDX module.
    
    TDX provides increased levels of memory confidentiality and integrity.
    This requires special hardware support for features like memory
    encryption and storage of memory integrity checksums.  Not all memory
    satisfies these requirements.
    
    As a result, TDX introduced the concept of a "Convertible Memory Region"
    (CMR).  During boot, the firmware builds a list of all of the memory
    ranges which can provide the TDX security guarantees.  The list of these
    ranges is available to the kernel by querying the TDX module.
    
    CMRs 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.  Once this is done, those "TDX-usable"
    memory regions are fixed during module's lifetime.
    
    To keep things simple, assume that all TDX-protected memory will come
    from the page allocator.  Make sure all pages in the page allocator
    *are* TDX-usable memory.
    
    As TDX-usable memory is a fixed configuration, take a snapshot of the
    memory configuration from memblocks at the time of module initialization
    (memblocks are modified on memory hotplug).  This snapshot is used to
    enable TDX support for *this* memory configuration only.  Use a memory
    hotplug notifier to ensure that no other RAM can be added outside of
    this configuration.
    
    This approach requires all memblock memory regions at the time of module
    initialization to be TDX convertible memory to work, otherwise module
    initialization will fail in a later SEAMCALL when passing those regions
    to the module.  This approach works when all boot-time "system RAM" is
    TDX convertible memory and no non-TDX-convertible memory is hot-added
    to the core-mm before module initialization.
    
    For instance, on the first generation of TDX machines, both CXL memory
    and NVDIMM are not TDX convertible memory.  Using kmem driver to hot-add
    any CXL memory or NVDIMM to the core-mm before module initialization
    will result in failure to initialize the module.  The SEAMCALL error
    code will be available in the dmesg to help user to understand the
    failure.
    Signed-off-by: default avatarKai Huang <kai.huang@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatar"Huang, Ying" <ying.huang@intel.com>
    Reviewed-by: default avatarIsaku Yamahata <isaku.yamahata@intel.com>
    Reviewed-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Link: https://lore.kernel.org/all/20231208170740.53979-7-dave.hansen%40intel.com
    abe8dbab
setup.c 30.9 KB