mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg/SecCore: Re-install SEC platform information(2) PPI
In SecTemporaryRamDone(), we will build one privated GUIDed-HOB to save CPU BIST Data and re-install SEC platform information(2) PPI. Then other PEI drivers could get CPU BIST data from the private GUIDed-HOB by new installed PPI. Cc: Michael Kinney <michael.d.kinney@intel.com> Cc: Feng Tian <feng.tian@intel.com> Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan <jeff.fan@intel.com> Reviewed-by: Feng Tian <feng.tian@Intel.com>
This commit is contained in:
parent
d157de8b56
commit
8a5b8cef67
|
@ -14,6 +14,26 @@
|
||||||
|
|
||||||
#include "SecMain.h"
|
#include "SecMain.h"
|
||||||
|
|
||||||
|
EFI_SEC_PLATFORM_INFORMATION_PPI mSecPlatformInformation = {
|
||||||
|
SecPlatformInformationBist
|
||||||
|
};
|
||||||
|
|
||||||
|
EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformation = {
|
||||||
|
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||||
|
&gEfiSecPlatformInformationPpiGuid,
|
||||||
|
&mSecPlatformInformation
|
||||||
|
};
|
||||||
|
|
||||||
|
EFI_SEC_PLATFORM_INFORMATION2_PPI mSecPlatformInformation2 = {
|
||||||
|
SecPlatformInformation2Bist
|
||||||
|
};
|
||||||
|
|
||||||
|
EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformation2 = {
|
||||||
|
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
||||||
|
&gEfiSecPlatformInformation2PpiGuid,
|
||||||
|
&mSecPlatformInformation2
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Worker function to parse CPU BIST information from Guided HOB.
|
Worker function to parse CPU BIST information from Guided HOB.
|
||||||
|
|
||||||
|
@ -179,3 +199,70 @@ GetBistInfoFromPpi (
|
||||||
|
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get CPUs' BIST by calling SecPlatformInformationPpi/SecPlatformInformation2Ppi.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
RepublishSecPlatformInformationPpi (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
CONST EFI_PEI_SERVICES **PeiServices;
|
||||||
|
UINT64 BistInformationSize;
|
||||||
|
VOID *BistInformationData;
|
||||||
|
EFI_PEI_PPI_DESCRIPTOR *SecInformationDescriptor;
|
||||||
|
|
||||||
|
PeiServices = GetPeiServicesTablePointer ();
|
||||||
|
Status = GetBistInfoFromPpi (
|
||||||
|
PeiServices,
|
||||||
|
&gEfiSecPlatformInformation2PpiGuid,
|
||||||
|
&SecInformationDescriptor,
|
||||||
|
&BistInformationData,
|
||||||
|
&BistInformationSize
|
||||||
|
);
|
||||||
|
if (Status == EFI_SUCCESS) {
|
||||||
|
BuildGuidDataHob (
|
||||||
|
&gEfiCallerIdGuid,
|
||||||
|
BistInformationData,
|
||||||
|
(UINTN) BistInformationSize
|
||||||
|
);
|
||||||
|
//
|
||||||
|
// The old SecPlatformInformation data is on CAR.
|
||||||
|
// After memory discovered, we should never get it from CAR, or the data will be crashed.
|
||||||
|
// So, we reinstall SecPlatformInformation PPI here.
|
||||||
|
//
|
||||||
|
Status = PeiServicesReInstallPpi (
|
||||||
|
SecInformationDescriptor,
|
||||||
|
&mPeiSecPlatformInformation2
|
||||||
|
);
|
||||||
|
} if (Status == EFI_NOT_FOUND) {
|
||||||
|
Status = GetBistInfoFromPpi (
|
||||||
|
PeiServices,
|
||||||
|
&gEfiSecPlatformInformationPpiGuid,
|
||||||
|
&SecInformationDescriptor,
|
||||||
|
&BistInformationData,
|
||||||
|
&BistInformationSize
|
||||||
|
);
|
||||||
|
if (Status == EFI_SUCCESS) {
|
||||||
|
BuildGuidDataHob (
|
||||||
|
&gEfiCallerIdGuid,
|
||||||
|
BistInformationData,
|
||||||
|
(UINTN) BistInformationSize
|
||||||
|
);
|
||||||
|
//
|
||||||
|
// The old SecPlatformInformation2 data is on CAR.
|
||||||
|
// After memory discovered, we should never get it from CAR, or the data will be crashed.
|
||||||
|
// So, we reinstall SecPlatformInformation2 PPI here.
|
||||||
|
//
|
||||||
|
Status = PeiServicesReInstallPpi (
|
||||||
|
SecInformationDescriptor,
|
||||||
|
&mPeiSecPlatformInformation
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
}
|
||||||
|
|
|
@ -64,7 +64,12 @@
|
||||||
HobLib
|
HobLib
|
||||||
|
|
||||||
[Ppis]
|
[Ppis]
|
||||||
gEfiSecPlatformInformationPpiGuid ## PRODUCES
|
## SOMETIMES_CONSUMES
|
||||||
|
## PRODUCES
|
||||||
|
gEfiSecPlatformInformationPpiGuid
|
||||||
|
## SOMETIMES_CONSUMES
|
||||||
|
## SOMETIMES_PRODUCES
|
||||||
|
gEfiSecPlatformInformation2PpiGuid
|
||||||
gEfiTemporaryRamDonePpiGuid ## PRODUCES
|
gEfiTemporaryRamDonePpiGuid ## PRODUCES
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
|
|
|
@ -273,6 +273,11 @@ SecTemporaryRamDone (
|
||||||
{
|
{
|
||||||
BOOLEAN State;
|
BOOLEAN State;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Republish Sec Platform Information(2) PPI
|
||||||
|
//
|
||||||
|
RepublishSecPlatformInformationPpi ();
|
||||||
|
|
||||||
//
|
//
|
||||||
// Migrate DebugAgentContext.
|
// Migrate DebugAgentContext.
|
||||||
//
|
//
|
||||||
|
|
|
@ -109,4 +109,52 @@ ProcessLibraryConstructorList (
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Implementation of the PlatformInformation service in EFI_SEC_PLATFORM_INFORMATION_PPI.
|
||||||
|
|
||||||
|
@param PeiServices Pointer to the PEI Services Table.
|
||||||
|
@param StructureSize Pointer to the variable describing size of the input buffer.
|
||||||
|
@param PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The data was successfully returned.
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL The buffer was too small.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SecPlatformInformationBist (
|
||||||
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||||
|
IN OUT UINT64 *StructureSize,
|
||||||
|
OUT EFI_SEC_PLATFORM_INFORMATION_RECORD *PlatformInformationRecord
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Implementation of the PlatformInformation2 service in EFI_SEC_PLATFORM_INFORMATION2_PPI.
|
||||||
|
|
||||||
|
@param PeiServices The pointer to the PEI Services Table.
|
||||||
|
@param StructureSize The pointer to the variable describing size of the input buffer.
|
||||||
|
@param PlatformInformationRecord2 The pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD2.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The data was successfully returned.
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL The buffer was too small. The current buffer size needed to
|
||||||
|
hold the record is returned in StructureSize.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SecPlatformInformation2Bist (
|
||||||
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
||||||
|
IN OUT UINT64 *StructureSize,
|
||||||
|
OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Republish SecPlatformInformationPpi/SecPlatformInformation2Ppi.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
RepublishSecPlatformInformationPpi (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue