]> git.proxmox.com Git - mirror_edk2.git/commitdiff
• Set the default value of PcdDxeIplSwitchToLongMode to TRUE.
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 28 Nov 2006 07:59:59 +0000 (07:59 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 28 Nov 2006 07:59:59 +0000 (07:59 +0000)
• Make access to PcdDxeIplSwitchToLongMode to Ia32 specific code.
• Introduce another feature flag named PcdDxeIplBuildShareCodeHobs to define whether to build hobs to DXE core to share code.
• Remove the #progma bug

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2026 6f19259b-4bc3-4df7-8a09-765794883524

EdkModulePkg/Core/DxeIplPeim/DxeIpl.h
EdkModulePkg/Core/DxeIplPeim/DxeIpl.msa
EdkModulePkg/Core/DxeIplPeim/DxeLoad.c
EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
EdkModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
EdkModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c [new file with mode: 0644]
EdkModulePkg/EdkModulePkg.fpd
EdkModulePkg/EdkModulePkg.spd

index f8fd8766ab59135db88985eb1a644da938507fea..af570d3c4d65a286d6d1fb4c85009d1c74bc2185 100644 (file)
@@ -27,38 +27,6 @@ Abstract:
 \r
 extern BOOLEAN gInMemory;\r
 \r
 \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
 EFI_STATUS\r
 PeiFindFile (\r
   IN  UINT8                  Type,\r
@@ -79,12 +47,6 @@ PeiLoadFile (
 ;\r
 \r
 \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
 EFI_STATUS\r
 GetImageReadFunction (\r
   IN      PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
@@ -124,6 +86,12 @@ DxeLoadCore (
   IN EFI_PEI_HOB_POINTERS  HobList\r
   );\r
 \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
 EFI_STATUS\r
 PeiProcessFile (\r
   IN      UINT16                 SectionType,\r
@@ -139,17 +107,6 @@ PeimInitializeDxeIpl (
   IN EFI_PEI_SERVICES          **PeiServices\r
   );\r
 \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
 EFI_PHYSICAL_ADDRESS\r
 CreateIdentityMappingPageTables (\r
   IN UINT32                NumberOfProcessorPhysicalAddressBits\r
index 31b7b358ee000a0d96462f896cfdc0a61812b5e4..bbf6cf1f444756aef6f8d800e2c6baba986ffa17 100644 (file)
     <Filename>DxeLoad.c</Filename>\r
     <Filename>DxeIpl.h</Filename>\r
     <Filename>DxeIpl.dxs</Filename>\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="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="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
   </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
     <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
       <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
     <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
       <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
index 8c3de0522d9ca46f8a84e5cf26f8247b956127ba..3b04ed1b107902fed55ac2d9c478d16dcaab0270 100644 (file)
@@ -22,10 +22,6 @@ Abstract:
 \r
 #include "DxeIpl.h"\r
 \r
 \r
 #include "DxeIpl.h"\r
 \r
-#ifndef __GNUC__\r
-#pragma warning( disable : 4305 )\r
-#endif\r
-\r
 BOOLEAN gInMemory = FALSE;\r
 \r
 //\r
 BOOLEAN gInMemory = FALSE;\r
 \r
 //\r
@@ -151,9 +147,6 @@ Returns:
 --*/\r
 {\r
   EFI_STATUS                                Status;\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_GUID                                  DxeCoreFileName;\r
   EFI_GUID                                  FirmwareFileName;\r
   VOID                                      *Pe32Data;\r
@@ -165,13 +158,8 @@ Returns:
   EFI_BOOT_MODE                             BootMode;\r
   EFI_PEI_RECOVERY_MODULE_PPI               *PeiRecovery;\r
   EFI_PEI_S3_RESUME_PPI                     *S3Resume;\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
 \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
 \r
   //\r
   // if in S3 Resume, restore configure\r
@@ -217,17 +205,6 @@ Returns:
   PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();\r
   ASSERT (PeiEfiPeiPeCoffLoader != NULL);\r
 \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
 \r
   //\r
   // Find the EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE type compressed Firmware Volume file\r
@@ -290,70 +267,37 @@ Returns:
     EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT\r
     );\r
 \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
 \r
     //\r
     // Add HOB for the PE/COFF Loader Protocol\r
@@ -363,21 +307,10 @@ Returns:
       (VOID *)&PeiEfiPeiPeCoffLoader,\r
       sizeof (VOID *)\r
       );\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
   // If we get here, then the DXE Core returned.  This is an error\r
   // Dxe Core should not return.\r
index 28e980517a395fb01858db90c7cb59892c62d755..6b61086cf2d86397152f039f1f2de593b8a45f21 100644 (file)
@@ -21,66 +21,69 @@ Abstract:
 \r
 #include "DxeIpl.h"\r
 \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
 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
   )\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
index 079ae924da9a181f7e800b28016c37a22483010e..e53f708fd419c56ede18bb09031b0c7ce4c9034c 100644 (file)
@@ -21,91 +21,44 @@ Abstract:
 \r
 #include "DxeIpl.h"\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
-\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
 {\r
-  EFI_STATUS  Status;\r
+  VOID                *BaseOfStack;\r
+  VOID                *TopOfStack;\r
+  VOID                *BspStore;\r
 \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
 \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
 \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
-**/\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
   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
     );\r
 }\r
diff --git a/EdkModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/EdkModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
new file mode 100644 (file)
index 0000000..02de149
--- /dev/null
@@ -0,0 +1,52 @@
+/*++\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
index 47b9a7fd35e4d34c5ae2b8a9ec1d2d16e418f36a..c953fc360e9031649a83ad25ed3e85155cfc32f9 100644 (file)
           <MaxDatumSize>1</MaxDatumSize>\r
           <Value>TRUE</Value>\r
         </PcdData>\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
       </PcdBuildDefinition>\r
       <ModuleSaBuildOptions>\r
         <FvBinding>NULL</FvBinding>\r
           <MaxDatumSize>1</MaxDatumSize>\r
           <Value>TRUE</Value>\r
         </PcdData>\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
       </PcdBuildDefinition>\r
       <ModuleSaBuildOptions>\r
         <FvBinding>NULL</FvBinding>\r
           <MaxDatumSize>1</MaxDatumSize>\r
           <Value>TRUE</Value>\r
         </PcdData>\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
       </PcdBuildDefinition>\r
       <ModuleSaBuildOptions>\r
         <FvBinding>NULL</FvBinding>\r
           <MaxDatumSize>1</MaxDatumSize>\r
           <Value>TRUE</Value>\r
         </PcdData>\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
       </PcdBuildDefinition>\r
       <ModuleSaBuildOptions>\r
         <FvBinding>NULL</FvBinding>\r
index 9e083f93b17bf8ced172ae1f0b06d7023b8884f1..0472f2d66fabb0c4fbd605081a65168198f8b214 100644 (file)
       <DefaultValue>FALSE</DefaultValue>\r
       <HelpText>Whether VGA decoding is enabled on this platform so we should avoid those aliased resources</HelpText>\r
     </PcdEntry>\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
       <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
       <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
   </PcdDeclarations>\r
 </PackageSurfaceArea>
\ No newline at end of file