\r
#include <DxeIpl.h>\r
\r
+#ifndef __GNUC__\r
#pragma warning( disable : 4305 )\r
+#endif\r
\r
BOOLEAN gInMemory = FALSE;\r
\r
&mDxeIplPpi\r
};\r
\r
-static EFI_PEI_PPI_DESCRIPTOR mPpiPeiInMemory = {\r
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
- &gPeiInMemoryGuid,\r
- NULL\r
-};\r
-\r
static EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {\r
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
&gEfiEndOfPeiSignalPpiGuid,\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
- Status = PeiServicesLocatePpi (\r
- &gPeiInMemoryGuid,\r
- 0,\r
- NULL,\r
- NULL\r
- );\r
-\r
- if (EFI_ERROR (Status) && (BootMode != BOOT_ON_S3_RESUME)) { \r
+ if (!gInMemory && (BootMode != BOOT_ON_S3_RESUME)) { \r
//\r
// The DxeIpl has not yet been shadowed\r
//\r
\r
} else {\r
if (BootMode != BOOT_ON_S3_RESUME) {\r
- //\r
- // The DxeIpl has been shadowed\r
- //\r
- gInMemory = TRUE;\r
\r
//\r
// Install LoadFile PPI\r
//\r
// Install DxeIpl PPI\r
//\r
- PeiServicesInstallPpi (&mPpiList);\r
+ Status = PeiServicesInstallPpi (&mPpiList);\r
\r
if (EFI_ERROR (Status)) {\r
return Status;\r
ASSERT (BaseOfStack != 0);\r
\r
//\r
- // Compute the top of the stack we were allocated. Pre-allocate a 32 bytes\r
- // for x64 calling convention.\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
//\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
//\r
// Add architecture-specifc HOBs (including the BspStore HOB)\r
//\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
- // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA \\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
//\r
\r
if (Status == EFI_SUCCESS) {\r
//\r
- // Install PeiInMemory to indicate the Dxeipl is shadowed\r
+ // Set gInMemory global variable to TRUE to indicate the dxeipl is shadowed.\r
//\r
- Status = PeiServicesInstallPpi (&mPpiPeiInMemory);\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
+ *(BOOLEAN *) ((UINTN) &gInMemory + (UINTN) DxeIplEntryPoint - (UINTN) _ModuleEntryPoint) = TRUE;\r
Status = ((EFI_PEIM_ENTRY_POINT) (UINTN) DxeIplEntryPoint) (DxeIplFileHeader, GetPeiServicesTablePointer());\r
}\r
\r
*Pe32Data = SectionData;\r
\r
return EFI_SUCCESS;\r
-}
\ No newline at end of file
+}\r
+\r