Skip to content

Commit

Permalink
UefiCpuPkg/SecCore: Wrong Debug Information for SecCore
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Ray Ni <[email protected]>
Cc: Laszlo Ersek <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Chasel Chiu <[email protected]>
Reviewed-by: Ray Ni <[email protected]>
  • Loading branch information
ChaselChiu committed Feb 20, 2019
1 parent f168816 commit 08283b9
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 36 deletions.
60 changes: 30 additions & 30 deletions UefiCpuPkg/SecCore/FindPeiCore.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/** @file
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
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
Expand All @@ -19,17 +19,17 @@
/**
Find core image base.
@param BootFirmwareVolumePtr Point to the boot firmware volume.
@param SecCoreImageBase The base address of the SEC core image.
@param PeiCoreImageBase The base address of the PEI core image.
@param FirmwareVolumePtr Point to the firmware volume for finding core image.
@param FileType The FileType for searching, either SecCore or PeiCore.
@param CoreImageBase The base address of the core image.
**/
EFI_STATUS
EFIAPI
FindImageBase (
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
OUT EFI_PHYSICAL_ADDRESS *SecCoreImageBase,
OUT EFI_PHYSICAL_ADDRESS *PeiCoreImageBase
IN EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumePtr,
IN EFI_FV_FILETYPE FileType,
OUT EFI_PHYSICAL_ADDRESS *CoreImageBase
)
{
EFI_PHYSICAL_ADDRESS CurrentAddress;
Expand All @@ -40,16 +40,15 @@ FindImageBase (
EFI_COMMON_SECTION_HEADER *Section;
EFI_PHYSICAL_ADDRESS EndOfSection;

*SecCoreImageBase = 0;
*PeiCoreImageBase = 0;
*CoreImageBase = 0;

CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;
EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;
CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) FirmwareVolumePtr;
EndOfFirmwareVolume = CurrentAddress + FirmwareVolumePtr->FvLength;

//
// Loop through the FFS files in the Boot Firmware Volume
//
for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {
for (EndOfFile = CurrentAddress + FirmwareVolumePtr->HeaderLength; ; ) {

CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;
if (CurrentAddress > EndOfFirmwareVolume) {
Expand All @@ -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 &&
File->Type != EFI_FV_FILETYPE_PEI_CORE) {
if (File->Type != FileType) {
continue;
}

Expand Down Expand Up @@ -115,27 +113,21 @@ FindImageBase (
// Look for executable sections
//
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)) {
*SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
*CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));
} else {
*SecCoreImageBase = (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));
*CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));
}
}
break;
}
}

//
// 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;
}
}
Expand All @@ -147,14 +139,16 @@ FindImageBase (
It also find SEC and PEI Core file debug information. It will report them if
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.
**/
VOID
EFIAPI
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
)
{
Expand All @@ -164,9 +158,9 @@ FindAndReportEntryPoints (
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);

ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
Expand All @@ -177,6 +171,12 @@ FindAndReportEntryPoints (
ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);
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
//
Expand Down
22 changes: 19 additions & 3 deletions UefiCpuPkg/SecCore/SecMain.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,17 @@ SecStartupPhase2(
for (Index = 0;
(PpiList[Index].Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) != EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
Index++) {
if (CompareGuid (PpiList[Index].Guid, &gEfiPeiCoreFvLocationPpiGuid) && (((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation != 0)) {
FindAndReportEntryPoints ((EFI_FIRMWARE_VOLUME_HEADER *) ((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation, &PeiCoreEntryPoint);
if (CompareGuid (PpiList[Index].Guid, &gEfiPeiCoreFvLocationPpiGuid) &&
(((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) {
break;
} else {
Expand All @@ -265,7 +274,14 @@ SecStartupPhase2(
// If EFI_PEI_CORE_FV_LOCATION_PPI not found, try to locate PeiCore from BFV.
//
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) {
CpuDeadLoop ();
}
Expand Down
8 changes: 5 additions & 3 deletions UefiCpuPkg/SecCore/SecMain.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,16 @@ SecStartup (
It also find SEC and PEI Core file debug information. It will report them if
remote debug is enabled.
@param BootFirmwareVolumePtr Point to the boot firmware volume.
@param PeiCoreEntryPoint Point to the PEI core entry point.
@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.
**/
VOID
EFIAPI
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
);

Expand Down

0 comments on commit 08283b9

Please sign in to comment.