**/\r
\r
#include "DxeIpl.h"\r
-#include <Ppi/GuidedSectionExtraction.h>\r
-\r
-\r
-\r
-/**\r
- The ExtractSection() function processes the input section and\r
- returns a pointer to the section contents. If the section being\r
- extracted does not require processing (if the section\r
- GuidedSectionHeader.Attributes has the\r
- EFI_GUIDED_SECTION_PROCESSING_REQUIRED field cleared), then\r
- OutputBuffer is just updated to point to the start of the\r
- section's contents. Otherwise, *Buffer must be allocated\r
- from PEI permanent memory.\r
-\r
- @param This Indicates the\r
- EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI instance.\r
- Buffer containing the input GUIDed section to be\r
- processed. OutputBuffer OutputBuffer is\r
- allocated from PEI permanent memory and contains\r
- the new section stream.\r
- @param InputSection A pointer to the input buffer, which contains\r
- the input section to be processed.\r
- @param OutputBuffer A pointer to a caller-allocated buffer, whose\r
- size is specified by the contents of OutputSize.\r
- @param OutputSize A pointer to a caller-allocated\r
- UINTN in which the size of *OutputBuffer\r
- allocation is stored. If the function\r
- returns anything other than EFI_SUCCESS,\r
- the value of OutputSize is undefined.\r
- @param AuthenticationStatus A pointer to a caller-allocated\r
- UINT32 that indicates the\r
- authentication status of the\r
- output buffer. If the input\r
- section's GuidedSectionHeader.\r
- Attributes field has the\r
- EFI_GUIDED_SECTION_AUTH_STATUS_VALID \r
- bit as clear,\r
- AuthenticationStatus must return\r
- zero. These bits reflect the\r
- status of the extraction\r
- operation. If the function\r
- returns anything other than\r
- EFI_SUCCESS, the value of\r
- AuthenticationStatus is\r
- undefined.\r
- \r
- @retval EFI_SUCCESS The InputSection was\r
- successfully processed and the\r
- section contents were returned.\r
- \r
- @retval EFI_OUT_OF_RESOURCES The system has insufficient\r
- resources to process the request.\r
- \r
- @retval EFI_INVALID_PARAMETER The GUID in InputSection does\r
- not match this instance of the\r
- GUIDed Section Extraction PPI.\r
-\r
-**/\r
-EFI_STATUS\r
-CustomGuidedSectionExtract (\r
- IN CONST EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *This,\r
- IN CONST VOID *InputSection,\r
- OUT VOID **OutputBuffer,\r
- OUT UINTN *OutputSize,\r
- OUT UINT32 *AuthenticationStatus\r
-);\r
-\r
-\r
-/**\r
- Decompresses a section to the output buffer.\r
-\r
- This function lookes up the compression type field in the input section and\r
- applies the appropriate compression algorithm to compress the section to a\r
- callee allocated buffer.\r
- \r
- @param This Points to this instance of the\r
- EFI_PEI_DECOMPRESS_PEI PPI.\r
- @param CompressionSection Points to the compressed section.\r
- @param OutputBuffer Holds the returned pointer to the decompressed\r
- sections.\r
- @param OutputSize Holds the returned size of the decompress\r
- section streams.\r
- \r
- @retval EFI_SUCCESS The section was decompressed successfully.\r
- OutputBuffer contains the resulting data and\r
- OutputSize contains the resulting size.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI \r
-Decompress (\r
- IN CONST EFI_PEI_DECOMPRESS_PPI *This,\r
- IN CONST EFI_COMPRESSION_SECTION *CompressionSection,\r
- OUT VOID **OutputBuffer,\r
- OUT UINTN *OutputSize\r
- );\r
-\r
\r
+//\r
+// This global variable indicates whether this module has been shadowed\r
+// to memory.\r
+//\r
BOOLEAN gInMemory = FALSE;\r
\r
//\r
// Module Globals used in the DXE to PEI handoff\r
// These must be module globals, so the stack can be switched\r
//\r
-STATIC EFI_DXE_IPL_PPI mDxeIplPpi = {\r
+CONST EFI_DXE_IPL_PPI mDxeIplPpi = {\r
DxeLoadCore\r
};\r
\r
-STATIC EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI mCustomGuidedSectionExtractionPpi = {\r
+CONST EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI mCustomGuidedSectionExtractionPpi = {\r
CustomGuidedSectionExtract\r
};\r
\r
-STATIC EFI_PEI_DECOMPRESS_PPI mDecompressPpi = {\r
+CONST EFI_PEI_DECOMPRESS_PPI mDecompressPpi = {\r
Decompress\r
};\r
\r
-STATIC EFI_PEI_PPI_DESCRIPTOR mPpiList[] = {\r
+CONST EFI_PEI_PPI_DESCRIPTOR mPpiList[] = {\r
{\r
EFI_PEI_PPI_DESCRIPTOR_PPI,\r
&gEfiDxeIplPpiGuid,\r
}\r
};\r
\r
-STATIC EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {\r
+CONST EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {\r
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
&gEfiEndOfPeiSignalPpiGuid,\r
NULL\r
UINTN ExtractHandlerNumber;\r
EFI_PEI_PPI_DESCRIPTOR *GuidPpi;\r
\r
- Status = PeiServicesGetBootMode (&BootMode);\r
- ASSERT_EFI_ERROR (Status);\r
+ BootMode = GetBootModeHob ();\r
\r
if (BootMode != BOOT_ON_S3_RESUME) {\r
Status = PeiServicesRegisterForShadow (FfsHandle);\r
// \r
return Status;\r
} else if (Status == EFI_ALREADY_STARTED) {\r
- \r
- gInMemory = TRUE;\r
- \r
+ \r
//\r
// Get custom extract guided section method guid list \r
//\r
// Install custom extraction guid ppi\r
//\r
if (ExtractHandlerNumber > 0) {\r
- GuidPpi = NULL;\r
GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePool (ExtractHandlerNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR));\r
ASSERT (GuidPpi != NULL);\r
while (ExtractHandlerNumber-- > 0) {\r
}\r
\r
/**\r
- Main entry point to last PEIM \r
+ Main entry point to last PEIM. \r
\r
- @param This Entry point for DXE IPL PPI\r
+ @param This Entry point for DXE IPL PPI.\r
@param PeiServices General purpose services available to every PEIM.\r
- @param HobList Address to the Pei HOB list\r
+ @param HobList Address to the Pei HOB list.\r
\r
@return EFI_SUCCESS DXE core was successfully loaded. \r
@return EFI_OUT_OF_RESOURCES There are not enough resources to load DXE core.\r
//\r
// if in S3 Resume, restore configure\r
//\r
- Status = PeiServicesGetBootMode (&BootMode);\r
- ASSERT_EFI_ERROR(Status);\r
+ BootMode = GetBootModeHob ();\r
\r
if (BootMode == BOOT_ON_S3_RESUME) {\r
Status = AcpiS3ResumeOs();\r
Status = DxeIplFindDxeCore (&FileHandle);\r
ASSERT_EFI_ERROR (Status);\r
\r
- CopyMem(&DxeCoreFileName, &(((EFI_FFS_FILE_HEADER*)FileHandle)->Name), sizeof (EFI_GUID));\r
+ CopyGuid(&DxeCoreFileName, &(((EFI_FFS_FILE_HEADER*)FileHandle)->Name));\r
\r
//\r
// Load the DXE Core from a Firmware Volume, may use LoadFile ppi to do this for save code size.\r
//\r
Status = PeiLoadFile (\r
- FileHandle,\r
- &DxeCoreAddress,\r
- &DxeCoreSize,\r
- &DxeCoreEntryPoint\r
- );\r
-\r
+ FileHandle,\r
+ &DxeCoreAddress,\r
+ &DxeCoreSize,\r
+ &DxeCoreEntryPoint\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
BuildModuleHob (\r
&DxeCoreFileName,\r
DxeCoreAddress,\r
- EFI_SIZE_TO_PAGES ((UINT32) DxeCoreSize) * EFI_PAGE_SIZE,\r
+ EFI_SIZE_TO_PAGES ((UINTN) DxeCoreSize) * EFI_PAGE_SIZE,\r
DxeCoreEntryPoint\r
);\r
\r
\r
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION PtrPeImage;\r
PtrPeImage.Pe32 = (EFI_IMAGE_NT_HEADERS32 *) ((UINTN) DxeCoreAddress + ((EFI_IMAGE_DOS_HEADER *) (UINTN) DxeCoreAddress)->e_lfanew);\r
- \r
- if (PtrPeImage.Pe32->FileHeader.Machine != IMAGE_FILE_MACHINE_IA64) {\r
- DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Loading DXE CORE at 0x%10p EntryPoint=0x%10p\n", (VOID *)(UINTN)DxeCoreAddress, (VOID *)(UINTN)DxeCoreEntryPoint));\r
- } else {\r
- //\r
- // For IPF Image, the real entry point should be print.\r
- //\r
- DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Loading DXE CORE at 0x%10p EntryPoint=0x%10p\n", (VOID *)(UINTN)DxeCoreAddress, (VOID *)(UINTN)(*(UINT64 *)(UINTN)DxeCoreEntryPoint)));\r
- }\r
+ \r
+ DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Loading DXE CORE at 0x%10p EntryPoint=0x%10p\n", (VOID *)(UINTN)DxeCoreAddress, FUNCTION_ENTRY_POINT (DxeCoreEntryPoint)));\r
+ \r
\r
DEBUG_CODE_END ();\r
//\r
}\r
\r
\r
-\r
-\r
/**\r
Loads and relocates a PE/COFF image into memory.\r
\r
EFI_STATUS Status;\r
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
VOID *Pe32Data;\r
+\r
//\r
// First try to find the PE32 section in this ffs file.\r
//\r
FileHandle,\r
&Pe32Data\r
);\r
- \r
if (EFI_ERROR (Status)) {\r
//\r
// NO image types we support so exit.\r
ScratchBuffer,\r
AuthenticationStatus\r
);\r
-\r
if (EFI_ERROR (Status)) {\r
//\r
// Decode failed\r
}\r
\r
Section = (EFI_COMMON_SECTION_HEADER *) CompressionSection;\r
- SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
+ SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
\r
//\r
// This is a compression set, expand it\r