ASSERT (BaseOfStack != 0);\r
\r
//\r
- // Compute the top of the stack we were allocated. Pre-allocate a 32 bytes\r
- // for safety (PpisNeededByDxe and DxeCore).\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
- TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT;\r
- TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\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
//\r
// Add architecture-specifc HOBs (including the BspStore HOB)\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
*Pe32Data = SectionData;\r
\r
return EFI_SUCCESS;\r
-}
\ No newline at end of file
+}\r
+\r