UefiCpuPkg: Enable Tdx support in MpInitLib

RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3429

In TDVF BSP and APs are simplified. BSP is the vCPU-0, while the others
are treated as APs.

So MP intialization is rather simple. ApWorker is not supported, BSP is
always the working processor, while the APs are just in a
wait-for-precedure state.

Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Min Xu <min.m.xu@intel.com>
This commit is contained in:
Min Xu
2021-07-19 09:35:39 +08:00
committed by mergify[bot]
parent d983b102b3
commit 88da06ca76
6 changed files with 308 additions and 5 deletions

View File

@@ -9,9 +9,11 @@
**/
#include "MpLib.h"
#include "MpIntelTdx.h"
#include <Library/VmgExitLib.h>
#include <Register/Amd/Fam17Msr.h>
#include <Register/Amd/Ghcb.h>
#include <ConfidentialComputingGuestAttr.h>
EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;
@@ -1803,6 +1805,10 @@ MpInitLibInitialize (
UINTN BackupBufferAddr;
UINTN ApIdtBase;
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
return EFI_SUCCESS;
}
OldCpuMpData = GetCpuMpDataFromGuidedHob ();
if (OldCpuMpData == NULL) {
MaxLogicalProcessorNumber = PcdGet32 (PcdCpuMaxLogicalProcessorNumber);
@@ -2073,6 +2079,10 @@ MpInitLibGetProcessorInfo (
CPU_INFO_IN_HOB *CpuInfoInHob;
UINTN OriginalProcessorNumber;
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
return TdxMpInitLibGetProcessorInfo (ProcessorNumber, ProcessorInfoBuffer, HealthData);
}
CpuMpData = GetCpuMpData ();
CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
@@ -2167,6 +2177,10 @@ SwitchBSPWorker (
BOOLEAN OldInterruptState;
BOOLEAN OldTimerInterruptState;
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
return EFI_UNSUPPORTED;
}
//
// Save and Disable Local APIC timer interrupt
//
@@ -2307,6 +2321,10 @@ EnableDisableApWorker (
CPU_MP_DATA *CpuMpData;
UINTN CallerNumber;
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
return EFI_UNSUPPORTED;
}
CpuMpData = GetCpuMpData ();
//
@@ -2367,6 +2385,11 @@ MpInitLibWhoAmI (
return EFI_INVALID_PARAMETER;
}
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
*ProcessorNumber = 0;
return EFI_SUCCESS;
}
CpuMpData = GetCpuMpData ();
return GetProcessorNumber (CpuMpData, ProcessorNumber);
@@ -2405,12 +2428,16 @@ MpInitLibGetNumberOfProcessors (
UINTN EnabledProcessorNumber;
UINTN Index;
CpuMpData = GetCpuMpData ();
if ((NumberOfProcessors == NULL) && (NumberOfEnabledProcessors == NULL)) {
return EFI_INVALID_PARAMETER;
}
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
return TdxMpInitLibGetNumberOfProcessors (NumberOfProcessors, NumberOfEnabledProcessors);
}
CpuMpData = GetCpuMpData ();
//
// Check whether caller processor is BSP
//
@@ -2490,13 +2517,16 @@ StartupAllCPUsWorker (
BOOLEAN HasEnabledAp;
CPU_STATE ApState;
CpuMpData = GetCpuMpData ();
if (FailedCpuList != NULL) {
*FailedCpuList = NULL;
}
if ((CpuMpData->CpuCount == 1) && ExcludeBsp) {
Status = MpInitLibGetNumberOfProcessors (&ProcessorCount, NULL);
if (EFI_ERROR (Status)) {
return Status;
}
if ((ProcessorCount == 1) && ExcludeBsp) {
return EFI_NOT_STARTED;
}
@@ -2504,6 +2534,22 @@ StartupAllCPUsWorker (
return EFI_INVALID_PARAMETER;
}
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
//
// For Td guest ExcludeBsp must be FALSE. Otherwise it will return in above checks.
//
ASSERT (!ExcludeBsp);
//
// Start BSP.
//
Procedure (ProcedureArgument);
return EFI_SUCCESS;
}
CpuMpData = GetCpuMpData ();
//
// Check whether caller processor is BSP
//
@@ -2643,6 +2689,13 @@ StartupThisAPWorker (
CPU_AP_DATA *CpuData;
UINTN CallerNumber;
//
// In Td guest, startup of AP is not supported in current stage.
//
if (CC_GUEST_IS_TDX (PcdGet64 (PcdConfidentialComputingGuestAttr))) {
return EFI_UNSUPPORTED;
}
CpuMpData = GetCpuMpData ();
if (Finished != NULL) {