[LibraryClasses.common]\r
BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
VmgExitLib|OvmfPkg/Library/VmgExitLib/VmgExitLib.inf\r
+ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf\r
\r
[LibraryClasses.common.SEC]\r
TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf\r
[LibraryClasses.common]\r
BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf\r
+ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf\r
\r
[LibraryClasses.common.SEC]\r
!ifdef $(DEBUG_ON_SERIAL_PORT)\r
[LibraryClasses.common]\r
BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
VmgExitLib|OvmfPkg/Library/VmgExitLib/VmgExitLib.inf\r
+ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf\r
\r
[LibraryClasses.common.SEC]\r
TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf\r
--- /dev/null
+;------------------------------------------------------------------------------\r
+; @file\r
+; TDX Common defitions used by the APs in mailbox\r
+;\r
+; Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+; SPDX-License-Identifier: BSD-2-Clause-Patent\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+CommandOffset equ 00h\r
+ApicidOffset equ 04h\r
+WakeupVectorOffset equ 08h\r
+OSArgsOffset equ 10h\r
+FirmwareArgsOffset equ 800h\r
+WakeupArgsRelocatedMailBox equ 800h\r
+AcceptPageArgsPhysicalStart equ 800h\r
+AcceptPageArgsPhysicalEnd equ 808h\r
+AcceptPageArgsChunkSize equ 810h\r
+AcceptPageArgsPageSize equ 818h\r
+CpuArrivalOffset equ 900h\r
+CpusExitingOffset equ 0a00h\r
+TalliesOffset equ 0a08h\r
+ErrorsOffset equ 0e08h\r
+\r
+SIZE_4KB equ 1000h\r
+SIZE_2MB equ 200000h\r
+SIZE_1GB equ 40000000h\r
+\r
+PAGE_ACCEPT_LEVEL_4K equ 0\r
+PAGE_ACCEPT_LEVEL_2M equ 1\r
+PAGE_ACCEPT_LEVEL_1G equ 2\r
+\r
+TDX_PAGE_ALREADY_ACCEPTED equ 0x00000b0a\r
+TDX_PAGE_SIZE_MISMATCH equ 0xc0000b0b\r
+\r
+; Errors of APs in Mailbox\r
+ERROR_NON equ 0\r
+ERROR_INVALID_ACCEPT_PAGE_SIZE equ 1\r
+ERROR_ACCEPT_PAGE_ERROR equ 2\r
+ERROR_INVALID_FALLBACK_PAGE_LEVEL equ 3\r
+\r
+MpProtectedModeWakeupCommandNoop equ 0\r
+MpProtectedModeWakeupCommandWakeup equ 1\r
+MpProtectedModeWakeupCommandSleep equ 2\r
+MpProtectedModeWakeupCommandAcceptPages equ 3\r
+\r
+MailboxApicIdInvalid equ 0xffffffff\r
+MailboxApicidBroadcast equ 0xfffffffe\r
+\r
+%define TDCALL_TDINFO 0x1\r
+%define TDCALL_TDACCEPTPAGE 0x6\r
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf\r
FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf\r
VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceLib.inf\r
+ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf\r
\r
[LibraryClasses.common.SEC]\r
QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf\r
[LibraryClasses.common]\r
BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf\r
+ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf\r
+ TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLib.inf\r
\r
[LibraryClasses.common.SEC]\r
TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf\r
INTEL:*_*_*_CC_FLAGS = /D DISABLE_NEW_DEPRECATED_INTERFACES\r
GCC:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES\r
\r
+ #\r
+ # Add TDX_GUEST_SUPPORTED\r
+ #\r
+ MSFT:*_*_*_CC_FLAGS = /D TDX_GUEST_SUPPORTED\r
+ INTEL:*_*_*_CC_FLAGS = /D TDX_GUEST_SUPPORTED\r
+ GCC:*_*_*_CC_FLAGS = -D TDX_GUEST_SUPPORTED\r
+\r
!include NetworkPkg/NetworkBuildOptions.dsc.inc\r
\r
[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER]\r
[LibraryClasses.common]\r
BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
VmgExitLib|OvmfPkg/Library/VmgExitLib/VmgExitLib.inf\r
+ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf\r
+ TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLib.inf\r
\r
[LibraryClasses.common.SEC]\r
TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf\r
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode|0x100\r
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData|0x100\r
\r
+ #\r
+ # TDX need 1G PageTable support\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE\r
+\r
#\r
# Network Pcds\r
#\r
OvmfPkg/Sec/SecMain.inf {\r
<LibraryClasses>\r
NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
+ NULL|OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf\r
}\r
\r
#\r
[LibraryClasses.common]\r
BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf\r
VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf\r
+ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf\r
\r
[LibraryClasses.common.SEC]\r
QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf\r
#include <Library/ExtractGuidedSectionLib.h>\r
#include <Library/LocalApicLib.h>\r
#include <Library/CpuExceptionHandlerLib.h>\r
-\r
#include <Ppi/TemporaryRamSupport.h>\r
-\r
+#include <Library/PlatformInitLib.h>\r
#include "AmdSev.h"\r
\r
#define SEC_IDT_ENTRY_COUNT 34\r
UINT32 Index;\r
volatile UINT8 *Table;\r
\r
+ #if defined (TDX_GUEST_SUPPORTED)\r
+ if (TdIsEnabled ()) {\r
+ //\r
+ // For Td guests, the memory map info is in TdHobLib. It should be processed\r
+ // first so that the memory is accepted. Otherwise access to the unaccepted\r
+ // memory will trigger tripple fault.\r
+ //\r
+ if (ProcessTdxHobList () != EFI_SUCCESS) {\r
+ CpuDeadLoop ();\r
+ }\r
+ }\r
+\r
+ #endif\r
+\r
//\r
// To ensure SMM can't be compromised on S3 resume, we must force re-init of\r
// the BaseExtractGuidedSectionLib. Since this is before library contructors\r
// we use a loop rather than CopyMem.\r
//\r
IdtTableInStack.PeiService = NULL;\r
+\r
for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index++) {\r
//\r
// Declare the local variables that actually move the data elements as\r
AsmEnableCache ();\r
}\r
\r
+ #if defined (TDX_GUEST_SUPPORTED)\r
+ if (TdIsEnabled ()) {\r
+ //\r
+ // InitializeCpuExceptionHandlers () should be called in Td guests so that\r
+ // #VE exceptions can be handled correctly.\r
+ //\r
+ InitializeCpuExceptionHandlers (NULL);\r
+ }\r
+\r
+ #endif\r
+\r
DEBUG ((\r
DEBUG_INFO,\r
"SecCoreStartupWithStack(0x%x, 0x%x)\n",\r
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase\r
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedStart\r
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedEnd\r
+ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase\r
+ gUefiOvmfPkgTokenSpaceGuid.PcdTdxAcceptPageSize\r
+ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase\r
\r
[FeaturePcd]\r
gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire\r
;------------------------------------------------------------------------------\r
\r
#include <Base.h>\r
+%include "TdxCommondefs.inc"\r
\r
DEFAULT REL\r
SECTION .text\r
\r
extern ASM_PFX(SecCoreStartupWithStack)\r
\r
+%macro tdcall 0\r
+ db 0x66, 0x0f, 0x01, 0xcc\r
+%endmacro\r
+\r
;\r
; SecCore Entry Point\r
;\r
global ASM_PFX(_ModuleEntryPoint)\r
ASM_PFX(_ModuleEntryPoint):\r
\r
+ ;\r
+ ; Guest type is stored in OVMF_WORK_AREA\r
+ ;\r
+ %define OVMF_WORK_AREA FixedPcdGet32 (PcdOvmfWorkAreaBase)\r
+ %define VM_GUEST_TYPE_TDX 2\r
+ mov eax, OVMF_WORK_AREA\r
+ cmp byte[eax], VM_GUEST_TYPE_TDX\r
+ jne InitStack\r
+\r
+ mov rax, TDCALL_TDINFO\r
+ tdcall\r
+\r
+ ;\r
+ ; R8 [31:0] NUM_VCPUS\r
+ ; [63:32] MAX_VCPUS\r
+ ; R9 [31:0] VCPU_INDEX\r
+ ; Td Guest set the VCPU0 as the BSP, others are the APs\r
+ ; APs jump to spinloop and get released by DXE's MpInitLib\r
+ ;\r
+ mov rax, r9\r
+ and rax, 0xffff\r
+ test rax, rax\r
+ jne ParkAp\r
+\r
+InitStack:\r
+\r
;\r
; Fill the temporary RAM with the initial stack value.\r
; The loop below will seed the heap as well, but that's harmless.\r
sub rsp, 0x20\r
call ASM_PFX(SecCoreStartupWithStack)\r
\r
+ ;\r
+ ; Note: BSP never gets here. APs will be unblocked by DXE\r
+ ;\r
+ ; R8 [31:0] NUM_VCPUS\r
+ ; [63:32] MAX_VCPUS\r
+ ; R9 [31:0] VCPU_INDEX\r
+ ;\r
+ParkAp:\r
+\r
+ mov rbp, r9\r
+\r
+.do_wait_loop:\r
+ mov rsp, FixedPcdGet32 (PcdOvmfSecGhcbBackupBase)\r
+\r
+ ;\r
+ ; register itself in [rsp + CpuArrivalOffset]\r
+ ;\r
+ mov rax, 1\r
+ lock xadd dword [rsp + CpuArrivalOffset], eax\r
+ inc eax\r
+\r
+.check_arrival_cnt:\r
+ cmp eax, r8d\r
+ je .check_command\r
+ mov eax, dword[rsp + CpuArrivalOffset]\r
+ jmp .check_arrival_cnt\r
+\r
+.check_command:\r
+ mov eax, dword[rsp + CommandOffset]\r
+ cmp eax, MpProtectedModeWakeupCommandNoop\r
+ je .check_command\r
+\r
+ cmp eax, MpProtectedModeWakeupCommandWakeup\r
+ je .do_wakeup\r
+\r
+ ; Don't support this command, so ignore\r
+ jmp .check_command\r
+\r
+.do_wakeup:\r
+ ;\r
+ ; BSP sets these variables before unblocking APs\r
+ ; RAX: WakeupVectorOffset\r
+ ; RBX: Relocated mailbox address\r
+ ; RBP: vCpuId\r
+ ;\r
+ mov rax, 0\r
+ mov eax, dword[rsp + WakeupVectorOffset]\r
+ mov rbx, [rsp + WakeupArgsRelocatedMailBox]\r
+ nop\r
+ jmp rax\r
+ jmp $\r