summaryrefslogtreecommitdiff
path: root/EdkModulePkg
diff options
context:
space:
mode:
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2006-11-27 10:14:02 +0000
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2006-11-27 10:14:02 +0000
commitabb26634f230fb703906f46e7e7adebc9124214a (patch)
treecf08cb43b6a21d52ed620f47c6157f1436da09f9 /EdkModulePkg
parentad3e8660d37e30ccf2e78aafced1f194e3593a30 (diff)
downloadedk2-platforms-abb26634f230fb703906f46e7e7adebc9124214a.tar.xz
Introduce PcdDxeIplSwitchToLongMode to DxeIplPeim and remove DxeIplX64Peim.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2018 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkModulePkg')
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/DxeIpl.h7
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/DxeIpl.msa51
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/DxeLoad.c469
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c2
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ia32/ImageRead.c2
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.S (renamed from EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.S)0
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.asm (renamed from EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.asm)0
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.c (renamed from EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.c)0
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.h (renamed from EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.h)0
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c2
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Ipf/ImageRead.c2
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/Non-existing.c55
-rw-r--r--EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.dxs29
-rw-r--r--EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.h147
-rw-r--r--EdkModulePkg/Core/DxeIplX64Peim/DxeIplX64.msa152
-rw-r--r--EdkModulePkg/Core/DxeIplX64Peim/DxeLoadX64.c1046
-rw-r--r--EdkModulePkg/Core/DxeIplX64Peim/x64/DxeLoadFunc.c53
-rw-r--r--EdkModulePkg/Core/DxeIplX64Peim/x64/ImageRead.c106
-rw-r--r--EdkModulePkg/EdkModulePkg.fpd268
-rw-r--r--EdkModulePkg/EdkModulePkg.spd10
20 files changed, 488 insertions, 1913 deletions
diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeIpl.h b/EdkModulePkg/Core/DxeIplPeim/DxeIpl.h
index 9e626a7dc7..f8fd8766ab 100644
--- a/EdkModulePkg/Core/DxeIplPeim/DxeIpl.h
+++ b/EdkModulePkg/Core/DxeIplPeim/DxeIpl.h
@@ -23,6 +23,8 @@ Abstract:
#define STACK_SIZE 0x20000
#define BSP_STORE_SIZE 0x4000
+#define GET_OCCUPIED_SIZE(ActualSize, Alignment) ((ActualSize + (Alignment - 1)) & ~(Alignment - 1))
+
extern BOOLEAN gInMemory;
/**
@@ -125,8 +127,9 @@ DxeLoadCore (
EFI_STATUS
PeiProcessFile (
IN UINT16 SectionType,
- IN OUT EFI_FFS_FILE_HEADER **RealFfsFileHeader,
- OUT VOID **Pe32Data
+ IN EFI_FFS_FILE_HEADER *FfsFileHeader,
+ OUT VOID **Pe32Data,
+ IN EFI_PEI_HOB_POINTERS *OrigHob
);
EFI_STATUS
diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeIpl.msa b/EdkModulePkg/Core/DxeIplPeim/DxeIpl.msa
index c3042e1186..31b7b358ee 100644
--- a/EdkModulePkg/Core/DxeIplPeim/DxeIpl.msa
+++ b/EdkModulePkg/Core/DxeIplPeim/DxeIpl.msa
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">
+<?xml version="1.0" encoding="UTF-8"?>
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MsaHeader>
<ModuleName>DxeIpl</ModuleName>
<ModuleType>PEIM</ModuleType>
@@ -8,11 +8,11 @@
<Abstract>Component description file for DxeIpl module</Abstract>
<Description>The responsibility of this module is to load the DXE Core from a Firmware Volume. This implementation i used to load a 32-bit DXE Core.</Description>
<Copyright>Copyright (c) 2006, Intel Corporation</Copyright>
- <License>All rights reserved. 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
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ <License>All rights reserved. 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
+ http://opensource.org/licenses/bsd-license.php
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
</MsaHeader>
@@ -67,6 +67,9 @@
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>MemoryAllocationLib</Keyword>
</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>PcdLib</Keyword>
+ </LibraryClass>
</LibraryClassDefinitions>
<SourceFiles>
<Filename>DxeLoad.c</Filename>
@@ -74,12 +77,17 @@
<Filename>DxeIpl.dxs</Filename>
<Filename SupArchList="IA32">Ia32/ImageRead.c</Filename>
<Filename SupArchList="IA32">Ia32/DxeLoadFunc.c</Filename>
+ <Filename SupArchList="IA32">Ia32/LongMode.asm</Filename>
+ <Filename ToolChainFamily="GCC" SupArchList="IA32">Ia32/LongMode.S</Filename>
+ <Filename SupArchList="IA32">Ia32/VirtualMemory.c</Filename>
+ <Filename SupArchList="IA32">Ia32/VirtualMemory.h</Filename>
<Filename SupArchList="X64">Ia32/ImageRead.c</Filename>
<Filename SupArchList="X64">Ia32/DxeLoadFunc.c</Filename>
<Filename SupArchList="IPF">ipf/ImageRead.c</Filename>
<Filename SupArchList="IPF">ipf/DxeLoadFunc.c</Filename>
<Filename SupArchList="EBC">Ia32/ImageRead.c</Filename>
<Filename SupArchList="EBC">Ia32/DxeLoadFunc.c</Filename>
+ <Filename SupArchList="X64 IPF EBC">Non-existing.c</Filename>
</SourceFiles>
<PackageDependencies>
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
@@ -118,9 +126,6 @@
<Ppi Usage="SOMETIMES_CONSUMED">
<PpiCName>gEfiPeiSecurityPpiGuid</PpiCName>
</Ppi>
- <Ppi Usage="PRIVATE">
- <PpiCName>gPeiInMemoryGuid</PpiCName>
- </Ppi>
</PPIs>
<Guids>
<GuidCNames Usage="SOMETIMES_CONSUMED">
@@ -134,4 +139,30 @@
<ModuleEntryPoint>PeimInitializeDxeIpl</ModuleEntryPoint>
</Extern>
</Externs>
+ <PcdCoded>
+ <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">
+ <C_Name>PcdDxeIplSwitchToLongMode</C_Name>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DefaultValue>FALSE</DefaultValue>
+ <HelpText>If this feature is enabled, then the DXE IPL will load a 64-bit DxeCore.</HelpText>
+ </PcdEntry>
+ <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">
+ <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DefaultValue>TRUE</DefaultValue>
+ <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the EFI Compression algorithm</HelpText>
+ </PcdEntry>
+ <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">
+ <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DefaultValue>TRUE</DefaultValue>
+ <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Tiano Compression algorithm</HelpText>
+ </PcdEntry>
+ <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">
+ <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DefaultValue>TRUE</DefaultValue>
+ <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Custom Compression algorithm</HelpText>
+ </PcdEntry>
+ </PcdCoded>
</ModuleSurfaceArea> \ No newline at end of file
diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c b/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c
index fdd6c24b2e..8c3de0522d 100644
--- a/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c
+++ b/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c
@@ -20,7 +20,11 @@ Abstract:
--*/
-#include <DxeIpl.h>
+#include "DxeIpl.h"
+
+#ifndef __GNUC__
+#pragma warning( disable : 4305 )
+#endif
BOOLEAN gInMemory = FALSE;
@@ -36,22 +40,17 @@ static EFI_PEI_FV_FILE_LOADER_PPI mLoadFilePpi = {
DxeIplLoadFile
};
-static EFI_PEI_PPI_DESCRIPTOR mPpiLoadFile = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+static EFI_PEI_PPI_DESCRIPTOR mPpiList[] = {
+ {
+ EFI_PEI_PPI_DESCRIPTOR_PPI,
&gEfiPeiFvFileLoaderPpiGuid,
&mLoadFilePpi
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiList = {
+ },
+ {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiDxeIplPpiGuid,
&mDxeIplPpi
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiPeiInMemory = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gPeiInMemoryGuid,
- NULL
+ }
};
static EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {
@@ -60,38 +59,21 @@ static EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {
NULL
};
-DECOMPRESS_LIBRARY gEfiDecompress = {
+GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY gEfiDecompress = {
UefiDecompressGetInfo,
UefiDecompress
};
-DECOMPRESS_LIBRARY gTianoDecompress = {
+GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY gTianoDecompress = {
TianoDecompressGetInfo,
TianoDecompress
};
-DECOMPRESS_LIBRARY gCustomDecompress = {
+GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY gCustomDecompress = {
CustomDecompressGetInfo,
CustomDecompress
};
-STATIC
-UINTN
-GetOccupiedSize (
- IN UINTN ActualSize,
- IN UINTN Alignment
- )
-{
- UINTN OccupiedSize;
-
- OccupiedSize = ActualSize;
- while ((OccupiedSize & (Alignment - 1)) != 0) {
- OccupiedSize++;
- }
-
- return OccupiedSize;
-}
-
EFI_STATUS
EFIAPI
PeimInitializeDxeIpl (
@@ -120,17 +102,9 @@ Returns:
EFI_BOOT_MODE BootMode;
Status = PeiServicesGetBootMode (&BootMode);
-
ASSERT_EFI_ERROR (Status);
- Status = PeiServicesLocatePpi (
- &gPeiInMemoryGuid,
- 0,
- NULL,
- NULL
- );
-
- if (EFI_ERROR (Status) && (BootMode != BOOT_ON_S3_RESUME)) {
+ if (!gInMemory && (BootMode != BOOT_ON_S3_RESUME)) {
//
// The DxeIpl has not yet been shadowed
//
@@ -140,38 +114,15 @@ Returns:
// Shadow DxeIpl and then re-run its entry point
//
Status = ShadowDxeIpl (FfsHeader, PeiEfiPeiPeCoffLoader);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
} else {
- if (BootMode != BOOT_ON_S3_RESUME) {
//
- // The DxeIpl has been shadowed
+ // Install FvFileLoader and DxeIpl PPIs.
//
- gInMemory = TRUE;
-
- //
- // Install LoadFile PPI
- //
- Status = PeiServicesInstallPpi (&mPpiLoadFile);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
- //
- // Install DxeIpl PPI
- //
- PeiServicesInstallPpi (&mPpiList);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
+ Status = PeiServicesInstallPpi (mPpiList);
+ ASSERT_EFI_ERROR(Status);
}
-
- return EFI_SUCCESS;
+
+ return Status;
}
EFI_STATUS
@@ -200,12 +151,13 @@ Returns:
--*/
{
EFI_STATUS Status;
- VOID *TopOfStack;
- VOID *BaseOfStack;
+ EFI_PHYSICAL_ADDRESS TopOfStack;
+ EFI_PHYSICAL_ADDRESS BaseOfStack;
EFI_PHYSICAL_ADDRESS BspStore;
EFI_GUID DxeCoreFileName;
EFI_GUID FirmwareFileName;
VOID *Pe32Data;
+ VOID *FvImageData;
EFI_PHYSICAL_ADDRESS DxeCoreAddress;
UINT64 DxeCoreSize;
EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint;
@@ -213,104 +165,32 @@ Returns:
EFI_BOOT_MODE BootMode;
EFI_PEI_RECOVERY_MODULE_PPI *PeiRecovery;
EFI_PEI_S3_RESUME_PPI *S3Resume;
+ EFI_PHYSICAL_ADDRESS PageTables;
// PERF_START (PeiServices, L"DxeIpl", NULL, 0);
- TopOfStack = NULL;
- BaseOfStack = NULL;
+ TopOfStack = 0;
+ BaseOfStack = 0;
BspStore = 0;
- Status = EFI_SUCCESS;
+ PageTables = 0;
//
// if in S3 Resume, restore configure
//
Status = PeiServicesGetBootMode (&BootMode);
+ ASSERT_EFI_ERROR(Status);
- if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) {
+ if (BootMode == BOOT_ON_S3_RESUME) {
Status = PeiServicesLocatePpi (
&gEfiPeiS3ResumePpiGuid,
0,
NULL,
(VOID **)&S3Resume
);
-
ASSERT_EFI_ERROR (Status);
Status = S3Resume->S3RestoreConfig (PeiServices);
-
ASSERT_EFI_ERROR (Status);
- }
-
- Status = EFI_SUCCESS;
-
- //
- // Install the PEI Protocols that are shared between PEI and DXE
- //
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
- ASSERT (PeiEfiPeiPeCoffLoader != NULL);
-
-
- //
- // Allocate 128KB for the Stack
- //
- BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE));
- ASSERT (BaseOfStack != NULL);
-
- //
- // Compute the top of the stack we were allocated. Pre-allocate a UINTN
- // for safety.
- //
- TopOfStack = (VOID *)((UINTN)BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);
- TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
-
- //
- // Add architecture-specifc HOBs (including the BspStore HOB)
- //
- Status = CreateArchSpecificHobs (&BspStore);
-
- ASSERT_EFI_ERROR (Status);
-
- //
- // Add HOB for the EFI Decompress Protocol
- //
- BuildGuidDataHob (
- &gEfiDecompressProtocolGuid,
- (VOID *)&gEfiDecompress,
- sizeof (gEfiDecompress)
- );
-
- //
- // Add HOB for the Tiano Decompress Protocol
- //
- BuildGuidDataHob (
- &gEfiTianoDecompressProtocolGuid,
- (VOID *)&gTianoDecompress,
- sizeof (gTianoDecompress)
- );
-
- //
- // Add HOB for the user customized Decompress Protocol
- //
- BuildGuidDataHob (
- &gEfiCustomizedDecompressProtocolGuid,
- (VOID *)&gCustomDecompress,
- sizeof (gCustomDecompress)
- );
-
- //
- // Add HOB for the PE/COFF Loader Protocol
- //
- BuildGuidDataHob (
- &gEfiPeiPeCoffLoaderGuid,
- (VOID *)&PeiEfiPeiPeCoffLoader,
- sizeof (VOID *)
- );
-
- //
- // See if we are in crisis recovery
- //
- Status = PeiServicesGetBootMode (&BootMode);
-
- if (!EFI_ERROR (Status) && (BootMode == BOOT_IN_RECOVERY_MODE)) {
+ } else if (BootMode == BOOT_IN_RECOVERY_MODE) {
Status = PeiServicesLocatePpi (
&gEfiPeiRecoveryModulePpiGuid,
@@ -318,8 +198,8 @@ Returns:
NULL,
(VOID **)&PeiRecovery
);
-
ASSERT_EFI_ERROR (Status);
+
Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "Load Recovery Capsule Failed.(Status = %r)\n", Status));
@@ -332,19 +212,34 @@ Returns:
}
//
- // Find the EFI_FV_FILETYPE_RAW type compressed Firmware Volume file in FTW spare block
+ // Install the PEI Protocols that are shared between PEI and DXE
+ //
+ PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
+ ASSERT (PeiEfiPeiPeCoffLoader != NULL);
+
+ //
+ // Allocate 128KB for the Stack
+ //
+ PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);
+ ASSERT (BaseOfStack != 0);
+
+ //
+ // Add architecture-specifc HOBs (including the BspStore HOB)
+ //
+ Status = CreateArchSpecificHobs (&BspStore);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Find the EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE type compressed Firmware Volume file
// The file found will be processed by PeiProcessFile: It will first be decompressed to
- // a normal FV, then a corresponding FV type hob will be built which is provided for DXE
- // core to find and dispatch drivers in this FV. Because PeiProcessFile typically checks
- // for EFI_FV_FILETYPE_DXE_CORE type file, in this condition we need not check returned
- // status
+ // a normal FV, then a corresponding FV type hob will be built.
//
Status = PeiFindFile (
- EFI_FV_FILETYPE_RAW,
- EFI_SECTION_PE32,
- &FirmwareFileName,
- &Pe32Data
- );
+ EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
+ EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
+ &FirmwareFileName,
+ &FvImageData
+ );
//
// Find the DXE Core in a Firmware Volume
@@ -355,20 +250,18 @@ Returns:
&DxeCoreFileName,
&Pe32Data
);
-
ASSERT_EFI_ERROR (Status);
//
// Load the DXE Core from a Firmware Volume
//
Status = PeiLoadFile (
- PeiEfiPeiPeCoffLoader,
- Pe32Data,
- &DxeCoreAddress,
- &DxeCoreSize,
- &DxeCoreEntryPoint
- );
-
+ PeiEfiPeiPeCoffLoader,
+ Pe32Data,
+ &DxeCoreAddress,
+ &DxeCoreSize,
+ &DxeCoreEntryPoint
+ );
ASSERT_EFI_ERROR (Status);
//
@@ -377,7 +270,6 @@ Returns:
//
Status = PeiServicesInstallPpi (&mPpiSignal);
-
ASSERT_EFI_ERROR (Status);
//
@@ -399,14 +291,93 @@ Returns:
);
DEBUG ((EFI_D_INFO, "DXE Core Entry\n"));
- SwitchIplStacks (
- (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,
- HobList.Raw,
- NULL,
- TopOfStack,
- (VOID *) (UINTN) BspStore
- );
+ if (FeaturePcdGet(PcdDxeIplSwitchToLongMode)) {
+ //
+ // Compute the top of the stack we were allocated, which is used to load X64 dxe core.
+ // Pre-allocate a 32 bytes which confroms to x64 calling convention.
+ //
+ // The first four parameters to a function are passed in rcx, rdx, r8 and r9.
+ // Any further parameters are pushed on the stack. Furthermore, space (4 * 8bytes) for the
+ // register parameters is reserved on the stack, in case the called function
+ // wants to spill them; this is important if the function is variadic.
+ //
+ TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - 32;
+
+ //
+ // X64 Calling Conventions requires that the stack must be aligned to 16 bytes
+ //
+ TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, 16);
+ //
+ // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA
+ // memory, it may be corrupted when copying FV to high-end memory
+ //
+ LoadGo64Gdt();
+ //
+ // Limit to 36 bits of addressing for debug. Should get it from CPU
+ //
+ PageTables = CreateIdentityMappingPageTables (36);
+ //
+ // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.
+ // Call x64 drivers passing in single argument, a pointer to the HOBs.
+ //
+ ActivateLongMode (
+ PageTables,
+ (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw),
+ TopOfStack,
+ 0x00000000,
+ DxeCoreEntryPoint
+ );
+ } else {
+ //
+ // Add HOB for the EFI Decompress Protocol
+ //
+ BuildGuidDataHob (
+ &gEfiDecompressProtocolGuid,
+ (VOID *)&gEfiDecompress,
+ sizeof (gEfiDecompress)
+ );
+ //
+ // Add HOB for the Tiano Decompress Protocol
+ //
+ BuildGuidDataHob (
+ &gEfiTianoDecompressProtocolGuid,
+ (VOID *)&gTianoDecompress,
+ sizeof (gTianoDecompress)
+ );
+
+ //
+ // Add HOB for the user customized Decompress Protocol
+ //
+ BuildGuidDataHob (
+ &gEfiCustomizedDecompressProtocolGuid,
+ (VOID *)&gCustomDecompress,
+ sizeof (gCustomDecompress)
+ );
+
+ //
+ // Add HOB for the PE/COFF Loader Protocol
+ //
+ BuildGuidDataHob (
+ &gEfiPeiPeCoffLoaderGuid,
+ (VOID *)&PeiEfiPeiPeCoffLoader,
+ sizeof (VOID *)
+ );
+ //
+ // Compute the top of the stack we were allocated. Pre-allocate a UINTN
+ // for safety.
+ //
+ TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT;
+ TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
+
+ SwitchIplStacks (
+ (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,
+ HobList.Raw,
+ NULL,
+ (VOID *) (UINTN) TopOfStack,
+ (VOID *) (UINTN) BspStore
+ );
+ }
//
// If we get here, then the DXE Core returned. This is an error
// Dxe Core should not return.
@@ -462,10 +433,11 @@ Returns:
FwVolHeader = NULL;
FfsFileHeader = NULL;
SectionData = NULL;
+ Status = EFI_SUCCESS;
//
- // Foreach Firmware Volume, look for a specified type
- // of file and break out when one is found
+ // For each Firmware Volume, look for a specified type
+ // of file and break out until no one is found
//
Hob.Raw = GetHobList ();
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw)) != NULL) {
@@ -478,11 +450,14 @@ Returns:
if (!EFI_ERROR (Status)) {
Status = PeiProcessFile (
SectionType,
- &FfsFileHeader,
- Pe32Data
+ FfsFileHeader,
+ Pe32Data,
+ &Hob
);
CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));
- return Status;
+ if (!EFI_ERROR (Status)) {
+ return EFI_SUCCESS;
+ }
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
@@ -608,7 +583,7 @@ Returns:
while ((Section->Type != EFI_SECTION_PE32) && (Section->Type != EFI_SECTION_TE)) {
SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
- OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
+ OccupiedSectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
}
//
@@ -624,14 +599,9 @@ Returns:
if (Status == EFI_SUCCESS) {
//
- // Install PeiInMemory to indicate the Dxeipl is shadowed
+ // Set gInMemory global variable to TRUE to indicate the dxeipl is shadowed.
//
- Status = PeiServicesInstallPpi (&mPpiPeiInMemory);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
+ *(BOOLEAN *) ((UINTN) &gInMemory + (UINTN) DxeIplEntryPoint - (UINTN) _ModuleEntryPoint) = TRUE;
Status = ((EFI_PEIM_ENTRY_POINT) (UINTN) DxeIplEntryPoint) (DxeIplFileHeader, GetPeiServicesTablePointer());
}
@@ -689,8 +659,9 @@ Returns:
//
Status = PeiProcessFile (
EFI_SECTION_PE32,
- &FfsHeader,
- &Pe32Data
+ FfsHeader,
+ &Pe32Data,
+ NULL
);
if (EFI_ERROR (Status)) {
@@ -713,8 +684,9 @@ Returns:
EFI_STATUS
PeiProcessFile (
IN UINT16 SectionType,
- IN OUT EFI_FFS_FILE_HEADER **RealFfsFileHeader,
- OUT VOID **Pe32Data
+ IN EFI_FFS_FILE_HEADER *FfsFileHeader,
+ OUT VOID **Pe32Data,
+ IN EFI_PEI_HOB_POINTERS *OrigHob
)
/*++
@@ -762,9 +734,7 @@ Returns:
EFI_GUID TempGuid;
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
EFI_COMPRESSION_SECTION *CompressionSection;
- EFI_FFS_FILE_HEADER *FfsFileHeader;
-
- FfsFileHeader = *RealFfsFileHeader;
+ UINT32 FvAlignment;
Status = PeiServicesFfsFindSectionData (
EFI_SECTION_COMPRESSION,
@@ -773,7 +743,7 @@ Returns:
);
//
- // Upon finding a DXE Core file, see if there is first a compression section
+ // First process the compression section
//
if (!EFI_ERROR (Status)) {
//
@@ -784,7 +754,7 @@ Returns:
do {
SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
- OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
+ OccupiedSectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
//
// Was the DXE Core file encapsulated in a GUID'd section?
@@ -881,14 +851,24 @@ Returns:
switch (CompressionSection->CompressionType) {
case EFI_STANDARD_COMPRESSION:
- DecompressLibrary = &gTianoDecompress;
+ if (FeaturePcdGet (PcdDxeIplSupportTianoDecompress)) {
+ DecompressLibrary = &gTianoDecompress;
+ } else {
+ ASSERT (FALSE);
+ return EFI_NOT_FOUND;
+ }
break;
case EFI_CUSTOMIZED_COMPRESSION:
//
// Load user customized compression protocol.
//
- DecompressLibrary = &gCustomDecompress;
+ if (FeaturePcdGet (PcdDxeIplSupportCustomDecompress)) {
+ DecompressLibrary = &gCustomDecompress;
+ } else {
+ ASSERT (FALSE);
+ return EFI_NOT_FOUND;
+ }
break;
case EFI_NOT_COMPRESSED:
@@ -939,31 +919,64 @@ Returns:
);
CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;
- if (CmpSection->Type == EFI_SECTION_RAW) {
- //
- // Skip the section header and
- // adjust the pointer alignment to 16
+ if (CmpSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
+ //
+ // Firmware Volume Image in this Section
+ // Skip the section header to get FvHeader
//
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (DstBuffer + 16);
+ FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (CmpSection + 1);
- if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
- FfsFileHeader = NULL;
+ if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
+ //
+ // Adjust Fv Base Address Alignment based on Align Attributes in Fv Header
+ //
+
+ //
+ // When FvImage support Alignment, we need to check whether
+ // its alignment is correct.
+ //
+ if (FvHeader->Attributes | EFI_FVB_ALIGNMENT_CAP) {
+
+ //
+ // Calculate the mini alignment for this FvImage
+ //
+ FvAlignment = 1 << (LowBitSet32 (FvHeader->Attributes >> 16) + 1);
+
+ //
+ // If current FvImage base address doesn't meet the its alignment,
+ // we need to reload this FvImage to another correct memory address.
+ //
+ if (((UINTN) FvHeader % FvAlignment) != 0) {
+ DstBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINTN) FvHeader->FvLength), FvAlignment);
+ if (DstBuffer == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ CopyMem (DstBuffer, FvHeader, (UINTN) FvHeader->FvLength);
+ FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) DstBuffer;
+ }
+ }
+ //
+ // Build new FvHob for new decompressed Fv image.
+ //
BuildFvHob ((EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader, FvHeader->FvLength);
- Status = PeiServicesFfsFindNextFile (
- EFI_FV_FILETYPE_DXE_CORE,
- FvHeader,
- &FfsFileHeader
- );
-
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
+
+ //
+ // Set the original FvHob to unused.
+ //
+ if (OrigHob != NULL) {
+ OrigHob->Header->HobType = EFI_HOB_TYPE_UNUSED;
}
-
+
//
- // Reture the FfsHeader that contain Pe32Data.
+ // when search FvImage Section return true.
//
- *RealFfsFileHeader = FfsFileHeader;
- return PeiProcessFile (SectionType, RealFfsFileHeader, Pe32Data);
+ if (SectionType == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
+ *Pe32Data = (VOID *) FvHeader;
+ return EFI_SUCCESS;
+ } else {
+ return EFI_NOT_FOUND;
+ }
+
}
}
//
@@ -982,10 +995,13 @@ Returns:
return EFI_SUCCESS;
}
- OccupiedCmpSectionLength = GetOccupiedSize (CmpSectionLength, 4);
+ OccupiedCmpSectionLength = GET_OCCUPIED_SIZE (CmpSectionLength, 4);
CmpSection = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);
} while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);
}
+ //
+ // End of the decompression activity
+ //
Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
FileSize = FfsFileHeader->Size[0] & 0xFF;
@@ -993,11 +1009,17 @@ Returns:
FileSize += (FfsFileHeader->Size[2] << 16) & 0xFF0000;
FileSize &= 0x00FFFFFF;
} while (Section->Type != 0 && (UINTN) ((UINT8 *) Section - (UINT8 *) FfsFileHeader) < FileSize);
-
+
//
- // End of the decompression activity
+ // search all sections (compression and non compression) in this FFS, don't
+ // find expected section.
//
+ return EFI_NOT_FOUND;
} else {
+ //
+ // For those FFS that doesn't contain compression section, directly search
+ // PE or TE section in this FFS.
+ //
Status = PeiServicesFfsFindSectionData (
EFI_SECTION_PE32,
@@ -1021,3 +1043,4 @@ Returns:
return EFI_SUCCESS;
}
+
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c b/EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
index 0aa323ec2f..28e980517a 100644
--- a/EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
+++ b/EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
@@ -19,7 +19,7 @@ Abstract:
--*/
-#include <DxeIpl.h>
+#include "DxeIpl.h"
EFI_STATUS
CreateArchSpecificHobs (
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ia32/ImageRead.c b/EdkModulePkg/Core/DxeIplPeim/Ia32/ImageRead.c
index fe07608290..b4bd64067c 100644
--- a/EdkModulePkg/Core/DxeIplPeim/Ia32/ImageRead.c
+++ b/EdkModulePkg/Core/DxeIplPeim/Ia32/ImageRead.c
@@ -17,7 +17,7 @@ Abstract:
--*/
-#include <DxeIpl.h>
+#include "DxeIpl.h"
EFI_STATUS
EFIAPI
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.S b/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.S
index 273b3d5bc2..273b3d5bc2 100644
--- a/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.S
+++ b/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.S
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.asm b/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.asm
index a241273048..a241273048 100644
--- a/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.asm
+++ b/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.asm
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.c b/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.c
index ef9c3b61ae..ef9c3b61ae 100644
--- a/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.c
+++ b/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.c
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.h b/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.h
index ddb504acf7..ddb504acf7 100644
--- a/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.h
+++ b/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.h
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c b/EdkModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
index cdc418f6f3..079ae924da 100644
--- a/EdkModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
+++ b/EdkModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
@@ -19,7 +19,7 @@ Abstract:
--*/
-#include <DxeIpl.h>
+#include "DxeIpl.h"
EFI_STATUS
CreateArchSpecificHobs (
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ipf/ImageRead.c b/EdkModulePkg/Core/DxeIplPeim/Ipf/ImageRead.c
index 16b44b24d8..3131533b2a 100644
--- a/EdkModulePkg/Core/DxeIplPeim/Ipf/ImageRead.c
+++ b/EdkModulePkg/Core/DxeIplPeim/Ipf/ImageRead.c
@@ -17,7 +17,7 @@ Abstract:
--*/
-#include <DxeIpl.h>
+#include "DxeIpl.h"
EFI_STATUS
PeiImageRead (
diff --git a/EdkModulePkg/Core/DxeIplPeim/Non-existing.c b/EdkModulePkg/Core/DxeIplPeim/Non-existing.c
new file mode 100644
index 0000000000..f9f7df769c
--- /dev/null
+++ b/EdkModulePkg/Core/DxeIplPeim/Non-existing.c
@@ -0,0 +1,55 @@
+/** @file
+ Non-existing functions other than Ia32 architecture.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. 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
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ Module Name: Non-existing.c
+
+**/
+
+#include "DxeIpl.h"
+
+EFI_PHYSICAL_ADDRESS
+CreateIdentityMappingPageTables (
+ IN UINT32 NumberOfProcessorPhysicalAddressBits
+ )
+{
+ //
+ // This function cannot work on non-Ia32 architecture.
+ //
+ ASSERT (FALSE);
+ return 0;
+}
+
+VOID
+ActivateLongMode (
+ IN EFI_PHYSICAL_ADDRESS PageTables,
+ IN EFI_PHYSICAL_ADDRESS HobStart,
+ IN EFI_PHYSICAL_ADDRESS Stack,
+ IN EFI_PHYSICAL_ADDRESS CodeEntryPoint1,
+ IN EFI_PHYSICAL_ADDRESS CodeEntryPoint2
+ )
+{
+ //
+ // This function cannot work on non-Ia32 architecture.
+ //
+ ASSERT (FALSE);
+}
+
+VOID
+LoadGo64Gdt(
+ VOID
+ )
+{
+ //
+ // This function cannot work on non-Ia32 architecture.
+ //
+ ASSERT (FALSE);
+}
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.dxs b/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.dxs
deleted file mode 100644
index 6370d86cbf..0000000000
--- a/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.dxs
+++ /dev/null
@@ -1,29 +0,0 @@
-/*++
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- DxeIpl.dxs
-
-Abstract:
-
- Dependency expression file for DXE Initial Program Loader PEIM.
-
---*/
-
-#include <AutoGen.h>
-#include <PeimDepex.h>
-
-DEPENDENCY_START
- EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI_GUID
-DEPENDENCY_END
-
-
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.h b/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.h
deleted file mode 100644
index 5068cb6675..0000000000
--- a/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*++
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- DxeIpl.h
-
-Abstract:
-
---*/
-
-#ifndef __PEI_DXEIPL_H__
-#define __PEI_DXEIPL_H__
-
-#define STACK_SIZE 0x20000
-#define BSP_STORE_SIZE 0x4000
-
-extern BOOLEAN gInMemory;
-
-VOID
-SwitchIplStacks (
- VOID *EntryPoint,
- UINTN Parameter1,
- UINTN Parameter2,
- VOID *NewStack,
- VOID *NewBsp
- )
-;
-
-EFI_STATUS
-PeiFindFile (
- IN UINT8 Type,
- IN UINT16 SectionType,
- OUT EFI_GUID *FileName,
- OUT VOID **Pe32Data
- )
-;
-
-EFI_STATUS
-PeiLoadFile (
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader,
- IN VOID *Pe32Data,
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
- OUT UINT64 *ImageSize,
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint
- )
-;
-
-
-EFI_STATUS
-CreateArchSpecificHobs (
- OUT EFI_PHYSICAL_ADDRESS *BspStore
- )
-;
-
-EFI_STATUS
-GetImageReadFunction (
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
- )
-;
-
-EFI_STATUS
-PeiImageRead (
- IN VOID *FileHandle,
- IN UINTN FileOffset,
- IN OUT UINTN *ReadSize,
- OUT VOID *Buffer
- )
-;
-
-EFI_STATUS
-EFIAPI
-DxeIplLoadFile (
- IN EFI_PEI_FV_FILE_LOADER_PPI *This,
- IN EFI_FFS_FILE_HEADER *FfsHeader,
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
- OUT UINT64 *ImageSize,
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint
- );
-
-EFI_STATUS
-ShadowDxeIpl (
- IN EFI_FFS_FILE_HEADER *DxeIpl,
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader
- );
-
-EFI_STATUS
-EFIAPI
-DxeLoadCore (
- IN EFI_DXE_IPL_PPI *This,
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_HOB_POINTERS HobList
- );
-
-EFI_STATUS
-PeiProcessFile (
- IN UINT16 SectionType,
- IN EFI_FFS_FILE_HEADER *FfsFileHeader,
- OUT VOID **Pe32Data,
- IN EFI_PEI_HOB_POINTERS *OrigHob
- );
-
-EFI_STATUS
-EFIAPI
-PeimInitializeDxeIpl (
- IN EFI_FFS_FILE_HEADER *FfsHeader,
- IN EFI_PEI_SERVICES **PeiServices
- );
-
-EFI_STATUS
-PeiLoadPeImage (
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader,
- IN VOID *Pe32Data,
- IN EFI_MEMORY_TYPE MemoryType,
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
- OUT UINT64 *ImageSize,
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint
- )
-;
-
-EFI_PHYSICAL_ADDRESS
-CreateIdentityMappingPageTables (
- IN UINT32 NumberOfProcessorPhysicalAddressBits
- )
-;
-
-VOID
-ActivateLongMode (
- IN EFI_PHYSICAL_ADDRESS PageTables,
- IN EFI_PHYSICAL_ADDRESS HobStart,
- IN EFI_PHYSICAL_ADDRESS Stack,
- IN EFI_PHYSICAL_ADDRESS CodeEntryPoint1,
- IN EFI_PHYSICAL_ADDRESS CodeEntryPoint2
- );
-
-VOID
-LoadGo64Gdt();
-
-#endif
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeIplX64.msa b/EdkModulePkg/Core/DxeIplX64Peim/DxeIplX64.msa
deleted file mode 100644
index d9fcb9d373..0000000000
--- a/EdkModulePkg/Core/DxeIplX64Peim/DxeIplX64.msa
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <MsaHeader>
- <ModuleName>DxeIplX64</ModuleName>
- <ModuleType>PEIM</ModuleType>
- <GuidValue>0c55bdf7-d71d-4962-8fcb-348773e48929</GuidValue>
- <Version>1.0</Version>
- <Abstract>Component description file for DxeIplX64 module</Abstract>
- <Description>The responsibility of this module is to load the DXE Core from a Firmware Volume. This implementation i used to load a 64-bit DXE Core.</Description>
- <Copyright>Copyright 2006, Intel Corporation</Copyright>
- <License>All rights reserved. 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
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
- <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
- </MsaHeader>
- <ModuleDefinitions>
- <SupportedArchitectures>IA32</SupportedArchitectures>
- <BinaryModule>false</BinaryModule>
- <OutputFileBasename>DxeIplX64</OutputFileBasename>
- </ModuleDefinitions>
- <LibraryClassDefinitions>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>DebugLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>PeimEntryPoint</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>BaseLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>HobLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>PeiServicesLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>ReportStatusCodeLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>CacheMaintenanceLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>EdkPeCoffLoaderLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>UefiDecompressLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>TianoDecompressLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>CustomDecompressLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>PeiServicesTablePointerLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>BaseMemoryLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>MemoryAllocationLib</Keyword>
- </LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">
- <Keyword>PcdLib</Keyword>
- </LibraryClass>
- </LibraryClassDefinitions>
- <SourceFiles>
- <Filename>DxeIpl.dxs</Filename>
- <Filename>DxeIpl.h</Filename>
- <Filename>DxeLoadX64.c</Filename>
- <Filename SupArchList="IA32">x64/ImageRead.c</Filename>
- <Filename SupArchList="IA32">x64/LongMode.asm</Filename>
- <Filename SupArchList="IA32" ToolChainFamily="gcc">x64/LongMode.S</Filename>
- <Filename SupArchList="IA32">x64/DxeLoadFunc.c</Filename>
- <Filename SupArchList="IA32">x64/VirtualMemory.h</Filename>
- <Filename SupArchList="IA32">x64/VirtualMemory.c</Filename>
- </SourceFiles>
- <PackageDependencies>
- <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
- <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>
- </PackageDependencies>
- <Protocols>
- <Protocol Usage="ALWAYS_CONSUMED">
- <ProtocolCName>gEfiDecompressProtocolGuid</ProtocolCName>
- </Protocol>
- <Protocol Usage="ALWAYS_CONSUMED">
- <ProtocolCName>gEfiTianoDecompressProtocolGuid</ProtocolCName>
- </Protocol>
- <Protocol Usage="ALWAYS_CONSUMED">
- <ProtocolCName>gEfiCustomizedDecompressProtocolGuid</ProtocolCName>
- </Protocol>
- </Protocols>
- <PPIs>
- <Ppi Usage="SOMETIMES_PRODUCED">
- <PpiCName>gEfiDxeIplPpiGuid</PpiCName>
- </Ppi>
- <Ppi Usage="SOMETIMES_PRODUCED">
- <PpiCName>gEfiPeiFvFileLoaderPpiGuid</PpiCName>
- </Ppi>
- <Ppi Usage="SOMETIMES_PRODUCED">
- <PpiCName>gEfiEndOfPeiSignalPpiGuid</PpiCName>
- </Ppi>
- <Ppi Usage="SOMETIMES_CONSUMED">
- <PpiCName>gEfiPeiRecoveryModulePpiGuid</PpiCName>
- </Ppi>
- <Ppi Usage="SOMETIMES_CONSUMED">
- <PpiCName>gEfiPeiS3ResumePpiGuid</PpiCName>
- </Ppi>
- <Ppi Usage="SOMETIMES_CONSUMED">
- <PpiCName>gEfiPeiSectionExtractionPpiGuid</PpiCName>
- </Ppi>
- <Ppi Usage="SOMETIMES_CONSUMED">
- <PpiCName>gEfiPeiSecurityPpiGuid</PpiCName>
- </Ppi>
- </PPIs>
- <Guids>
- <GuidCNames Usage="ALWAYS_CONSUMED">
- <GuidCName>gEfiPeiPeCoffLoaderGuid</GuidCName>
- </GuidCNames>
- </Guids>
- <Externs>
- <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
- <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
- <Extern>
- <ModuleEntryPoint>PeimInitializeDxeIpl</ModuleEntryPoint>
- </Extern>
- </Externs>
- <PcdCoded>
- <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">
- <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>
- <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DefaultValue>TRUE</DefaultValue>
- <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the EFI Compression algorithm</HelpText>
- </PcdEntry>
- <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">
- <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>
- <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DefaultValue>TRUE</DefaultValue>
- <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Tiano Compression algorithm</HelpText>
- </PcdEntry>
- <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">
- <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>
- <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DefaultValue>TRUE</DefaultValue>
- <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Custom Compression algorithm</HelpText>
- </PcdEntry>
- </PcdCoded>
-</ModuleSurfaceArea>
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeLoadX64.c b/EdkModulePkg/Core/DxeIplX64Peim/DxeLoadX64.c
deleted file mode 100644
index 57ffb28f4a..0000000000
--- a/EdkModulePkg/Core/DxeIplX64Peim/DxeLoadX64.c
+++ /dev/null
@@ -1,1046 +0,0 @@
-/*++
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- DxeLoad.c
-
-Abstract:
-
- Last PEIM.
- Responsibility of this module is to load the DXE Core from a Firmware Volume.
-
---*/
-
-#include <DxeIpl.h>
-
-#ifndef __GNUC__
-#pragma warning( disable : 4305 )
-#endif
-
-BOOLEAN gInMemory = FALSE;
-
-//
-// Module Globals used in the DXE to PEI handoff
-// These must be module globals, so the stack can be switched
-//
-static EFI_DXE_IPL_PPI mDxeIplPpi = {
- DxeLoadCore
-};
-
-static EFI_PEI_FV_FILE_LOADER_PPI mLoadFilePpi = {
- DxeIplLoadFile
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiLoadFile = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gEfiPeiFvFileLoaderPpiGuid,
- &mLoadFilePpi
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiList = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gEfiDxeIplPpiGuid,
- &mDxeIplPpi
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gEfiEndOfPeiSignalPpiGuid,
- NULL
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY gEfiDecompress = {
- UefiDecompressGetInfo,
- UefiDecompress
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY gTianoDecompress = {
- TianoDecompressGetInfo,
- TianoDecompress
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY gCustomDecompress = {
- CustomDecompressGetInfo,
- CustomDecompress
-};
-
-STATIC
-UINTN
-GetOccupiedSize (
- IN UINTN ActualSize,
- IN UINTN Alignment
- )
-{
- UINTN OccupiedSize;
-
- OccupiedSize = ActualSize;
- while ((OccupiedSize & (Alignment - 1)) != 0) {
- OccupiedSize++;
- }
-
- return OccupiedSize;
-}
-
-EFI_STATUS
-EFIAPI
-PeimInitializeDxeIpl (
- IN EFI_FFS_FILE_HEADER *FfsHeader,
- IN EFI_PEI_SERVICES **PeiServices
- )
-/*++
-
-Routine Description:
-
- Initializes the Dxe Ipl PPI
-
-Arguments:
-
- FfsHeader - Pointer to FFS file header
- PeiServices - General purpose services available to every PEIM.
-
-Returns:
-
- EFI_SUCCESS
-
---*/
-{
- EFI_STATUS Status;
- EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
- EFI_BOOT_MODE BootMode;
-
- Status = PeiServicesGetBootMode (&BootMode);
-
- ASSERT_EFI_ERROR (Status);
-
- if (!gInMemory && (BootMode != BOOT_ON_S3_RESUME)) {
- //
- // The DxeIpl has not yet been shadowed
- //
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
-
- //
- // Shadow DxeIpl and then re-run its entry point
- //
- Status = ShadowDxeIpl (FfsHeader, PeiEfiPeiPeCoffLoader);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- } else {
- if (BootMode != BOOT_ON_S3_RESUME) {
-
- //
- // Install LoadFile PPI
- //
- Status = PeiServicesInstallPpi (&mPpiLoadFile);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
- //
- // Install DxeIpl PPI
- //
- Status = PeiServicesInstallPpi (&mPpiList);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- }
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-DxeLoadCore (
- IN EFI_DXE_IPL_PPI *This,
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_HOB_POINTERS HobList
- )
-/*++
-
-Routine Description:
-
- Main entry point to last PEIM
-
-Arguments:
-
- This - Entry point for DXE IPL PPI
- PeiServices - General purpose services available to every PEIM.
- HobList - Address to the Pei HOB list
-
-Returns:
-
- EFI_SUCCESS - DEX core was successfully loaded.
- EFI_OUT_OF_RESOURCES - There are not enough resources to load DXE core.
-
---*/
-{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS TopOfStack;
- EFI_PHYSICAL_ADDRESS BaseOfStack;
- EFI_PHYSICAL_ADDRESS BspStore;
- EFI_GUID DxeCoreFileName;
- EFI_GUID FirmwareFileName;
- VOID *DxeCorePe32Data;
- VOID *FvImageData;
- EFI_PHYSICAL_ADDRESS DxeCoreAddress;
- UINT64 DxeCoreSize;
- EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint;
- EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
- EFI_BOOT_MODE BootMode;
- EFI_PEI_RECOVERY_MODULE_PPI *PeiRecovery;
- EFI_PEI_S3_RESUME_PPI *S3Resume;
- EFI_PHYSICAL_ADDRESS PageTables;
-
- TopOfStack = 0;
- BaseOfStack = 0;
- BspStore = 0;
- Status = EFI_SUCCESS;
-
- //
- // if in S3 Resume, restore configure
- //
- Status = PeiServicesGetBootMode (&BootMode);
-
- if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) {
- Status = PeiServicesLocatePpi (
- &gEfiPeiS3ResumePpiGuid,
- 0,
- NULL,
- (VOID **)&S3Resume
- );
-
- ASSERT_EFI_ERROR (Status);
-
- Status = S3Resume->S3RestoreConfig (PeiServices);
-
- ASSERT_EFI_ERROR (Status);
- }
-
- Status = EFI_SUCCESS;
-
- //
- // Install the PEI Protocols that are shared between PEI and DXE
- //
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
- ASSERT (PeiEfiPeiPeCoffLoader != NULL);
-
- //
- // Allocate 128KB for the Stack
- //
- PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);
- ASSERT (BaseOfStack != 0);
-
- //
- // Compute the top of the stack we were allocated, which is used to load X64 dxe core.
- // Pre-allocate a 32 bytes which confroms to x64 calling convention.
- //
- // The first four parameters to a function are passed in rcx, rdx, r8 and r9.
- // Any further parameters are pushed on the stack. Furthermore, space (4 * 8bytes) for the
- // register parameters is reserved on the stack, in case the called function
- // wants to spill them; this is important if the function is variadic.
- //
- TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - 32;
-
- //
- // X64 Calling Conventions requires that the stack must be aligned to 16 bytes
- //
- TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, 16);
-
- //
- // Add architecture-specifc HOBs (including the BspStore HOB)
- //
- Status = CreateArchSpecificHobs (&BspStore);
- ASSERT_EFI_ERROR (Status);
-
- //
- // See if we are in crisis recovery
- //
- Status = PeiServicesGetBootMode (&BootMode);
- if (!EFI_ERROR (Status) && (BootMode == BOOT_IN_RECOVERY_MODE)) {
- Status = PeiServicesLocatePpi (
- &gEfiPeiRecoveryModulePpiGuid,
- 0,
- NULL,
- (VOID **)&PeiRecovery
- );
-
- ASSERT_EFI_ERROR (Status);
- Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "Load Recovery Capsule Failed.(Status = %r)\n", Status));
- CpuDeadLoop ();
- }
- }
-
- //
- // Find the EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE type compressed Firmware Volume file
- // The file found will be processed by PeiProcessFile: It will first be decompressed to
- // a normal FV, then a corresponding FV type hob will be built.
- //
- Status = PeiFindFile (
- EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
- EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
- &FirmwareFileName,
- &FvImageData
- );
-
- //
- // Find the DXE Core in a Firmware Volume
- //
- Status = PeiFindFile (
- EFI_FV_FILETYPE_DXE_CORE,
- EFI_SECTION_PE32,
- &DxeCoreFileName,
- &DxeCorePe32Data
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA
- // memory, it may be corrupted when copying FV to high-end memory
- //
- LoadGo64Gdt();
-
- //
- // Limit to 36 bits of addressing for debug. Should get it from CPU
- //
- PageTables = CreateIdentityMappingPageTables (36);
-
-
- //
- // Load the DXE Core from a Firmware Volume
- //
- Status = PeiLoadPeImage (
- PeiEfiPeiPeCoffLoader,
- DxeCorePe32Data,
- EfiBootServicesData,
- &DxeCoreAddress,
- &DxeCoreSize,
- &DxeCoreEntryPoint
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Transfer control to the DXE Core
- // The handoff state is simply a pointer to the HOB list
- //
-
- Status = PeiServicesInstallPpi (&mPpiSignal);
- ASSERT_EFI_ERROR (Status);
-
- //
- //
- // Add HOB for the DXE Core
- //
- BuildModuleHob (
- &DxeCoreFileName,
- DxeCoreAddress,
- DxeCoreSize,
- DxeCoreEntryPoint
- );
-
- //
- // Report Status Code EFI_SW_PEI_PC_HANDOFF_TO_NEXT
- //
- REPORT_STATUS_CODE (
- EFI_PROGRESS_CODE,
- EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT
- );
-
- DEBUG ((EFI_D_INFO, "DXE Core Entry\n"));
- //
- // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.
- // Call x64 drivers passing in single argument, a pointer to the HOBs.
- //
- ActivateLongMode (
- PageTables,
- (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw),
- TopOfStack,
- 0x00000000,
- DxeCoreEntryPoint
- );
-
- //
- // If we get here, then the DXE Core returned. This is an error
- // Dxe Core should not return.
- //
- ASSERT (FALSE);
- CpuDeadLoop ();
-
- return EFI_OUT_OF_RESOURCES;
-}
-
-EFI_STATUS
-PeiFindFile (
- IN UINT8 Type,
- IN UINT16 SectionType,
- OUT EFI_GUID *FileName,
- OUT VOID **Pe32Data
- )
-/*++
-
-Routine Description:
-
- Finds a PE/COFF of a specific Type and SectionType in the Firmware Volumes
- described in the HOB list. Able to search in a compression set in a FFS file.
- But only one level of compression is supported, that is, not able to search
- in a compression set that is within another compression set.
-
-Arguments:
-
- Type - The Type of file to retrieve
-
- SectionType - The type of section to retrieve from a file
-
- FileName - The name of the file found in the Firmware Volume
-
- Pe32Data - Pointer to the beginning of the PE/COFF file found in the Firmware Volume
-
-Returns:
-
- EFI_SUCCESS - The file was found, and the name is returned in FileName, and a pointer to
- the PE/COFF image is returned in Pe32Data
-
- EFI_NOT_FOUND - The file was not found in the Firmware Volumes present in the HOB List
-
---*/
-{
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
- EFI_FFS_FILE_HEADER *FfsFileHeader;
- VOID *SectionData;
- EFI_STATUS Status;
- EFI_PEI_HOB_POINTERS Hob;
-
-
- FwVolHeader = NULL;
- FfsFileHeader = NULL;
- SectionData = NULL;
- Status = EFI_SUCCESS;
-
- //
- // For each Firmware Volume, look for a specified type
- // of file and break out until no one is found
- //
- Hob.Raw = GetHobList ();
- while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw)) != NULL) {
- FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (Hob.FirmwareVolume->BaseAddress);
- Status = PeiServicesFfsFindNextFile (
- Type,
- FwVolHeader,
- &FfsFileHeader
- );
- if (!EFI_ERROR (Status)) {
- Status = PeiProcessFile (
- SectionType,
- FfsFileHeader,
- Pe32Data,
- &Hob
- );
- CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));
- if (!EFI_ERROR (Status)) {
- return EFI_SUCCESS;
- }
- }
- Hob.Raw = GET_NEXT_HOB (Hob);
- }
- return EFI_NOT_FOUND;
-}
-
-EFI_STATUS
-PeiLoadPeImage (
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader,
- IN VOID *Pe32Data,
- IN EFI_MEMORY_TYPE MemoryType,
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
- OUT UINT64 *ImageSize,
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint
- )
-/*++
-
-Routine Description:
-
- Loads and relocates a PE/COFF image into memory.
-
-Arguments:
-
- PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol
-
- Pe32Data - The base address of the PE/COFF file that is to be loaded and relocated
-
- ImageAddress - The base address of the relocated PE/COFF image
-
- ImageSize - The size of the relocated PE/COFF image
-
- EntryPoint - The entry point of the relocated PE/COFF image
-
-Returns:
-
- EFI_SUCCESS - The file was loaded and relocated
- EFI_OUT_OF_RESOURCES - There was not enough memory to load and relocate the PE/COFF file
-
---*/
-{
- EFI_STATUS Status;
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
- EFI_PHYSICAL_ADDRESS MemoryBuffer;
-
- ZeroMem (&ImageContext, sizeof (ImageContext));
- ImageContext.Handle = Pe32Data;
- Status = GetImageReadFunction (&ImageContext);
-
- ASSERT_EFI_ERROR (Status);
-
- Status = PeiEfiPeiPeCoffLoader->GetImageInfo (PeiEfiPeiPeCoffLoader, &ImageContext);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Allocate Memory for the image
- //
- //
- // Allocate Memory for the image
- //
- PeiServicesAllocatePages (MemoryType, EFI_SIZE_TO_PAGES ((UINT32) ImageContext.ImageSize), &MemoryBuffer);
- ImageContext.ImageAddress = MemoryBuffer;
- ASSERT (ImageContext.ImageAddress != 0);
-
- //
- // Load the image to our new buffer
- //
-
- Status = PeiEfiPeiPeCoffLoader->LoadImage (PeiEfiPeiPeCoffLoader, &ImageContext);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Relocate the image in our new buffer
- //
- Status = PeiEfiPeiPeCoffLoader->RelocateImage (PeiEfiPeiPeCoffLoader, &ImageContext);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Flush the instruction cache so the image data is written before we execute it
- //
- InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);
-
- *ImageAddress = ImageContext.ImageAddress;
- *ImageSize = ImageContext.ImageSize;
- *EntryPoint = ImageContext.EntryPoint;
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-ShadowDxeIpl (
- IN EFI_FFS_FILE_HEADER *DxeIplFileHeader,
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader
- )
-/*++
-
-Routine Description:
-
- Shadow the DXE IPL to a different memory location. This occurs after permanent
- memory has been discovered.
-
-Arguments:
-
- DxeIplFileHeader - Pointer to the FFS file header of the DXE IPL driver
-
- PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol
-
-Returns:
-
- EFI_SUCCESS - DXE IPL was successfully shadowed to a different memory location.
-
- EFI_ ERROR - The shadow was unsuccessful.
-
-
---*/
-{
- UINTN SectionLength;
- UINTN OccupiedSectionLength;
- EFI_PHYSICAL_ADDRESS DxeIplAddress;
- UINT64 DxeIplSize;
- EFI_PHYSICAL_ADDRESS DxeIplEntryPoint;
- EFI_STATUS Status;
- EFI_COMMON_SECTION_HEADER *Section;
-
- Section = (EFI_COMMON_SECTION_HEADER *) (DxeIplFileHeader + 1);
-
- while ((Section->Type != EFI_SECTION_PE32) && (Section->Type != EFI_SECTION_TE)) {
- SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
- OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
- Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
- }
-
- //
- // Relocate DxeIpl into memory by using loadfile service
- //
- Status = PeiLoadPeImage (
- PeiEfiPeiPeCoffLoader,
- (VOID *) (Section + 1),
- EfiBootServicesData,
- &DxeIplAddress,
- &DxeIplSize,
- &DxeIplEntryPoint
- );
-
- if (Status == EFI_SUCCESS) {
- //
- // Set gInMemory global variable to TRUE to indicate the dxeipl is shadowed.
- //
- *(BOOLEAN *) ((UINTN) &gInMemory + (UINTN) DxeIplEntryPoint - (UINTN) _ModuleEntryPoint) = TRUE;
- Status = ((EFI_PEIM_ENTRY_POINT) (UINTN) DxeIplEntryPoint) (DxeIplFileHeader, GetPeiServicesTablePointer());
- }
-
- return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DxeIplLoadFile (
- IN EFI_PEI_FV_FILE_LOADER_PPI *This,
- IN EFI_FFS_FILE_HEADER *FfsHeader,
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
- OUT UINT64 *ImageSize,
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint
- )
-/*++
-
-Routine Description:
-
- Given a pointer to an FFS file containing a PE32 image, get the
- information on the PE32 image, and then "load" it so that it
- can be executed.
-
-Arguments:
-
- This - pointer to our file loader protocol
- FfsHeader - pointer to the FFS file header of the FFS file that
- contains the PE32 image we want to load
- ImageAddress - returned address where the PE32 image is loaded
- ImageSize - returned size of the loaded PE32 image
- EntryPoint - entry point to the loaded PE32 image
-
-Returns:
-
- EFI_SUCCESS - The FFS file was successfully loaded.
- EFI_ERROR - Unable to load the FFS file.
-
---*/
-{
- EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
- EFI_STATUS Status;
- VOID *Pe32Data;
-
- Pe32Data = NULL;
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
-
- //
- // Preprocess the FFS file to get a pointer to the PE32 information
- // in the enclosed PE32 image.
- //
- Status = PeiProcessFile (
- EFI_SECTION_PE32,
- FfsHeader,
- &Pe32Data,
- NULL
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Load the PE image from the FFS file
- //
- Status = PeiLoadPeImage (
- PeiEfiPeiPeCoffLoader,
- Pe32Data,
- EfiBootServicesData,
- ImageAddress,
- ImageSize,
- EntryPoint
- );
-
- return Status;
-}
-
-EFI_STATUS
-PeiProcessFile (
- IN UINT16 SectionType,
- IN EFI_FFS_FILE_HEADER *FfsFileHeader,
- OUT VOID **Pe32Data,
- IN EFI_PEI_HOB_POINTERS *OrigHob
- )
-/*++
-
-Routine Description:
-
-Arguments:
-
- SectionType - The type of section in the FFS file to process.
-
- FfsFileHeader - Pointer to the FFS file to process, looking for the
- specified SectionType
-
- Pe32Data - returned pointer to the start of the PE32 image found
- in the FFS file.
-
-Returns:
-
- EFI_SUCCESS - found the PE32 section in the FFS file
-
---*/
-{
- EFI_STATUS Status;
- VOID *SectionData;
- DECOMPRESS_LIBRARY *DecompressLibrary;
- UINT8 *DstBuffer;
- UINT8 *ScratchBuffer;
- UINT32 DstBufferSize;
- UINT32 ScratchBufferSize;
- EFI_COMMON_SECTION_HEADER *CmpSection;
- UINTN CmpSectionLength;
- UINTN OccupiedCmpSectionLength;
- VOID *CmpFileData;
- UINTN CmpFileSize;
- EFI_COMMON_SECTION_HEADER *Section;
- UINTN SectionLength;
- UINTN OccupiedSectionLength;
- UINT64 FileSize;
- EFI_GUID_DEFINED_SECTION *GuidedSectionHeader;
- UINT32 AuthenticationStatus;
- EFI_PEI_SECTION_EXTRACTION_PPI *SectionExtract;
- UINT32 BufferSize;
- UINT8 *Buffer;
- EFI_PEI_SECURITY_PPI *Security;
- BOOLEAN StartCrisisRecovery;
- EFI_GUID TempGuid;
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
- EFI_COMPRESSION_SECTION *CompressionSection;
- UINT32 FvAlignment;
-
- Status = PeiServicesFfsFindSectionData (
- EFI_SECTION_COMPRESSION,
- FfsFileHeader,
- &SectionData
- );
-
- //
- // First process the compression section
- //
- if (!EFI_ERROR (Status)) {
- //
- // Yes, there is a compression section, so extract the contents
- // Decompress the image here
- //
- Section = (EFI_COMMON_SECTION_HEADER *) (UINTN) (VOID *) ((UINT8 *) (FfsFileHeader) + (UINTN) sizeof (EFI_FFS_FILE_HEADER));
-
- do {
- SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
- OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
-
- //
- // Was the DXE Core file encapsulated in a GUID'd section?
- //
- if (Section->Type == EFI_SECTION_GUID_DEFINED) {
- //
- // Locate the GUID'd Section Extractor
- //
- GuidedSectionHeader = (VOID *) (Section + 1);
-
- //
- // This following code constitutes the addition of the security model
- // to the DXE IPL.
- //
- //
- // Set a default authenticatino state
- //
- AuthenticationStatus = 0;
-
- Status = PeiServicesLocatePpi (
- &gEfiPeiSectionExtractionPpiGuid,
- 0,
- NULL,
- (VOID **)&SectionExtract
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Verify Authentication State
- //
- CopyMem (&TempGuid, Section + 1, sizeof (EFI_GUID));
-
- Status = SectionExtract->PeiGetSection (
- GetPeiServicesTablePointer(),
- SectionExtract,
- (EFI_SECTION_TYPE *) &SectionType,
- &TempGuid,
- 0,
- (VOID **) &Buffer,
- &BufferSize,
- &AuthenticationStatus
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // If not ask the Security PPI, if exists, for disposition
- //
- //
- Status = PeiServicesLocatePpi (
- &gEfiPeiSecurityPpiGuid,
- 0,
- NULL,
- (VOID **)&Security
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = Security->AuthenticationState (
- GetPeiServicesTablePointer(),
- (struct _EFI_PEI_SECURITY_PPI *) Security,
- AuthenticationStatus,
- FfsFileHeader,
- &StartCrisisRecovery
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // If there is a security violation, report to caller and have
- // the upper-level logic possible engender a crisis recovery
- //
- if (StartCrisisRecovery) {
- return EFI_SECURITY_VIOLATION;
- }
- }
-
- if (Section->Type == EFI_SECTION_PE32) {
- //
- // This is what we want
- //
- *Pe32Data = (VOID *) (Section + 1);
- return EFI_SUCCESS;
- } else if (Section->Type == EFI_SECTION_COMPRESSION) {
- //
- // This is a compression set, expand it
- //
- CompressionSection = (EFI_COMPRESSION_SECTION *) Section;
-
- switch (CompressionSection->CompressionType) {
- case EFI_STANDARD_COMPRESSION:
- if (FeaturePcdGet (PcdDxeIplSupportTianoDecompress)) {
- DecompressLibrary = &gTianoDecompress;
- } else {
- ASSERT (FALSE);
- return EFI_NOT_FOUND;
- }
- break;
-
- case EFI_CUSTOMIZED_COMPRESSION:
- //
- // Load user customized compression protocol.
- //
- if (FeaturePcdGet (PcdDxeIplSupportCustomDecompress)) {
- DecompressLibrary = &gCustomDecompress;
- } else {
- ASSERT (FALSE);
- return EFI_NOT_FOUND;
- }
- break;
-
- case EFI_NOT_COMPRESSED:
- default:
- //
- // Need to support not compressed file
- //
- ASSERT_EFI_ERROR (Status);
- return EFI_NOT_FOUND;
- }
-
- Status = DecompressLibrary->GetInfo (
- (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
- (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),
- &DstBufferSize,
- &ScratchBufferSize
- );
- if (EFI_ERROR (Status)) {
- //
- // GetInfo failed
- //
- return EFI_NOT_FOUND;
- }
-
- //
- // Allocate scratch buffer
- //
- ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));
- if (ScratchBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Allocate destination buffer
- //
- DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));
- if (DstBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Call decompress function
- //
- Status = DecompressLibrary->Decompress (
- (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
- DstBuffer,
- ScratchBuffer
- );
-
- CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;
- if (CmpSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
- //
- // Firmware Volume Image in this Section
- // Skip the section header to get FvHeader
- //
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (CmpSection + 1);
-
- if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
- //
- // Adjust Fv Base Address Alignment based on Align Attributes in Fv Header
- //
-
- //
- // When FvImage support Alignment, we need to check whether
- // its alignment is correct.
- //
- if (FvHeader->Attributes | EFI_FVB_ALIGNMENT_CAP) {
-
- //
- // Calculate the mini alignment for this FvImage
- //
- FvAlignment = 1 << (LowBitSet32 (FvHeader->Attributes >> 16) + 1);
-
- //
- // If current FvImage base address doesn't meet the its alignment,
- // we need to reload this FvImage to another correct memory address.
- //
- if (((UINTN) FvHeader % FvAlignment) != 0) {
- DstBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINTN) FvHeader->FvLength), FvAlignment);
- if (DstBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (DstBuffer, FvHeader, (UINTN) FvHeader->FvLength);
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) DstBuffer;
- }
- }
- //
- // Build new FvHob for new decompressed Fv image.
- //
- BuildFvHob ((EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader, FvHeader->FvLength);
-
- //
- // Set the original FvHob to unused.
- //
- if (OrigHob != NULL) {
- OrigHob->Header->HobType = EFI_HOB_TYPE_UNUSED;
- }
-
- //
- // when search FvImage Section return true.
- //
- if (SectionType == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
- *Pe32Data = (VOID *) FvHeader;
- return EFI_SUCCESS;
- } else {
- return EFI_NOT_FOUND;
- }
-
- }
- }
- //
- // Decompress successfully.
- // Loop the decompressed data searching for expected section.
- //
- CmpFileData = (VOID *) DstBuffer;
- CmpFileSize = DstBufferSize;
- do {
- CmpSectionLength = *(UINT32 *) (CmpSection->Size) & 0x00ffffff;
- if (CmpSection->Type == EFI_SECTION_PE32) {
- //
- // This is what we want
- //
- *Pe32Data = (VOID *) (CmpSection + 1);
- return EFI_SUCCESS;
- }
-
- OccupiedCmpSectionLength = GetOccupiedSize (CmpSectionLength, 4);
- CmpSection = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);
- } while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);
- }
- //
- // End of the decompression activity
- //
-
- Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
- FileSize = FfsFileHeader->Size[0] & 0xFF;
- FileSize += (FfsFileHeader->Size[1] << 8) & 0xFF00;
- FileSize += (FfsFileHeader->Size[2] << 16) & 0xFF0000;
- FileSize &= 0x00FFFFFF;
- } while (Section->Type != 0 && (UINTN) ((UINT8 *) Section - (UINT8 *) FfsFileHeader) < FileSize);
-
- //
- // search all sections (compression and non compression) in this FFS, don't
- // find expected section.
- //
- return EFI_NOT_FOUND;
- } else {
- //
- // For those FFS that doesn't contain compression section, directly search
- // PE or TE section in this FFS.
- //
-
- Status = PeiServicesFfsFindSectionData (
- EFI_SECTION_PE32,
- FfsFileHeader,
- &SectionData
- );
-
- if (EFI_ERROR (Status)) {
- Status = PeiServicesFfsFindSectionData (
- EFI_SECTION_TE,
- FfsFileHeader,
- &SectionData
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
- }
-
- *Pe32Data = SectionData;
-
- return EFI_SUCCESS;
-}
-
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/DxeLoadFunc.c b/EdkModulePkg/Core/DxeIplX64Peim/x64/DxeLoadFunc.c
deleted file mode 100644
index c93c7e1747..0000000000
--- a/EdkModulePkg/Core/DxeIplX64Peim/x64/DxeLoadFunc.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/*++
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- DxeLoadFunc.c
-
-Abstract:
-
- Ia32-specifc functionality for DxeLoad X64 Lakeport.
-
---*/
-
-#include <DxeIpl.h>
-
-EFI_STATUS
-CreateArchSpecificHobs (
- OUT EFI_PHYSICAL_ADDRESS *BspStore
- )
-/*++
-
-Routine Description:
-
- Creates architecture-specific HOBs.
-
- Note: New parameters should NOT be added for any HOBs that are added to this
- function. BspStore is a special case because it is required for the
- call to SwitchStacks() in DxeLoad().
-
-Arguments:
-
- PeiServices - General purpose services available to every PEIM.
- BspStore - The address of the BSP Store for those architectures that need
- it. Otherwise 0.
-
-Returns:
-
- EFI_SUCCESS - The HOBs were created successfully.
-
---*/
-{
- *BspStore = 0;
-
- return EFI_SUCCESS;
-}
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/ImageRead.c b/EdkModulePkg/Core/DxeIplX64Peim/x64/ImageRead.c
deleted file mode 100644
index dd977f2d2e..0000000000
--- a/EdkModulePkg/Core/DxeIplX64Peim/x64/ImageRead.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*++
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- ImageRead.c
-
-Abstract:
-
---*/
-
-#include <DxeIpl.h>
-
-EFI_STATUS
-EFIAPI
-PeiImageRead (
- IN VOID *FileHandle,
- IN UINTN FileOffset,
- IN OUT UINTN *ReadSize,
- OUT VOID *Buffer
- )
-/*++
-
-Routine Description:
-
- Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file
-
-Arguments:
-
- FileHandle - The handle to the PE/COFF file
-
- FileOffset - The offset, in bytes, into the file to read
-
- ReadSize - The number of bytes to read from the file starting at FileOffset
-
- Buffer - A pointer to the buffer to read the data into.
-
-Returns:
-
- EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset
-
---*/
-{
- CHAR8 *Destination8;
- CHAR8 *Source8;
- UINTN Length;
-
- Destination8 = Buffer;
- Source8 = (CHAR8 *) ((UINTN) FileHandle + FileOffset);
- Length = *ReadSize;
- while (Length--) {
- *(Destination8++) = *(Source8++);
- }
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-GetImageReadFunction (
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
- )
-/*++
-
-Routine Description:
-
- Support routine to return the PE32 Image Reader.
- If the PeiImageRead() function is less than a page
- in legnth. If the function is more than a page the DXE IPL will crash!!!!
-
-Arguments:
- ImageContext - The context of the image being loaded
-
-Returns:
-
- EFI_SUCCESS - If Image function location is found
-
---*/
-{
- VOID *MemoryBuffer;
-
- if (gInMemory) {
- ImageContext->ImageRead = PeiImageRead;
- return EFI_SUCCESS;
- }
-
- //
- // BugBug; This code assumes PeiImageRead() is less than a page in size!
- // Allocate a page so we can shaddow the read function from FLASH into
- // memory to increase performance.
- //
-
- MemoryBuffer = AllocateCopyPool (0x400, (VOID *)(UINTN) PeiImageRead);
- ASSERT (MemoryBuffer != NULL);
-
- ImageContext->ImageRead = (PE_COFF_LOADER_READ_FILE) (UINTN) MemoryBuffer;
-
- return EFI_SUCCESS;
-}
diff --git a/EdkModulePkg/EdkModulePkg.fpd b/EdkModulePkg/EdkModulePkg.fpd
index 5b11165607..47b9a7fd35 100644
--- a/EdkModulePkg/EdkModulePkg.fpd
+++ b/EdkModulePkg/EdkModulePkg.fpd
@@ -986,6 +986,38 @@
<MaxDatumSize>4</MaxDatumSize>
<Value>10000000</Value>
</PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSwitchToLongMode</C_Name>
+ <Token>0x0001003b</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>FALSE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>
+ <Token>0x00010034</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>
+ <Token>0x00010035</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>
+ <Token>0x00010036</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
</PcdBuildDefinition>
<ModuleSaBuildOptions>
<FvBinding>NULL</FvBinding>
@@ -6620,6 +6652,38 @@
<MaxDatumSize>4</MaxDatumSize>
<Value>10000000</Value>
</PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSwitchToLongMode</C_Name>
+ <Token>0x0001003b</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>FALSE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>
+ <Token>0x00010034</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>
+ <Token>0x00010035</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>
+ <Token>0x00010036</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
</PcdBuildDefinition>
<ModuleSaBuildOptions>
<FvBinding>NULL</FvBinding>
@@ -11035,6 +11099,38 @@
<MaxDatumSize>4</MaxDatumSize>
<Value>10000000</Value>
</PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSwitchToLongMode</C_Name>
+ <Token>0x0001003b</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>FALSE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>
+ <Token>0x00010034</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>
+ <Token>0x00010035</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>
+ <Token>0x00010036</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
</PcdBuildDefinition>
<ModuleSaBuildOptions>
<FvBinding>NULL</FvBinding>
@@ -15454,6 +15550,38 @@
<MaxDatumSize>4</MaxDatumSize>
<Value>10000000</Value>
</PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSwitchToLongMode</C_Name>
+ <Token>0x0001003b</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>FALSE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>
+ <Token>0x00010034</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>
+ <Token>0x00010035</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
+ <PcdData ItemType="FEATURE_FLAG">
+ <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>
+ <Token>0x00010036</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <MaxDatumSize>1</MaxDatumSize>
+ <Value>TRUE</Value>
+ </PcdData>
</PcdBuildDefinition>
<ModuleSaBuildOptions>
<FvBinding>NULL</FvBinding>
@@ -19420,146 +19548,6 @@
</ModuleSaBuildOptions>
</ModuleSA>
<!--Mod: DxeIplX64 Type: PEIM Path: EdkModulePkg\Core\DxeIplX64Peim\DxeIplX64.msa-->
- <ModuleSA ModuleGuid="0c55bdf7-d71d-4962-8fcb-348773e48929" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3" SupArchList="IA32">
- <Libraries>
- <!--Pkg: EdkModulePkg Mod: BaseCustomDecompressLibNull Path: EdkModulePkg\Library\BaseCustomDecompressLibNull\BaseCustomDecompressLibNull.msa-->
- <Instance ModuleGuid="e5566134-c75e-4ace-bad1-e23a3b335e30" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3"/>
- <!--Pkg: EdkModulePkg Mod: BaseUefiTianoDecompressLib Path: EdkModulePkg\Library\BaseUefiTianoDecompressLib\BaseUefiTianoDecompressLib.msa-->
- <Instance ModuleGuid="d774c4d9-c121-4da3-a5e2-0f317e3c630c" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiMemoryAllocationLib Path: MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLib.msa-->
- <Instance ModuleGuid="b694e0dc-cd4e-4b30-885b-9c164ed3e74a" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiDxeDebugLibReportStatusCode Path: MdePkg\Library\PeiDxeDebugLibReportStatusCode\PeiDxeDebugLibReportStatusCode.msa-->
- <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiPcdLib Path: MdePkg\Library\PeiPcdLib\PeiPcdLib.msa-->
- <Instance ModuleGuid="9dbf6f25-0da2-4a1d-8e12-e78de6ab4d0e" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: EdkModulePkg Mod: EdkPeCoffLoaderLib Path: EdkModulePkg\Library\EdkPeCoffLoaderLib\EdkPeCoffLoaderLib.msa-->
- <Instance ModuleGuid="858bbbc9-474f-4556-a361-0ae52a44ffa5" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: BasePeCoffLib Path: MdePkg\Library\BasePeCoffLib\BasePeCoffLib.msa-->
- <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiHobLib Path: MdePkg\Library\PeiHobLib\PeiHobLib.msa-->
- <Instance ModuleGuid="9643128f-ac24-4b3e-b6be-d8849a306153" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiMemoryLib Path: MdePkg\Library\PeiMemoryLib\PeiMemoryLib.msa-->
- <Instance ModuleGuid="3a9759d2-53bc-4eb2-abcd-c93099419063" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiReportStatusCodeLib Path: MdePkg\Library\PeiReportStatusCodeLib\PeiReportStatusCodeLib.msa-->
- <Instance ModuleGuid="8c690838-7a22-45c4-aa58-a33e3e515cd4" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiIoLibCpuIo Path: MdePkg\Library\PeiIoLibCpuIo\PeiIoLibCpuIo.msa-->
- <Instance ModuleGuid="b2585b69-fb63-4220-844a-8fbea8bf01af" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiServicesTablePointerLibMm7 Path: MdePkg\Library\PeiServicesTablePointerLibMm7\PeiServicesTablePointerLibMm7.msa-->
- <Instance ModuleGuid="e6e9c1f8-2c8a-4f4b-a27c-c382e4bb8e67" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: BaseLib Path: MdePkg\Library\BaseLib\BaseLib.msa-->
- <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeiServicesLib Path: MdePkg\Library\PeiServicesLib\PeiServicesLib.msa-->
- <Instance ModuleGuid="a804239b-4155-446f-acc8-f0825d74908c" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: BaseTimerLibLocalApic Path: MdePkg\Library\BaseTimerLibLocalApic\BaseTimerLibLocalApic.msa-->
- <Instance ModuleGuid="b5a05743-9b71-489b-a0ed-a0eb3950d23b" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: PeimEntryPoint Path: MdePkg\Library\PeimEntryPoint\PeimEntryPoint.msa-->
- <Instance ModuleGuid="fa177ff7-1fc7-458d-a358-d9d62ae61cec" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- <!--Pkg: MdePkg Mod: BaseCacheMaintenanceLib Path: MdePkg\Library\BaseCacheMaintenanceLib\BaseCacheMaintenanceLib.msa-->
- <Instance ModuleGuid="123dd843-57c9-4158-8418-ce68b3944ce7" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>
- </Libraries>
- <PcdBuildDefinition>
- <PcdData ItemType="FEATURE_FLAG">
- <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>
- <Token>0x00010034</Token>
- <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>BOOLEAN</DatumType>
- <MaxDatumSize>1</MaxDatumSize>
- <Value>TRUE</Value>
- </PcdData>
- <PcdData ItemType="FEATURE_FLAG">
- <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>
- <Token>0x00010035</Token>
- <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>BOOLEAN</DatumType>
- <MaxDatumSize>1</MaxDatumSize>
- <Value>TRUE</Value>
- </PcdData>
- <PcdData ItemType="FEATURE_FLAG">
- <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>
- <Token>0x00010036</Token>
- <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>BOOLEAN</DatumType>
- <MaxDatumSize>1</MaxDatumSize>
- <Value>TRUE</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdDebugPropertyMask</C_Name>
- <Token>0x00000005</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT8</DatumType>
- <MaxDatumSize>1</MaxDatumSize>
- <Value>0x0f</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdDebugClearMemoryValue</C_Name>
- <Token>0x00000008</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT8</DatumType>
- <MaxDatumSize>1</MaxDatumSize>
- <Value>0xAF</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdDebugPrintErrorLevel</C_Name>
- <Token>0x00000006</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT32</DatumType>
- <MaxDatumSize>4</MaxDatumSize>
- <Value>0x80000000</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdReportStatusCodePropertyMask</C_Name>
- <Token>0x00000007</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT8</DatumType>
- <MaxDatumSize>1</MaxDatumSize>
- <Value>0x06</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdMaximumUnicodeStringLength</C_Name>
- <Token>0x00000001</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT32</DatumType>
- <MaxDatumSize>4</MaxDatumSize>
- <Value>1000000</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdMaximumAsciiStringLength</C_Name>
- <Token>0x00000002</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT32</DatumType>
- <MaxDatumSize>4</MaxDatumSize>
- <Value>1000000</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdMaximumLinkedListLength</C_Name>
- <Token>0x00000003</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT32</DatumType>
- <MaxDatumSize>4</MaxDatumSize>
- <Value>1000000</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdSpinLockTimeout</C_Name>
- <Token>0x00000004</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT32</DatumType>
- <MaxDatumSize>4</MaxDatumSize>
- <Value>10000000</Value>
- </PcdData>
- <PcdData ItemType="FIXED_AT_BUILD">
- <C_Name>PcdFSBClock</C_Name>
- <Token>0x0000000c</Token>
- <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
- <DatumType>UINT32</DatumType>
- <MaxDatumSize>4</MaxDatumSize>
- <Value>200000000</Value>
- </PcdData>
- </PcdBuildDefinition>
- <ModuleSaBuildOptions>
- <FvBinding>NULL</FvBinding>
- <FfsFormatKey>PE32_PEIM</FfsFormatKey>
- </ModuleSaBuildOptions>
- </ModuleSA>
</FrameworkModules>
<DynamicPcdBuildDefinitions>
<PcdBuildData ItemType="DYNAMIC">
diff --git a/EdkModulePkg/EdkModulePkg.spd b/EdkModulePkg/EdkModulePkg.spd
index 5b473f7b59..9e083f93b1 100644
--- a/EdkModulePkg/EdkModulePkg.spd
+++ b/EdkModulePkg/EdkModulePkg.spd
@@ -379,7 +379,6 @@
<Filename>Bus/Usb/UsbMouse/Dxe/UsbMouse.msa</Filename>
<Filename>Core/Dxe/DxeMain.msa</Filename>
<Filename>Core/DxeIplPeim/DxeIpl.msa</Filename>
- <Filename>Core/DxeIplX64Peim/DxeIplX64.msa</Filename>
<Filename>Core/Pei/PeiMain.msa</Filename>
<Filename>Library/BaseCustomDecompressLibNull/BaseCustomDecompressLibNull.msa</Filename>
<Filename>Library/BaseUefiTianoDecompressLib/BaseUefiTianoDecompressLib.msa</Filename>
@@ -1248,5 +1247,14 @@
<DefaultValue>FALSE</DefaultValue>
<HelpText>Whether VGA decoding is enabled on this platform so we should avoid those aliased resources</HelpText>
</PcdEntry>
+ <PcdEntry>
+ <C_Name>PcdDxeIplSwitchToLongMode</C_Name>
+ <Token>0x0001003b</Token>
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
+ <DatumType>BOOLEAN</DatumType>
+ <ValidUsage>FEATURE_FLAG</ValidUsage>
+ <DefaultValue>FALSE</DefaultValue>
+ <HelpText>If this feature is enabled, then the DXE IPL will load a 64-bit DxeCore.</HelpText>
+ </PcdEntry>
</PcdDeclarations>
</PackageSurfaceArea> \ No newline at end of file