Last PEIM.\r
Responsibility of this module is to load the DXE Core from a Firmware Volume.\r
\r
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
// If some error occurs here, then we cannot find any firmware\r
// volume that may contain DxeCore.\r
//\r
+ if (EFI_ERROR (Status)) {\r
+ REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_CORE_EC_DXE_CORRUPT));\r
+ }\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
EFI_STATUS Status;\r
UINT8 *DstBuffer;\r
UINT8 *ScratchBuffer;\r
- UINTN DstBufferSize;\r
+ UINT32 DstBufferSize;\r
UINT32 ScratchBufferSize;\r
- EFI_COMMON_SECTION_HEADER *Section;\r
- UINTN SectionLength;\r
+ VOID *CompressionSource;\r
+ UINT32 CompressionSourceSize;\r
+ UINT32 UncompressedLength;\r
+ UINT8 CompressionType;\r
\r
if (CompressionSection->CommonHeader.Type != EFI_SECTION_COMPRESSION) {\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Section = (EFI_COMMON_SECTION_HEADER *) CompressionSection;\r
- SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
+ if (IS_SECTION2 (CompressionSection)) {\r
+ CompressionSource = (VOID *) ((UINT8 *) CompressionSection + sizeof (EFI_COMPRESSION_SECTION2));\r
+ CompressionSourceSize = (UINT32) (SECTION2_SIZE (CompressionSection) - sizeof (EFI_COMPRESSION_SECTION2));\r
+ UncompressedLength = ((EFI_COMPRESSION_SECTION2 *) CompressionSection)->UncompressedLength;\r
+ CompressionType = ((EFI_COMPRESSION_SECTION2 *) CompressionSection)->CompressionType;\r
+ } else {\r
+ CompressionSource = (VOID *) ((UINT8 *) CompressionSection + sizeof (EFI_COMPRESSION_SECTION));\r
+ CompressionSourceSize = (UINT32) (SECTION_SIZE (CompressionSection) - sizeof (EFI_COMPRESSION_SECTION));\r
+ UncompressedLength = CompressionSection->UncompressedLength;\r
+ CompressionType = CompressionSection->CompressionType;\r
+ }\r
\r
//\r
// This is a compression set, expand it\r
//\r
- switch (CompressionSection->CompressionType) {\r
+ switch (CompressionType) {\r
case EFI_STANDARD_COMPRESSION:\r
if (FeaturePcdGet(PcdDxeIplSupportUefiDecompress)) {\r
//\r
// For compressed data, decompress them to destination buffer.\r
//\r
Status = UefiDecompressGetInfo (\r
- (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
- (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),\r
- (UINT32 *) &DstBufferSize,\r
+ CompressionSource,\r
+ CompressionSourceSize,\r
+ &DstBufferSize,\r
&ScratchBufferSize\r
);\r
if (EFI_ERROR (Status)) {\r
// Call decompress function\r
//\r
Status = UefiDecompress (\r
- (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
+ CompressionSource,\r
DstBuffer,\r
ScratchBuffer\r
);\r
//\r
// Allocate destination buffer\r
//\r
- DstBufferSize = CompressionSection->UncompressedLength;\r
+ DstBufferSize = UncompressedLength;\r
DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize) + 1);\r
if (DstBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
//\r
// stream is not actually compressed, just encapsulated. So just copy it.\r
//\r
- CopyMem (DstBuffer, CompressionSection + 1, DstBufferSize);\r
+ CopyMem (DstBuffer, CompressionSource, DstBufferSize);\r
break;\r
\r
default:\r
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) {\r
if (CompareGuid (&gEfiHobMemoryAllocStackGuid, &(Hob.MemoryAllocationStack->AllocDescriptor.Name))) {\r
//\r
- // Build a new memory allocation HOB with old stack info with EfiConventionalMemory type\r
- // to be reclaimed by DXE core.\r
+ // Build a new memory allocation HOB with old stack info with EfiBootServicesData type. Need to \r
+ // avoid this region be reclaimed by DXE core as the IDT built in SEC might be on stack, and some \r
+ // PEIMs may also keep key information on stack\r
//\r
BuildMemoryAllocationHob (\r
Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress,\r
Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength,\r
- EfiConventionalMemory\r
+ EfiBootServicesData\r
);\r
//\r
// Update the BSP Stack Hob to reflect the new stack info.\r