linux/arch/x86/coco/tdx
Kirill A. Shutemov 859e63b789 x86/tdx: Convert shared memory back to private on kexec
TDX guests allocate shared buffers to perform I/O. It is done by allocating
pages normally from the buddy allocator and converting them to shared with
set_memory_decrypted().

The second, kexec-ed kernel has no idea what memory is converted this way. It
only sees E820_TYPE_RAM.

Accessing shared memory via private mapping is fatal. It leads to unrecoverable
TD exit.

On kexec, walk direct mapping and convert all shared memory back to private. It
makes all RAM private again and second kernel may use it normally.

The conversion occurs in two steps: stopping new conversions and unsharing all
memory. In the case of normal kexec, the stopping of conversions takes place
while scheduling is still functioning. This allows for waiting until any ongoing
conversions are finished. The second step is carried out when all CPUs except one
are inactive and interrupts are disabled. This prevents any conflicts with code
that may access shared memory.

Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Reviewed-by: Kai Huang <kai.huang@intel.com>
Tested-by: Tao Liu <ltao@redhat.com>
Link: https://lore.kernel.org/r/20240614095904.1345461-12-kirill.shutemov@linux.intel.com
2024-06-17 17:46:05 +02:00
..
Makefile x86/tdx: Add unaccepted memory support 2023-06-06 18:25:57 +02:00
tdcall.S x86/tdx: Reimplement __tdx_hypercall() using TDX_MODULE_CALL asm 2023-09-12 16:30:14 -07:00
tdx-shared.c x86/virt/tdx: Define TDX supported page sizes as macros 2023-12-08 09:12:00 -08:00
tdx.c x86/tdx: Convert shared memory back to private on kexec 2024-06-17 17:46:05 +02:00