\r
Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, TeData, TeDataSize);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Section data - 0x%x\n",\r
- Status));\r
- return Status;\r
+ Status = FfsFindSectionData (EFI_SECTION_TE, FileHeader, TeData, TeDataSize);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Section data - %r\n",\r
+ Status));\r
+ return Status;\r
+ }\r
}\r
\r
DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", *TeData));\r
STATIC\r
EFI_STATUS\r
GetPeCoffSectionInformation (\r
- IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *TmpContext,\r
- IN OUT UINT32 *SectionHeaderOffset,\r
- IN OUT UINT16 *NumberOfSections\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,\r
+ OUT UINT32 *SectionHeaderOffset,\r
+ OUT UINT16 *NumberOfSections\r
)\r
{\r
RETURN_STATUS Status;\r
UINTN ReadSize;\r
\r
ASSERT (ImageContext != NULL);\r
- ASSERT (TmpContext != NULL);\r
ASSERT (SectionHeaderOffset != NULL);\r
ASSERT (NumberOfSections != NULL);\r
\r
- //\r
- // We need to copy ImageContext since PeCoffLoaderGetImageInfo ()\r
- // will mangle the ImageAddress field\r
- //\r
- CopyMem (TmpContext, ImageContext, sizeof (*TmpContext));\r
-\r
- if (TmpContext->PeCoffHeaderOffset == 0) {\r
- Status = PeCoffLoaderGetImageInfo (TmpContext);\r
- if (RETURN_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR,\r
- "%a: PeCoffLoaderGetImageInfo () failed (Status = %r)\n",\r
- __FUNCTION__, Status));\r
- return Status;\r
- }\r
- }\r
-\r
- if (TmpContext->IsTeImage &&\r
- TmpContext->ImageAddress == ImageContext->ImageAddress) {\r
- DEBUG ((DEBUG_INFO, "%a: ignoring XIP TE image at 0x%lx\n", __FUNCTION__,\r
- ImageContext->ImageAddress));\r
- return RETURN_UNSUPPORTED;\r
+ Status = PeCoffLoaderGetImageInfo (ImageContext);\r
+ if (RETURN_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR,\r
+ "%a: PeCoffLoaderGetImageInfo () failed (Status == %r)\n",\r
+ __FUNCTION__, Status));\r
+ return Status;\r
}\r
\r
- if (TmpContext->SectionAlignment < EFI_PAGE_SIZE) {\r
+ if (ImageContext->SectionAlignment < EFI_PAGE_SIZE) {\r
//\r
// The sections need to be at least 4 KB aligned, since that is the\r
// granularity at which we can tighten permissions.\r
//\r
- if (!TmpContext->IsTeImage) {\r
+ if (!ImageContext->IsTeImage) {\r
DEBUG ((DEBUG_WARN,\r
"%a: non-TE Image at 0x%lx has SectionAlignment < 4 KB (%lu)\n",\r
- __FUNCTION__, ImageContext->ImageAddress, TmpContext->SectionAlignment));\r
+ __FUNCTION__, ImageContext->ImageAddress, ImageContext->SectionAlignment));\r
+ return RETURN_UNSUPPORTED;\r
}\r
- return RETURN_UNSUPPORTED;\r
+ ImageContext->SectionAlignment = EFI_PAGE_SIZE;\r
}\r
\r
//\r
Hdr.Union = &HdrData;\r
Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);\r
ReadSize = Size;\r
- Status = TmpContext->ImageRead (\r
- TmpContext->Handle,\r
- TmpContext->PeCoffHeaderOffset,\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ ImageContext->PeCoffHeaderOffset,\r
&Size,\r
Hdr.Pe32\r
);\r
return Status;\r
}\r
\r
- ASSERT (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE);\r
-\r
- *SectionHeaderOffset = TmpContext->PeCoffHeaderOffset + sizeof (UINT32) +\r
- sizeof (EFI_IMAGE_FILE_HEADER);\r
- *NumberOfSections = Hdr.Pe32->FileHeader.NumberOfSections;\r
-\r
- switch (Hdr.Pe32->OptionalHeader.Magic) {\r
- case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC:\r
- *SectionHeaderOffset += Hdr.Pe32->FileHeader.SizeOfOptionalHeader;\r
- break;\r
- case EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC:\r
- *SectionHeaderOffset += Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader;\r
- break;\r
- default:\r
- ASSERT (FALSE);\r
+ if (!ImageContext->IsTeImage) {\r
+ ASSERT (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE);\r
+\r
+ *SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) +\r
+ sizeof (EFI_IMAGE_FILE_HEADER);\r
+ *NumberOfSections = Hdr.Pe32->FileHeader.NumberOfSections;\r
+\r
+ switch (Hdr.Pe32->OptionalHeader.Magic) {\r
+ case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC:\r
+ *SectionHeaderOffset += Hdr.Pe32->FileHeader.SizeOfOptionalHeader;\r
+ break;\r
+ case EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC:\r
+ *SectionHeaderOffset += Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader;\r
+ break;\r
+ default:\r
+ ASSERT (FALSE);\r
+ }\r
+ } else {\r
+ *SectionHeaderOffset = (UINTN)(sizeof (EFI_TE_IMAGE_HEADER));\r
+ *NumberOfSections = Hdr.Te->NumberOfSections;\r
+ ImageContext->ImageAddress -= (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
}\r
-\r
return RETURN_SUCCESS;\r
}\r
\r
)\r
{\r
EFI_STATUS Status;\r
- PE_COFF_LOADER_IMAGE_CONTEXT TmpContext;\r
\r
// Initialize the Image Context\r
ZeroMem (ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
\r
DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", TeData));\r
\r
- Status = PeCoffLoaderGetImageInfo (ImageContext);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Image information - 0x%x\n", Status));\r
- return Status;\r
- }\r
-\r
- Status = GetPeCoffSectionInformation (ImageContext, &TmpContext, SectionHeaderOffset, NumberOfSections);\r
+ Status = GetPeCoffSectionInformation (ImageContext, SectionHeaderOffset, NumberOfSections);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Section information - 0x%x\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Section information - %r\n", Status));\r
return Status;\r
}\r
\r