\r
extern BOOLEAN gInMemory;\r
\r
-/**\r
- Transfers control to a function starting with a new stack.\r
-\r
- Transfers control to the function specified by EntryPoint using the new stack\r
- specified by NewStack and passing in the parameters specified by Context1 and\r
- Context2. Context1 and Context2 are optional and may be NULL. The function\r
- EntryPoint must never return.\r
-\r
- If EntryPoint is NULL, then ASSERT().\r
- If NewStack is NULL, then ASSERT().\r
-\r
- @param EntryPoint A pointer to function to call with the new stack.\r
- @param Context1 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param Context2 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param NewStack A pointer to the new stack to use for the EntryPoint\r
- function.\r
- @param NewBsp A pointer to the new BSP for the EntryPoint on IPF. It's\r
- Reserved on other architectures.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-SwitchIplStacks (\r
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
- IN VOID *Context1, OPTIONAL\r
- IN VOID *Context2, OPTIONAL\r
- IN VOID *NewStack,\r
- IN VOID *NewBsp\r
- );\r
-\r
EFI_STATUS\r
PeiFindFile (\r
IN UINT8 Type,\r
;\r
\r
\r
-EFI_STATUS\r
-CreateArchSpecificHobs (\r
- OUT EFI_PHYSICAL_ADDRESS *BspStore\r
- )\r
-;\r
-\r
EFI_STATUS\r
GetImageReadFunction (\r
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
IN EFI_PEI_HOB_POINTERS HobList\r
);\r
\r
+VOID\r
+HandOffToDxeCore (\r
+ IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint,\r
+ IN EFI_PEI_HOB_POINTERS HobList\r
+ );\r
+\r
EFI_STATUS\r
PeiProcessFile (\r
IN UINT16 SectionType,\r
IN EFI_PEI_SERVICES **PeiServices\r
);\r
\r
-EFI_STATUS\r
-PeiLoadx64File (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader,\r
- IN VOID *Pe32Data,\r
- IN EFI_MEMORY_TYPE MemoryType,\r
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,\r
- OUT UINT64 *ImageSize,\r
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint\r
- )\r
-;\r
-\r
EFI_PHYSICAL_ADDRESS\r
CreateIdentityMappingPageTables (\r
IN UINT32 NumberOfProcessorPhysicalAddressBits\r
<Filename>DxeLoad.c</Filename>\r
<Filename>DxeIpl.h</Filename>\r
<Filename>DxeIpl.dxs</Filename>\r
- <Filename SupArchList="IA32">Ia32/ImageRead.c</Filename>\r
+ <Filename SupArchList="IA32 X64 EBC">Ia32/ImageRead.c</Filename>\r
<Filename SupArchList="IA32">Ia32/DxeLoadFunc.c</Filename>\r
<Filename SupArchList="IA32">Ia32/LongMode.asm</Filename>\r
<Filename ToolChainFamily="GCC" SupArchList="IA32">Ia32/LongMode.S</Filename>\r
<Filename SupArchList="IA32">Ia32/VirtualMemory.c</Filename>\r
<Filename SupArchList="IA32">Ia32/VirtualMemory.h</Filename>\r
- <Filename SupArchList="X64">Ia32/ImageRead.c</Filename>\r
- <Filename SupArchList="X64">Ia32/DxeLoadFunc.c</Filename>\r
+ <Filename SupArchList="X64 EBC">X64/DxeLoadFunc.c</Filename>\r
<Filename SupArchList="IPF">ipf/ImageRead.c</Filename>\r
<Filename SupArchList="IPF">ipf/DxeLoadFunc.c</Filename>\r
- <Filename SupArchList="EBC">Ia32/ImageRead.c</Filename>\r
- <Filename SupArchList="EBC">Ia32/DxeLoadFunc.c</Filename>\r
- <Filename SupArchList="X64 IPF EBC">Non-existing.c</Filename>\r
</SourceFiles>\r
<PackageDependencies>\r
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
<PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
<C_Name>PcdDxeIplSwitchToLongMode</C_Name>\r
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
- <DefaultValue>FALSE</DefaultValue>\r
+ <DefaultValue>TRUE</DefaultValue>\r
<HelpText>If this feature is enabled, then the DXE IPL will load a 64-bit DxeCore.</HelpText>\r
</PcdEntry>\r
+ <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
+ <C_Name>PcdDxeIplBuildShareCodeHobs</C_Name>\r
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+ <DefaultValue>TRUE</DefaultValue>\r
+ <HelpText>If this feature is enabled, DXE IPL will build a series of HOBs to share code with DXE Core.</HelpText>\r
+ </PcdEntry>\r
<PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
<C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
\r
#include "DxeIpl.h"\r
\r
-#ifndef __GNUC__\r
-#pragma warning( disable : 4305 )\r
-#endif\r
-\r
BOOLEAN gInMemory = FALSE;\r
\r
//\r
--*/\r
{\r
EFI_STATUS Status;\r
- EFI_PHYSICAL_ADDRESS TopOfStack;\r
- EFI_PHYSICAL_ADDRESS BaseOfStack;\r
- EFI_PHYSICAL_ADDRESS BspStore;\r
EFI_GUID DxeCoreFileName;\r
EFI_GUID FirmwareFileName;\r
VOID *Pe32Data;\r
EFI_BOOT_MODE BootMode;\r
EFI_PEI_RECOVERY_MODULE_PPI *PeiRecovery;\r
EFI_PEI_S3_RESUME_PPI *S3Resume;\r
- EFI_PHYSICAL_ADDRESS PageTables;\r
\r
// PERF_START (PeiServices, L"DxeIpl", NULL, 0);\r
- TopOfStack = 0;\r
- BaseOfStack = 0;\r
- BspStore = 0;\r
- PageTables = 0;\r
\r
//\r
// if in S3 Resume, restore configure\r
PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();\r
ASSERT (PeiEfiPeiPeCoffLoader != NULL);\r
\r
- //\r
- // Allocate 128KB for the Stack\r
- //\r
- PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);\r
- ASSERT (BaseOfStack != 0);\r
-\r
- //\r
- // Add architecture-specifc HOBs (including the BspStore HOB)\r
- //\r
- Status = CreateArchSpecificHobs (&BspStore);\r
- ASSERT_EFI_ERROR (Status);\r
\r
//\r
// Find the EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE type compressed Firmware Volume file\r
EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT\r
);\r
\r
- DEBUG ((EFI_D_INFO, "DXE Core Entry\n"));\r
- if (FeaturePcdGet(PcdDxeIplSwitchToLongMode)) {\r
- //\r
- // Compute the top of the stack we were allocated, which is used to load X64 dxe core. \r
- // Pre-allocate a 32 bytes which confroms to x64 calling convention.\r
- //\r
- // The first four parameters to a function are passed in rcx, rdx, r8 and r9. \r
- // Any further parameters are pushed on the stack. Furthermore, space (4 * 8bytes) for the \r
- // register parameters is reserved on the stack, in case the called function \r
- // wants to spill them; this is important if the function is variadic. \r
- //\r
- TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - 32;\r
-\r
- //\r
- // X64 Calling Conventions requires that the stack must be aligned to 16 bytes\r
- //\r
- TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, 16);\r
- //\r
- // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA\r
- // memory, it may be corrupted when copying FV to high-end memory \r
- //\r
- LoadGo64Gdt();\r
- //\r
- // Limit to 36 bits of addressing for debug. Should get it from CPU\r
- //\r
- PageTables = CreateIdentityMappingPageTables (36);\r
- //\r
- // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.\r
- // Call x64 drivers passing in single argument, a pointer to the HOBs.\r
- //\r
- ActivateLongMode (\r
- PageTables, \r
- (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw), \r
- TopOfStack,\r
- 0x00000000,\r
- DxeCoreEntryPoint\r
- );\r
- } else {\r
- //\r
- // Add HOB for the EFI Decompress Protocol\r
- //\r
- BuildGuidDataHob (\r
- &gEfiDecompressProtocolGuid,\r
- (VOID *)&gEfiDecompress,\r
- sizeof (gEfiDecompress)\r
- );\r
-\r
- //\r
- // Add HOB for the Tiano Decompress Protocol\r
- //\r
- BuildGuidDataHob (\r
- &gEfiTianoDecompressProtocolGuid,\r
- (VOID *)&gTianoDecompress,\r
- sizeof (gTianoDecompress)\r
- );\r
-\r
- //\r
- // Add HOB for the user customized Decompress Protocol\r
- //\r
- BuildGuidDataHob (\r
- &gEfiCustomizedDecompressProtocolGuid,\r
- (VOID *)&gCustomDecompress,\r
- sizeof (gCustomDecompress)\r
- );\r
+ if (FeaturePcdGet (PcdDxeIplBuildShareCodeHobs)) {\r
+ if (FeaturePcdGet (PcdDxeIplSupportEfiDecompress)) {\r
+ //\r
+ // Add HOB for the EFI Decompress Protocol\r
+ //\r
+ BuildGuidDataHob (\r
+ &gEfiDecompressProtocolGuid,\r
+ (VOID *)&gEfiDecompress,\r
+ sizeof (gEfiDecompress)\r
+ );\r
+ }\r
+ if (FeaturePcdGet (PcdDxeIplSupportTianoDecompress)) {\r
+ //\r
+ // Add HOB for the Tiano Decompress Protocol\r
+ //\r
+ BuildGuidDataHob (\r
+ &gEfiTianoDecompressProtocolGuid,\r
+ (VOID *)&gTianoDecompress,\r
+ sizeof (gTianoDecompress)\r
+ );\r
+ }\r
+ if (FeaturePcdGet (PcdDxeIplSupportCustomDecompress)) {\r
+ //\r
+ // Add HOB for the user customized Decompress Protocol\r
+ //\r
+ BuildGuidDataHob (\r
+ &gEfiCustomizedDecompressProtocolGuid,\r
+ (VOID *)&gCustomDecompress,\r
+ sizeof (gCustomDecompress)\r
+ );\r
+ }\r
\r
//\r
// Add HOB for the PE/COFF Loader Protocol\r
(VOID *)&PeiEfiPeiPeCoffLoader,\r
sizeof (VOID *)\r
);\r
- //\r
- // Compute the top of the stack we were allocated. Pre-allocate a UINTN\r
- // for safety.\r
- //\r
- TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT;\r
- TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
-\r
- SwitchIplStacks (\r
- (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,\r
- HobList.Raw,\r
- NULL,\r
- (VOID *) (UINTN) TopOfStack,\r
- (VOID *) (UINTN) BspStore\r
- );\r
- } \r
+ }\r
+\r
+ DEBUG ((EFI_D_INFO, "DXE Core Entry\n"));\r
+ HandOffToDxeCore (DxeCoreEntryPoint, HobList);\r
//\r
// If we get here, then the DXE Core returned. This is an error\r
// Dxe Core should not return.\r
\r
#include "DxeIpl.h"\r
\r
-EFI_STATUS\r
-CreateArchSpecificHobs (\r
- OUT EFI_PHYSICAL_ADDRESS *BspStore\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Creates architecture-specific HOBs.\r
-\r
- Note: New parameters should NOT be added for any HOBs that are added to this\r
- function. BspStore is a special case because it is required for the\r
- call to SwitchStacks() in DxeLoad().\r
-\r
-Arguments:\r
-\r
- BspStore - The address of the BSP Store for those architectures that need\r
- it. Otherwise 0.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The HOBs were created successfully.\r
-\r
---*/\r
-{\r
- *BspStore = 0;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Transfers control to a function starting with a new stack.\r
-\r
- Transfers control to the function specified by EntryPoint using the new stack\r
- specified by NewStack and passing in the parameters specified by Context1 and\r
- Context2. Context1 and Context2 are optional and may be NULL. The function\r
- EntryPoint must never return.\r
-\r
- If EntryPoint is NULL, then ASSERT().\r
- If NewStack is NULL, then ASSERT().\r
-\r
- @param EntryPoint A pointer to function to call with the new stack.\r
- @param Context1 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param Context2 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param NewStack A pointer to the new stack to use for the EntryPoint\r
- function.\r
- @param NewBsp A pointer to the new BSP for the EntryPoint on IPF. It's\r
- Reserved on other architectures.\r
-\r
-**/\r
VOID\r
-EFIAPI\r
-SwitchIplStacks (\r
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
- IN VOID *Context1, OPTIONAL\r
- IN VOID *Context2, OPTIONAL\r
- IN VOID *NewStack,\r
- IN VOID *NewBsp\r
+HandOffToDxeCore (\r
+ IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint,\r
+ IN EFI_PEI_HOB_POINTERS HobList\r
)\r
{\r
- SwitchStack (EntryPoint, Context1, Context2, NewStack);\r
+ EFI_STATUS Status;\r
+ EFI_PHYSICAL_ADDRESS BaseOfStack;\r
+ EFI_PHYSICAL_ADDRESS TopOfStack;\r
+ EFI_PHYSICAL_ADDRESS PageTables;\r
+\r
+ Status = PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ if (FeaturePcdGet(PcdDxeIplSwitchToLongMode)) {\r
+ //\r
+ // Compute the top of the stack we were allocated, which is used to load X64 dxe core. \r
+ // Pre-allocate a 32 bytes which confroms to x64 calling convention.\r
+ //\r
+ // The first four parameters to a function are passed in rcx, rdx, r8 and r9. \r
+ // Any further parameters are pushed on the stack. Furthermore, space (4 * 8bytes) for the \r
+ // register parameters is reserved on the stack, in case the called function \r
+ // wants to spill them; this is important if the function is variadic. \r
+ //\r
+ TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - 32;\r
+\r
+ //\r
+ // X64 Calling Conventions requires that the stack must be aligned to 16 bytes\r
+ //\r
+ TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, 16);\r
+ //\r
+ // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA\r
+ // memory, it may be corrupted when copying FV to high-end memory \r
+ //\r
+ LoadGo64Gdt();\r
+ //\r
+ // Limit to 36 bits of addressing for debug. Should get it from CPU\r
+ //\r
+ PageTables = CreateIdentityMappingPageTables (36);\r
+ //\r
+ // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.\r
+ // Call x64 drivers passing in single argument, a pointer to the HOBs.\r
+ //\r
+ ActivateLongMode (\r
+ PageTables, \r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw), \r
+ TopOfStack,\r
+ 0x00000000,\r
+ DxeCoreEntryPoint\r
+ );\r
+ } else {\r
+ //\r
+ // Compute the top of the stack we were allocated. Pre-allocate a UINTN\r
+ // for safety.\r
+ //\r
+ TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT;\r
+ TopOfStack = (EFI_PHYSICAL_ADDRESS) (UINTN) ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
+\r
+ SwitchStack (\r
+ (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,\r
+ HobList.Raw,\r
+ NULL,\r
+ (VOID *) (UINTN) TopOfStack\r
+ );\r
+ } \r
}\r
\r
#include "DxeIpl.h"\r
\r
-EFI_STATUS\r
-CreateArchSpecificHobs (\r
- OUT EFI_PHYSICAL_ADDRESS *BspStore\r
+VOID\r
+HandOffToDxeCore (\r
+ IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint,\r
+ IN EFI_PEI_HOB_POINTERS HobList\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Creates architecture-specific HOBs.\r
-\r
- Note: New parameters should NOT be added for any HOBs that are added to this\r
- function. BspStore is a special case because it is required for the\r
- call to SwitchStacks() in DxeLoad().\r
-\r
-Arguments:\r
-\r
- BspStore - The address of the BSP Store for those architectures that need\r
- it. Otherwise 0.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The HOBs were created successfully.\r
-\r
---*/\r
{\r
- EFI_STATUS Status;\r
+ VOID *BaseOfStack;\r
+ VOID *TopOfStack;\r
+ VOID *BspStore;\r
\r
- Status = EFI_SUCCESS;\r
-\r
- ASSERT (NULL != BspStore);\r
+ //\r
+ // Allocate 128KB for the Stack\r
+ //\r
+ BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE));\r
+ ASSERT (BaseOfStack != NULL);\r
\r
//\r
// Allocate 16KB for the BspStore\r
//\r
- Status = PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (BSP_STORE_SIZE), BspStore);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BuildBspStoreHob (\r
- *BspStore,\r
- BSP_STORE_SIZE,\r
- EfiBootServicesData\r
- );\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Transfers control to a function starting with a new stack.\r
-\r
- Transfers control to the function specified by EntryPoint using the new stack\r
- specified by NewStack and passing in the parameters specified by Context1 and\r
- Context2. Context1 and Context2 are optional and may be NULL. The function\r
- EntryPoint must never return.\r
-\r
- If EntryPoint is NULL, then ASSERT().\r
- If NewStack is NULL, then ASSERT().\r
+ BspStore = AllocatePages (EFI_SIZE_TO_PAGES (BSP_STORE_SIZE));\r
+ ASSERT (BspStore != NULL);\r
+ //\r
+ // Build BspStoreHob\r
+ //\r
+ BuildBspStoreHob ((EFI_PHYSICAL_ADDRESS) (UINTN) BspStore, BSP_STORE_SIZE, EfiBootServicesData);\r
\r
- @param EntryPoint A pointer to function to call with the new stack.\r
- @param Context1 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param Context2 A pointer to the context to pass into the EntryPoint\r
- function.\r
- @param NewStack A pointer to the new stack to use for the EntryPoint\r
- function.\r
- @param NewBsp A pointer to the new BSP for the EntryPoint on IPF. It's\r
- Reserved on other architectures.\r
+ //\r
+ // Compute the top of the stack we were allocated. Pre-allocate a UINTN\r
+ // for safety.\r
+ //\r
+ TopOfStack = (VOID *) ((UINTN) BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);\r
+ TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
\r
-**/\r
-VOID\r
-EFIAPI\r
-SwitchIplStacks (\r
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,\r
- IN VOID *Context1, OPTIONAL\r
- IN VOID *Context2, OPTIONAL\r
- IN VOID *NewStack,\r
- IN VOID *NewBsp\r
- )\r
-{\r
AsmSwitchStackAndBackingStore (\r
- EntryPoint,\r
- Context1,\r
- Context2,\r
- NewStack,\r
- NewBsp\r
+ (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,\r
+ HobList.Raw,\r
+ NULL,\r
+ TopOfStack,\r
+ BspStore\r
);\r
}\r
--- /dev/null
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. 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
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+ DxeLoadFunc.c\r
+\r
+Abstract:\r
+\r
+ Ia32-specifc functionality for DxeLoad.\r
+\r
+--*/\r
+\r
+#include "DxeIpl.h"\r
+\r
+VOID\r
+HandOffToDxeCore (\r
+ IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint,\r
+ IN EFI_PEI_HOB_POINTERS HobList\r
+ )\r
+{\r
+ VOID *BaseOfStack;\r
+ VOID *TopOfStack;\r
+\r
+ //\r
+ // Allocate 128KB for the Stack\r
+ //\r
+ BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE));\r
+ ASSERT (BaseOfStack != NULL);\r
+\r
+ //\r
+ // Compute the top of the stack we were allocated. Pre-allocate a UINTN\r
+ // for safety.\r
+ //\r
+ TopOfStack = (VOID *) ((UINTN) BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);\r
+ TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
+\r
+ SwitchStack (\r
+ (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,\r
+ HobList.Raw,\r
+ NULL,\r
+ TopOfStack\r
+ );\r
+}\r
<MaxDatumSize>1</MaxDatumSize>\r
<Value>TRUE</Value>\r
</PcdData>\r
+ <PcdData ItemType="FEATURE_FLAG">\r
+ <C_Name>PcdDxeIplBuildShareCodeHobs</C_Name>\r
+ <Token>0x0001003c</Token>\r
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+ <DatumType>BOOLEAN</DatumType>\r
+ <MaxDatumSize>1</MaxDatumSize>\r
+ <Value>TRUE</Value>\r
+ </PcdData>\r
</PcdBuildDefinition>\r
<ModuleSaBuildOptions>\r
<FvBinding>NULL</FvBinding>\r
<MaxDatumSize>1</MaxDatumSize>\r
<Value>TRUE</Value>\r
</PcdData>\r
+ <PcdData ItemType="FEATURE_FLAG">\r
+ <C_Name>PcdDxeIplBuildShareCodeHobs</C_Name>\r
+ <Token>0x0001003c</Token>\r
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+ <DatumType>BOOLEAN</DatumType>\r
+ <MaxDatumSize>1</MaxDatumSize>\r
+ <Value>TRUE</Value>\r
+ </PcdData>\r
</PcdBuildDefinition>\r
<ModuleSaBuildOptions>\r
<FvBinding>NULL</FvBinding>\r
<MaxDatumSize>1</MaxDatumSize>\r
<Value>TRUE</Value>\r
</PcdData>\r
+ <PcdData ItemType="FEATURE_FLAG">\r
+ <C_Name>PcdDxeIplBuildShareCodeHobs</C_Name>\r
+ <Token>0x0001003c</Token>\r
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+ <DatumType>BOOLEAN</DatumType>\r
+ <MaxDatumSize>1</MaxDatumSize>\r
+ <Value>TRUE</Value>\r
+ </PcdData>\r
</PcdBuildDefinition>\r
<ModuleSaBuildOptions>\r
<FvBinding>NULL</FvBinding>\r
<MaxDatumSize>1</MaxDatumSize>\r
<Value>TRUE</Value>\r
</PcdData>\r
+ <PcdData ItemType="FEATURE_FLAG">\r
+ <C_Name>PcdDxeIplBuildShareCodeHobs</C_Name>\r
+ <Token>0x0001003c</Token>\r
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+ <DatumType>BOOLEAN</DatumType>\r
+ <MaxDatumSize>1</MaxDatumSize>\r
+ <Value>TRUE</Value>\r
+ </PcdData>\r
</PcdBuildDefinition>\r
<ModuleSaBuildOptions>\r
<FvBinding>NULL</FvBinding>\r
<DefaultValue>FALSE</DefaultValue>\r
<HelpText>Whether VGA decoding is enabled on this platform so we should avoid those aliased resources</HelpText>\r
</PcdEntry>\r
- <PcdEntry>\r
+ <PcdEntry SupArchList="IA32">\r
<C_Name>PcdDxeIplSwitchToLongMode</C_Name>\r
<Token>0x0001003b</Token>\r
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
<DatumType>BOOLEAN</DatumType>\r
<ValidUsage>FEATURE_FLAG</ValidUsage>\r
- <DefaultValue>FALSE</DefaultValue>\r
+ <DefaultValue>TRUE</DefaultValue>\r
<HelpText>If this feature is enabled, then the DXE IPL will load a 64-bit DxeCore.</HelpText>\r
</PcdEntry>\r
+ <PcdEntry>\r
+ <C_Name>PcdDxeIplBuildShareCodeHobs</C_Name>\r
+ <Token>0x0001003c</Token>\r
+ <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+ <DatumType>BOOLEAN</DatumType>\r
+ <ValidUsage>FEATURE_FLAG</ValidUsage>\r
+ <DefaultValue>FALSE</DefaultValue>\r
+ <HelpText>If this feature is enabled, DXE IPL will build a series of HOBs to share code with DXE Core.</HelpText>\r
+ </PcdEntry>\r
</PcdDeclarations>\r
</PackageSurfaceArea>
\ No newline at end of file