mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-22 21:24:35 +02:00
UefiCpuPkg/SecCore: Wrong Debug Information for SecCore
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1533 When SecCore and PeiCore in different FV, current implementation still assuming SecCore and PeiCore are in the same FV. To fix this issue 2 FVs will be input parameters for FindAndReportEntryPoints () and SecCore and PeiCore will be found in each FV and correct debug information will be reported. Test: Booted with internal platform successfully. Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Chasel Chiu <chasel.chiu@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
This commit is contained in:
parent
f168816c49
commit
08283b966e
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
Locate the entry point for the PEI Core
|
Locate the entry point for the PEI Core
|
||||||
|
|
||||||
Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -19,17 +19,17 @@
|
|||||||
/**
|
/**
|
||||||
Find core image base.
|
Find core image base.
|
||||||
|
|
||||||
@param BootFirmwareVolumePtr Point to the boot firmware volume.
|
@param FirmwareVolumePtr Point to the firmware volume for finding core image.
|
||||||
@param SecCoreImageBase The base address of the SEC core image.
|
@param FileType The FileType for searching, either SecCore or PeiCore.
|
||||||
@param PeiCoreImageBase The base address of the PEI core image.
|
@param CoreImageBase The base address of the core image.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FindImageBase (
|
FindImageBase (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
|
IN EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumePtr,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *SecCoreImageBase,
|
IN EFI_FV_FILETYPE FileType,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *PeiCoreImageBase
|
OUT EFI_PHYSICAL_ADDRESS *CoreImageBase
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PHYSICAL_ADDRESS CurrentAddress;
|
EFI_PHYSICAL_ADDRESS CurrentAddress;
|
||||||
@ -40,16 +40,15 @@ FindImageBase (
|
|||||||
EFI_COMMON_SECTION_HEADER *Section;
|
EFI_COMMON_SECTION_HEADER *Section;
|
||||||
EFI_PHYSICAL_ADDRESS EndOfSection;
|
EFI_PHYSICAL_ADDRESS EndOfSection;
|
||||||
|
|
||||||
*SecCoreImageBase = 0;
|
*CoreImageBase = 0;
|
||||||
*PeiCoreImageBase = 0;
|
|
||||||
|
|
||||||
CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;
|
CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) FirmwareVolumePtr;
|
||||||
EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;
|
EndOfFirmwareVolume = CurrentAddress + FirmwareVolumePtr->FvLength;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Loop through the FFS files in the Boot Firmware Volume
|
// Loop through the FFS files in the Boot Firmware Volume
|
||||||
//
|
//
|
||||||
for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {
|
for (EndOfFile = CurrentAddress + FirmwareVolumePtr->HeaderLength; ; ) {
|
||||||
|
|
||||||
CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;
|
CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;
|
||||||
if (CurrentAddress > EndOfFirmwareVolume) {
|
if (CurrentAddress > EndOfFirmwareVolume) {
|
||||||
@ -75,10 +74,9 @@ FindImageBase (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Look for SEC Core / PEI Core files
|
// Look for particular Core file (either SEC Core or PEI Core)
|
||||||
//
|
//
|
||||||
if (File->Type != EFI_FV_FILETYPE_SECURITY_CORE &&
|
if (File->Type != FileType) {
|
||||||
File->Type != EFI_FV_FILETYPE_PEI_CORE) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,17 +113,11 @@ FindImageBase (
|
|||||||
// Look for executable sections
|
// Look for executable sections
|
||||||
//
|
//
|
||||||
if (Section->Type == EFI_SECTION_PE32 || Section->Type == EFI_SECTION_TE) {
|
if (Section->Type == EFI_SECTION_PE32 || Section->Type == EFI_SECTION_TE) {
|
||||||
if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) {
|
if (File->Type == FileType) {
|
||||||
if (IS_SECTION2 (Section)) {
|
if (IS_SECTION2 (Section)) {
|
||||||
*SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
|
*CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
|
||||||
} else {
|
} else {
|
||||||
*SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));
|
*CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (IS_SECTION2 (Section)) {
|
|
||||||
*PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
|
|
||||||
} else {
|
|
||||||
*PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -133,9 +125,9 @@ FindImageBase (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Both SEC Core and PEI Core images found
|
// Either SEC Core or PEI Core images found
|
||||||
//
|
//
|
||||||
if (*SecCoreImageBase != 0 && *PeiCoreImageBase != 0) {
|
if (*CoreImageBase != 0) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -147,14 +139,16 @@ FindImageBase (
|
|||||||
It also find SEC and PEI Core file debug information. It will report them if
|
It also find SEC and PEI Core file debug information. It will report them if
|
||||||
remote debug is enabled.
|
remote debug is enabled.
|
||||||
|
|
||||||
@param BootFirmwareVolumePtr Point to the boot firmware volume.
|
@param SecCoreFirmwareVolumePtr Point to the firmware volume for finding SecCore.
|
||||||
|
@param PeiCoreFirmwareVolumePtr Point to the firmware volume for finding PeiCore.
|
||||||
@param PeiCoreEntryPoint The entry point of the PEI core.
|
@param PeiCoreEntryPoint The entry point of the PEI core.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FindAndReportEntryPoints (
|
FindAndReportEntryPoints (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
|
IN EFI_FIRMWARE_VOLUME_HEADER *SecCoreFirmwareVolumePtr,
|
||||||
|
IN EFI_FIRMWARE_VOLUME_HEADER *PeiCoreFirmwareVolumePtr,
|
||||||
OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint
|
OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -164,9 +158,9 @@ FindAndReportEntryPoints (
|
|||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find SEC Core and PEI Core image base
|
// Find SEC Core image base
|
||||||
//
|
//
|
||||||
Status = FindImageBase (BootFirmwareVolumePtr, &SecCoreImageBase, &PeiCoreImageBase);
|
Status = FindImageBase (SecCoreFirmwareVolumePtr, EFI_FV_FILETYPE_SECURITY_CORE, &SecCoreImageBase);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
|
ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
|
||||||
@ -177,6 +171,12 @@ FindAndReportEntryPoints (
|
|||||||
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);
|
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);
|
||||||
PeCoffLoaderRelocateImageExtraAction (&ImageContext);
|
PeCoffLoaderRelocateImageExtraAction (&ImageContext);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find PEI Core image base
|
||||||
|
//
|
||||||
|
Status = FindImageBase (PeiCoreFirmwareVolumePtr, EFI_FV_FILETYPE_PEI_CORE, &PeiCoreImageBase);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Report PEI Core debug information when remote debug is enabled
|
// Report PEI Core debug information when remote debug is enabled
|
||||||
//
|
//
|
||||||
|
@ -248,8 +248,17 @@ SecStartupPhase2(
|
|||||||
for (Index = 0;
|
for (Index = 0;
|
||||||
(PpiList[Index].Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) != EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
|
(PpiList[Index].Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) != EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
|
||||||
Index++) {
|
Index++) {
|
||||||
if (CompareGuid (PpiList[Index].Guid, &gEfiPeiCoreFvLocationPpiGuid) && (((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation != 0)) {
|
if (CompareGuid (PpiList[Index].Guid, &gEfiPeiCoreFvLocationPpiGuid) &&
|
||||||
FindAndReportEntryPoints ((EFI_FIRMWARE_VOLUME_HEADER *) ((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation, &PeiCoreEntryPoint);
|
(((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation != 0)
|
||||||
|
) {
|
||||||
|
//
|
||||||
|
// In this case, SecCore is in BFV but PeiCore is in another FV reported by PPI.
|
||||||
|
//
|
||||||
|
FindAndReportEntryPoints (
|
||||||
|
(EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase,
|
||||||
|
(EFI_FIRMWARE_VOLUME_HEADER *) ((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation,
|
||||||
|
&PeiCoreEntryPoint
|
||||||
|
);
|
||||||
if (PeiCoreEntryPoint != NULL) {
|
if (PeiCoreEntryPoint != NULL) {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
@ -265,7 +274,14 @@ SecStartupPhase2(
|
|||||||
// If EFI_PEI_CORE_FV_LOCATION_PPI not found, try to locate PeiCore from BFV.
|
// If EFI_PEI_CORE_FV_LOCATION_PPI not found, try to locate PeiCore from BFV.
|
||||||
//
|
//
|
||||||
if (PeiCoreEntryPoint == NULL) {
|
if (PeiCoreEntryPoint == NULL) {
|
||||||
FindAndReportEntryPoints ((EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase, &PeiCoreEntryPoint);
|
//
|
||||||
|
// Both SecCore and PeiCore are in BFV.
|
||||||
|
//
|
||||||
|
FindAndReportEntryPoints (
|
||||||
|
(EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase,
|
||||||
|
(EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase,
|
||||||
|
&PeiCoreEntryPoint
|
||||||
|
);
|
||||||
if (PeiCoreEntryPoint == NULL) {
|
if (PeiCoreEntryPoint == NULL) {
|
||||||
CpuDeadLoop ();
|
CpuDeadLoop ();
|
||||||
}
|
}
|
||||||
|
@ -89,14 +89,16 @@ SecStartup (
|
|||||||
It also find SEC and PEI Core file debug information. It will report them if
|
It also find SEC and PEI Core file debug information. It will report them if
|
||||||
remote debug is enabled.
|
remote debug is enabled.
|
||||||
|
|
||||||
@param BootFirmwareVolumePtr Point to the boot firmware volume.
|
@param SecCoreFirmwareVolumePtr Point to the firmware volume for finding SecCore.
|
||||||
@param PeiCoreEntryPoint Point to the PEI core entry point.
|
@param PeiCoreFirmwareVolumePtr Point to the firmware volume for finding PeiCore.
|
||||||
|
@param PeiCoreEntryPoint The entry point of the PEI core.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FindAndReportEntryPoints (
|
FindAndReportEntryPoints (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
|
IN EFI_FIRMWARE_VOLUME_HEADER *SecCoreFirmwareVolumePtr,
|
||||||
|
IN EFI_FIRMWARE_VOLUME_HEADER *PeiCoreFirmwareVolumePtr,
|
||||||
OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint
|
OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user