]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Introduce PcdDxeIplSwitchToLongMode to DxeIplPeim and remove DxeIplX64Peim.
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 27 Nov 2006 10:14:02 +0000 (10:14 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 27 Nov 2006 10:14:02 +0000 (10:14 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2018 6f19259b-4bc3-4df7-8a09-765794883524

24 files changed:
EdkModulePkg/Core/DxeIplPeim/DxeIpl.h
EdkModulePkg/Core/DxeIplPeim/DxeIpl.msa
EdkModulePkg/Core/DxeIplPeim/DxeLoad.c
EdkModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
EdkModulePkg/Core/DxeIplPeim/Ia32/ImageRead.c
EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.S [new file with mode: 0644]
EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.asm [new file with mode: 0644]
EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.c [new file with mode: 0644]
EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.h [new file with mode: 0644]
EdkModulePkg/Core/DxeIplPeim/Ipf/DxeLoadFunc.c
EdkModulePkg/Core/DxeIplPeim/Ipf/ImageRead.c
EdkModulePkg/Core/DxeIplPeim/Non-existing.c [new file with mode: 0644]
EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.dxs [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.h [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/DxeIplX64.msa [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/DxeLoadX64.c [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/x64/DxeLoadFunc.c [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/x64/ImageRead.c [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.S [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.asm [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.c [deleted file]
EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.h [deleted file]
EdkModulePkg/EdkModulePkg.fpd
EdkModulePkg/EdkModulePkg.spd

index 9e626a7dc79f7d3fa72b565863c37b3f263a35ad..f8fd8766ab59135db88985eb1a644da938507fea 100644 (file)
@@ -23,6 +23,8 @@ Abstract:
 #define STACK_SIZE      0x20000\r
 #define BSP_STORE_SIZE  0x4000\r
 \r
+#define GET_OCCUPIED_SIZE(ActualSize, Alignment) ((ActualSize + (Alignment - 1)) & ~(Alignment - 1))\r
+\r
 extern BOOLEAN gInMemory;\r
 \r
 /**\r
@@ -125,8 +127,9 @@ DxeLoadCore (
 EFI_STATUS\r
 PeiProcessFile (\r
   IN      UINT16                 SectionType,\r
-  IN OUT  EFI_FFS_FILE_HEADER    **RealFfsFileHeader,\r
-  OUT     VOID                   **Pe32Data\r
+  IN      EFI_FFS_FILE_HEADER    *FfsFileHeader,\r
+  OUT     VOID                   **Pe32Data,\r
+  IN      EFI_PEI_HOB_POINTERS   *OrigHob\r
   );\r
 \r
 EFI_STATUS\r
index c3042e1186a14f4c7deb4388031bf6d96e173504..31b7b358ee000a0d96462f896cfdc0a61812b5e4 100644 (file)
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
   <MsaHeader>\r
     <ModuleName>DxeIpl</ModuleName>\r
     <ModuleType>PEIM</ModuleType>\r
@@ -8,11 +8,11 @@
     <Abstract>Component description file for DxeIpl module</Abstract>\r
     <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>\r
     <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>\r
-    <License>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
-      THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+    <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>\r
     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
   </MsaHeader>\r
@@ -67,6 +67,9 @@
     <LibraryClass Usage="ALWAYS_CONSUMED">\r
       <Keyword>MemoryAllocationLib</Keyword>\r
     </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>PcdLib</Keyword>\r
+    </LibraryClass>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>DxeLoad.c</Filename>\r
     <Filename>DxeIpl.dxs</Filename>\r
     <Filename SupArchList="IA32">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="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
     <Ppi Usage="SOMETIMES_CONSUMED">\r
       <PpiCName>gEfiPeiSecurityPpiGuid</PpiCName>\r
     </Ppi>\r
-    <Ppi Usage="PRIVATE">\r
-      <PpiCName>gPeiInMemoryGuid</PpiCName>\r
-    </Ppi>\r
   </PPIs>\r
   <Guids>\r
     <GuidCNames Usage="SOMETIMES_CONSUMED">\r
       <ModuleEntryPoint>PeimInitializeDxeIpl</ModuleEntryPoint>\r
     </Extern>\r
   </Externs>\r
+  <PcdCoded>\r
+    <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
+      <C_Name>PcdDxeIplSwitchToLongMode</C_Name>\r
+      <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+      <DefaultValue>FALSE</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>PcdDxeIplSupportEfiDecompress</C_Name>\r
+      <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+      <DefaultValue>TRUE</DefaultValue>\r
+      <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the EFI Compression algorithm</HelpText>\r
+    </PcdEntry>\r
+    <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
+      <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>\r
+      <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+      <DefaultValue>TRUE</DefaultValue>\r
+      <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Tiano Compression algorithm</HelpText>\r
+    </PcdEntry>\r
+    <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
+      <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>\r
+      <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+      <DefaultValue>TRUE</DefaultValue>\r
+      <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Custom Compression algorithm</HelpText>\r
+    </PcdEntry>\r
+  </PcdCoded>\r
 </ModuleSurfaceArea>
\ No newline at end of file
index fdd6c24b2ee03fba3be644957a91f352fc3774e0..8c3de0522d9ca46f8a84e5cf26f8247b956127ba 100644 (file)
@@ -20,7 +20,11 @@ Abstract:
 \r
 --*/\r
 \r
-#include <DxeIpl.h>\r
+#include "DxeIpl.h"\r
+\r
+#ifndef __GNUC__\r
+#pragma warning( disable : 4305 )\r
+#endif\r
 \r
 BOOLEAN gInMemory = FALSE;\r
 \r
@@ -36,22 +40,17 @@ static EFI_PEI_FV_FILE_LOADER_PPI mLoadFilePpi = {
   DxeIplLoadFile\r
 };\r
 \r
-static EFI_PEI_PPI_DESCRIPTOR     mPpiLoadFile = {\r
-  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+static EFI_PEI_PPI_DESCRIPTOR     mPpiList[] = {\r
+  {\r
+  EFI_PEI_PPI_DESCRIPTOR_PPI,\r
   &gEfiPeiFvFileLoaderPpiGuid,\r
   &mLoadFilePpi\r
-};\r
-\r
-static EFI_PEI_PPI_DESCRIPTOR     mPpiList = {\r
+  },\r
+  {\r
   (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
   &gEfiDxeIplPpiGuid,\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
 \r
 static EFI_PEI_PPI_DESCRIPTOR     mPpiSignal = {\r
@@ -60,38 +59,21 @@ static EFI_PEI_PPI_DESCRIPTOR     mPpiSignal = {
   NULL\r
 };\r
 \r
-DECOMPRESS_LIBRARY  gEfiDecompress = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY  gEfiDecompress = {\r
   UefiDecompressGetInfo,\r
   UefiDecompress\r
 };\r
 \r
-DECOMPRESS_LIBRARY  gTianoDecompress = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY  gTianoDecompress = {\r
   TianoDecompressGetInfo,\r
   TianoDecompress\r
 };\r
 \r
-DECOMPRESS_LIBRARY  gCustomDecompress = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY  gCustomDecompress = {\r
   CustomDecompressGetInfo,\r
   CustomDecompress\r
 };\r
 \r
-STATIC\r
-UINTN\r
-GetOccupiedSize (\r
-  IN UINTN   ActualSize,\r
-  IN UINTN   Alignment\r
-  )\r
-{\r
-  UINTN OccupiedSize;\r
-\r
-  OccupiedSize = ActualSize;\r
-  while ((OccupiedSize & (Alignment - 1)) != 0) {\r
-    OccupiedSize++;\r
-  }\r
-\r
-  return OccupiedSize;\r
-}\r
-\r
 EFI_STATUS\r
 EFIAPI\r
 PeimInitializeDxeIpl (\r
@@ -120,17 +102,9 @@ Returns:
   EFI_BOOT_MODE                             BootMode;\r
 \r
   Status = PeiServicesGetBootMode (&BootMode);\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
@@ -140,38 +114,15 @@ Returns:
     // Shadow DxeIpl and then re-run its entry point\r
     //\r
     Status = ShadowDxeIpl (FfsHeader, PeiEfiPeiPeCoffLoader);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
   } else {\r
-    if (BootMode != BOOT_ON_S3_RESUME) {\r
     //\r
-    // The DxeIpl has been shadowed\r
+    // Install FvFileLoader and DxeIpl PPIs.\r
     //\r
-    gInMemory = TRUE;\r
-\r
-    //\r
-    // Install LoadFile PPI\r
-    //\r
-    Status = PeiServicesInstallPpi (&mPpiLoadFile);\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-      }\r
-    }\r
-    //\r
-    // Install DxeIpl PPI\r
-    //\r
-    PeiServicesInstallPpi (&mPpiList);\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
+    Status = PeiServicesInstallPpi (mPpiList);\r
+    ASSERT_EFI_ERROR(Status);\r
   }\r
-\r
-  return EFI_SUCCESS;\r
+  \r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -200,12 +151,13 @@ Returns:
 --*/\r
 {\r
   EFI_STATUS                                Status;\r
-  VOID                                      *TopOfStack;\r
-  VOID                                      *BaseOfStack;\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
+  VOID                                      *FvImageData;     \r
   EFI_PHYSICAL_ADDRESS                      DxeCoreAddress;\r
   UINT64                                    DxeCoreSize;\r
   EFI_PHYSICAL_ADDRESS                      DxeCoreEntryPoint;\r
@@ -213,104 +165,32 @@ Returns:
   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  = NULL;\r
-  BaseOfStack = NULL;\r
+  TopOfStack  = 0;\r
+  BaseOfStack = 0;\r
   BspStore    = 0;\r
-  Status      = EFI_SUCCESS;\r
+  PageTables  = 0;\r
 \r
   //\r
   // if in S3 Resume, restore configure\r
   //\r
   Status = PeiServicesGetBootMode (&BootMode);\r
+  ASSERT_EFI_ERROR(Status);\r
 \r
-  if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) {\r
+  if (BootMode == BOOT_ON_S3_RESUME) {\r
     Status = PeiServicesLocatePpi (\r
                &gEfiPeiS3ResumePpiGuid,\r
                0,\r
                NULL,\r
                (VOID **)&S3Resume\r
                );\r
-\r
     ASSERT_EFI_ERROR (Status);\r
 \r
     Status = S3Resume->S3RestoreConfig (PeiServices);\r
-\r
     ASSERT_EFI_ERROR (Status);\r
-  }\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  //\r
-  // Install the PEI Protocols that are shared between PEI and DXE\r
-  //\r
-  PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();\r
-  ASSERT (PeiEfiPeiPeCoffLoader != NULL);\r
-\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
-  //\r
-  // Add architecture-specifc HOBs (including the BspStore HOB)\r
-  //\r
-  Status = CreateArchSpecificHobs (&BspStore);\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\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
-\r
-  //\r
-  // Add HOB for the PE/COFF Loader Protocol\r
-  //\r
-  BuildGuidDataHob (\r
-    &gEfiPeiPeCoffLoaderGuid,\r
-    (VOID *)&PeiEfiPeiPeCoffLoader,\r
-    sizeof (VOID *)\r
-    );\r
-\r
-  //\r
-  // See if we are in crisis recovery\r
-  //\r
-  Status = PeiServicesGetBootMode (&BootMode);\r
-\r
-  if (!EFI_ERROR (Status) && (BootMode == BOOT_IN_RECOVERY_MODE)) {\r
+  } else if (BootMode == BOOT_IN_RECOVERY_MODE) {\r
 \r
     Status = PeiServicesLocatePpi (\r
                &gEfiPeiRecoveryModulePpiGuid,\r
@@ -318,8 +198,8 @@ Returns:
                NULL,\r
                (VOID **)&PeiRecovery\r
                );\r
-\r
     ASSERT_EFI_ERROR (Status);\r
+\r
     Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_ERROR, "Load Recovery Capsule Failed.(Status = %r)\n", Status));\r
@@ -332,19 +212,34 @@ Returns:
   }\r
 \r
   //\r
-  // Find the EFI_FV_FILETYPE_RAW type compressed Firmware Volume file in FTW spare block\r
+  // Install the PEI Protocols that are shared between PEI and DXE\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
   // The file found will be processed by PeiProcessFile: It will first be decompressed to\r
-  // a normal FV, then a corresponding FV type hob will be built which is provided for DXE\r
-  // core to find and dispatch drivers in this FV. Because PeiProcessFile typically checks\r
-  // for EFI_FV_FILETYPE_DXE_CORE type file, in this condition we need not check returned\r
-  // status\r
+  // a normal FV, then a corresponding FV type hob will be built. \r
   //\r
   Status = PeiFindFile (\r
-            EFI_FV_FILETYPE_RAW,\r
-            EFI_SECTION_PE32,\r
-            &FirmwareFileName,\r
-            &Pe32Data\r
-            );\r
+             EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,\r
+             EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
+             &FirmwareFileName,\r
+             &FvImageData\r
+             );\r
 \r
   //\r
   // Find the DXE Core in a Firmware Volume\r
@@ -355,20 +250,18 @@ Returns:
             &DxeCoreFileName,\r
             &Pe32Data\r
             );\r
-\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Load the DXE Core from a Firmware Volume\r
   //\r
   Status = PeiLoadFile (\r
-            PeiEfiPeiPeCoffLoader,\r
-            Pe32Data,\r
-            &DxeCoreAddress,\r
-            &DxeCoreSize,\r
-            &DxeCoreEntryPoint\r
-            );\r
-\r
+             PeiEfiPeiPeCoffLoader,\r
+             Pe32Data,\r
+             &DxeCoreAddress,\r
+             &DxeCoreSize,\r
+             &DxeCoreEntryPoint\r
+             );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
@@ -377,7 +270,6 @@ Returns:
   //\r
 \r
   Status = PeiServicesInstallPpi (&mPpiSignal);\r
-\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
@@ -399,14 +291,93 @@ Returns:
     );\r
 \r
   DEBUG ((EFI_D_INFO, "DXE Core Entry\n"));\r
-  SwitchIplStacks (\r
-    (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,\r
-    HobList.Raw,\r
-    NULL,\r
-    TopOfStack,\r
-    (VOID *) (UINTN) BspStore\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
+    // 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
+\r
+    //\r
+    // Add HOB for the PE/COFF Loader Protocol\r
+    //\r
+    BuildGuidDataHob (\r
+      &gEfiPeiPeCoffLoaderGuid,\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
   // If we get here, then the DXE Core returned.  This is an error\r
   // Dxe Core should not return.\r
@@ -462,10 +433,11 @@ Returns:
   FwVolHeader   = NULL;\r
   FfsFileHeader = NULL;\r
   SectionData   = NULL;\r
+  Status        = EFI_SUCCESS;\r
 \r
   //\r
-  // Foreach Firmware Volume, look for a specified type\r
-  // of file and break out when one is found\r
+  // For each Firmware Volume, look for a specified type\r
+  // of file and break out until no one is found \r
   //\r
   Hob.Raw = GetHobList ();\r
   while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw)) != NULL) {\r
@@ -478,11 +450,14 @@ Returns:
     if (!EFI_ERROR (Status)) {\r
       Status = PeiProcessFile (\r
                  SectionType,\r
-                 &FfsFileHeader,\r
-                 Pe32Data\r
+                 FfsFileHeader,\r
+                 Pe32Data,\r
+                 &Hob\r
                  );\r
       CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));\r
-      return Status;\r
+      if (!EFI_ERROR (Status)) {\r
+        return EFI_SUCCESS;\r
+      }\r
     }\r
     Hob.Raw = GET_NEXT_HOB (Hob);\r
   }\r
@@ -608,7 +583,7 @@ Returns:
 \r
   while ((Section->Type != EFI_SECTION_PE32) && (Section->Type != EFI_SECTION_TE)) {\r
     SectionLength         = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
-    OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);\r
+    OccupiedSectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);\r
     Section               = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);\r
   }\r
   //\r
@@ -624,14 +599,9 @@ Returns:
 \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
@@ -689,8 +659,9 @@ Returns:
   //\r
   Status = PeiProcessFile (\r
             EFI_SECTION_PE32,\r
-            &FfsHeader,\r
-            &Pe32Data\r
+            FfsHeader,\r
+            &Pe32Data,\r
+            NULL\r
             );\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -713,8 +684,9 @@ Returns:
 EFI_STATUS\r
 PeiProcessFile (\r
   IN      UINT16                 SectionType,\r
-  IN OUT  EFI_FFS_FILE_HEADER    **RealFfsFileHeader,\r
-  OUT     VOID                   **Pe32Data\r
+  IN      EFI_FFS_FILE_HEADER    *FfsFileHeader,\r
+  OUT     VOID                   **Pe32Data,\r
+  IN      EFI_PEI_HOB_POINTERS   *OrigHob\r
   )\r
 /*++\r
 \r
@@ -762,9 +734,7 @@ Returns:
   EFI_GUID                        TempGuid;\r
   EFI_FIRMWARE_VOLUME_HEADER      *FvHeader;\r
   EFI_COMPRESSION_SECTION         *CompressionSection;\r
-  EFI_FFS_FILE_HEADER             *FfsFileHeader;\r
-\r
-  FfsFileHeader = *RealFfsFileHeader;\r
+  UINT32                          FvAlignment;\r
 \r
   Status = PeiServicesFfsFindSectionData (\r
              EFI_SECTION_COMPRESSION,\r
@@ -773,7 +743,7 @@ Returns:
              );\r
 \r
   //\r
-  // Upon finding a DXE Core file, see if there is first a compression section\r
+  // First process the compression section\r
   //\r
   if (!EFI_ERROR (Status)) {\r
     //\r
@@ -784,7 +754,7 @@ Returns:
 \r
     do {\r
       SectionLength         = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
-      OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);\r
+      OccupiedSectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);\r
 \r
       //\r
       // Was the DXE Core file encapsulated in a GUID'd section?\r
@@ -881,14 +851,24 @@ Returns:
 \r
         switch (CompressionSection->CompressionType) {\r
         case EFI_STANDARD_COMPRESSION:\r
-          DecompressLibrary = &gTianoDecompress;\r
+          if (FeaturePcdGet (PcdDxeIplSupportTianoDecompress)) {\r
+            DecompressLibrary = &gTianoDecompress;\r
+          } else {\r
+            ASSERT (FALSE);\r
+            return EFI_NOT_FOUND;\r
+          }\r
           break;\r
 \r
         case EFI_CUSTOMIZED_COMPRESSION:\r
           //\r
           // Load user customized compression protocol.\r
           //\r
-          DecompressLibrary = &gCustomDecompress;\r
+          if (FeaturePcdGet (PcdDxeIplSupportCustomDecompress)) {\r
+            DecompressLibrary = &gCustomDecompress;\r
+          } else {\r
+            ASSERT (FALSE);\r
+            return EFI_NOT_FOUND;\r
+          }\r
           break;\r
 \r
         case EFI_NOT_COMPRESSED:\r
@@ -939,31 +919,64 @@ Returns:
                     );\r
 \r
         CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;\r
-        if (CmpSection->Type == EFI_SECTION_RAW) {\r
-          //\r
-          // Skip the section header and\r
-          // adjust the pointer alignment to 16\r
+        if (CmpSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {\r
+          // \r
+          // Firmware Volume Image in this Section\r
+          // Skip the section header to get FvHeader\r
           //\r
-          FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (DstBuffer + 16);\r
+          FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (CmpSection + 1);\r
 \r
-          if (FvHeader->Signature == EFI_FVH_SIGNATURE) {\r
-            FfsFileHeader = NULL;\r
+          if (FvHeader->Signature == EFI_FVH_SIGNATURE) {            \r
+            //\r
+            // Adjust Fv Base Address Alignment based on Align Attributes in Fv Header\r
+            //\r
+            \r
+            //\r
+            // When FvImage support Alignment, we need to check whether \r
+            // its alignment is correct. \r
+            //\r
+            if (FvHeader->Attributes | EFI_FVB_ALIGNMENT_CAP) {\r
+              \r
+              //\r
+              // Calculate the mini alignment for this FvImage\r
+              //\r
+              FvAlignment = 1 << (LowBitSet32 (FvHeader->Attributes >> 16) + 1);\r
+              \r
+              //\r
+              // If current FvImage base address doesn't meet the its alignment,\r
+              // we need to reload this FvImage to another correct memory address.\r
+              //\r
+              if (((UINTN) FvHeader % FvAlignment) != 0) {\r
+                DstBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINTN) FvHeader->FvLength), FvAlignment);\r
+                if (DstBuffer == NULL) {\r
+                  return EFI_OUT_OF_RESOURCES;\r
+                }\r
+                CopyMem (DstBuffer, FvHeader, (UINTN) FvHeader->FvLength);\r
+                FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) DstBuffer;  \r
+              }\r
+            }\r
+            //\r
+            // Build new FvHob for new decompressed Fv image.\r
+            //\r
             BuildFvHob ((EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader, FvHeader->FvLength);\r
-            Status = PeiServicesFfsFindNextFile (\r
-                       EFI_FV_FILETYPE_DXE_CORE,\r
-                       FvHeader,\r
-                       &FfsFileHeader\r
-                       );\r
-\r
-            if (EFI_ERROR (Status)) {\r
-              return EFI_NOT_FOUND;\r
+            \r
+            //\r
+            // Set the original FvHob to unused.\r
+            //\r
+            if (OrigHob != NULL) {\r
+              OrigHob->Header->HobType = EFI_HOB_TYPE_UNUSED;\r
             }\r
-\r
+            \r
             //\r
-            // Reture the FfsHeader that contain Pe32Data.\r
+            // when search FvImage Section return true.\r
             //\r
-            *RealFfsFileHeader = FfsFileHeader;\r
-            return PeiProcessFile (SectionType, RealFfsFileHeader, Pe32Data);\r
+            if (SectionType == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {\r
+              *Pe32Data = (VOID *) FvHeader;\r
+              return EFI_SUCCESS;\r
+            } else {\r
+              return EFI_NOT_FOUND;\r
+            }\r
+\r
           }\r
         }\r
         //\r
@@ -982,10 +995,13 @@ Returns:
             return EFI_SUCCESS;\r
           }\r
 \r
-          OccupiedCmpSectionLength  = GetOccupiedSize (CmpSectionLength, 4);\r
+          OccupiedCmpSectionLength  = GET_OCCUPIED_SIZE (CmpSectionLength, 4);\r
           CmpSection                = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);\r
         } while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);\r
       }\r
+      //\r
+      // End of the decompression activity\r
+      //\r
 \r
       Section   = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);\r
       FileSize  = FfsFileHeader->Size[0] & 0xFF;\r
@@ -993,11 +1009,17 @@ Returns:
       FileSize += (FfsFileHeader->Size[2] << 16) & 0xFF0000;\r
       FileSize &= 0x00FFFFFF;\r
     } while (Section->Type != 0 && (UINTN) ((UINT8 *) Section - (UINT8 *) FfsFileHeader) < FileSize);\r
-\r
+    \r
     //\r
-    // End of the decompression activity\r
+    // search all sections (compression and non compression) in this FFS, don't \r
+    // find expected section.\r
     //\r
+    return EFI_NOT_FOUND;\r
   } else {\r
+    //\r
+    // For those FFS that doesn't contain compression section, directly search \r
+    // PE or TE section in this FFS.\r
+    //\r
 \r
     Status = PeiServicesFfsFindSectionData (\r
                EFI_SECTION_PE32,\r
@@ -1021,3 +1043,4 @@ Returns:
 \r
   return EFI_SUCCESS;\r
 }\r
+\r
index 0aa323ec2f614f996b80e490262ec6aef1126f13..28e980517a395fb01858db90c7cb59892c62d755 100644 (file)
@@ -19,7 +19,7 @@ Abstract:
 \r
 --*/\r
 \r
-#include <DxeIpl.h>\r
+#include "DxeIpl.h"\r
 \r
 EFI_STATUS\r
 CreateArchSpecificHobs (\r
index fe076082907c44caf515eb7cee7f72f222a53846..b4bd64067c0635fa7dd1de44985c124755c4edae 100644 (file)
@@ -17,7 +17,7 @@ Abstract:
 \r
 --*/\r
 \r
-#include <DxeIpl.h>\r
+#include "DxeIpl.h"\r
 \r
 EFI_STATUS\r
 EFIAPI\r
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.S b/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.S
new file mode 100644 (file)
index 0000000..273b3d5
--- /dev/null
@@ -0,0 +1,296 @@
+#------------------------------------------------------------------------------
+#*
+#*   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.             
+#*   
+#*    LongMode.S
+#*  
+#*   Abstract:
+#*
+#*    Transition from 32-bit protected mode EFI environment into x64 
+#*    64-bit bit long mode.
+#*  
+#*   This file is not fully ported or operational.
+#*  
+#------------------------------------------------------------------------------
+
+.686p: 
+#.MODEL flat
+
+#
+# Create the exception handler code in IA32 C code
+#
+
+.code: 
+.stack: 
+.MMX: 
+.XMM: 
+
+.global _LoadGo64Gdt;
+_LoadGo64Gdt:
+    pushl   %ebp              # C prolog
+    pushl   %edi
+    movl    %esp, %ebp
+    #
+    # Disable interrupts
+    #
+    cli
+    #
+    # Reload the selectors
+    # Note:
+    #      Make the Selectors 64-bit ready
+    #
+    movl    gdtr, %edi          # Load GDT register
+    movw    %cs, %ax            # Get the selector data from our code image          
+    mov     %ax, %es
+# FIXME MISMATCH: "    lgdt    FWORD PTR es:[edi]  "
+
+    .byte   0x67
+    .byte   0xea              # Far Jump Offset:Selector to reload CS
+# FIXME MISMATCH: "    dd      OFFSET DataSelectorRld"
+# FIXME MISMATCH: "    dw      LINEAR_CODE_SEL   "
+DataSelectorRld:
+    movw    SYS_DATA_SEL, %ax # Update the Base for the new selectors, too
+    movw    %ax, %ds
+    movw    %ax, %es
+    movw    %ax, %fs
+    movw    %ax, %gs
+    movw    %ax, %ss
+
+    popl    %edi
+    popl    %ebp
+    ret
+#_LoadGo64Gdt ENDP
+
+
+# VOID
+# ActivateLongMode (
+#   IN  EFI_PHYSICAL_ADDRESS  PageTables,  
+#   IN  EFI_PHYSICAL_ADDRESS  HobStart,
+#   IN  EFI_PHYSICAL_ADDRESS  Stack,
+#   IN  EFI_PHYSICAL_ADDRESS  PpisNeededByDxeIplEntryPoint,
+#   IN  EFI_PHYSICAL_ADDRESS  DxeCoreEntryPoint
+#   )
+#
+# Input:  [ebp][0h]  = Original ebp
+#         [ebp][4h]  = Return address
+#         [ebp][8h]  = PageTables
+#         [ebp][10h] = HobStart
+#         [ebp][18h] = Stack
+#         [ebp][20h] = CodeEntryPoint1 <--- Call this first (for each call, pass HOB pointer)
+#         [ebp][28h] = CodeEntryPoint2 <--- Call this second
+#
+#
+.global _ActivateLongMode;
+_ActivateLongMode:
+    pushl   %ebp              # C prolog
+    movl    %esp, %ebp
+
+    #
+    # Use CPUID to determine if the processor supports long mode.
+    #
+    movl    $0x80000000, %eax # Extended-function code 8000000h.
+    cpuid                   # Is largest extended function
+    cmpl    $0x80000000, %eax # any function > 80000000h?
+    jbe     no_long_mode    # If not, no long mode.
+    movl    $0x80000001, %eax # Extended-function code 8000001h.
+    cpuid                   # Now EDX = extended-features flags.
+    btl     $29, %edx       # Test if long mode is supported.
+    jnc     no_long_mode    # Exit if not supported.
+
+    #
+    # Enable the 64-bit page-translation-table entries by
+    # setting CR4.PAE=1 (this is _required_ before activating
+    # long mode). Paging is not enabled until after long mode
+    # is enabled.
+    #
+    movl %cr4, %eax
+    btsl $5, %eax
+    movl %eax, %cr4
+
+    #
+    # Get the long-mode page tables, and initialize the
+    # 64-bit CR3 (page-table base address) to point to the base
+    # of the PML4 page table. The PML4 page table must be located
+    # below 4 Gbytes because only 32 bits of CR3 are loaded when
+    # the processor is not in 64-bit mode.
+    #
+    movl 0x8(%ebp), %eax    # Get Page Tables
+    movl %eax, %cr3          # Initialize CR3 with PML4 base.
+
+    #
+    # Enable long mode (set EFER.LME=1).
+    #
+    movl $0xc0000080, %ecx # EFER MSR number.
+    rdmsr               # Read EFER.
+    btsl $8, %eax       # Set LME=1.
+    wrmsr               # Write EFER.
+
+    #
+    # Enable paging to activate long mode (set CR0.PG=1)
+    #
+
+
+    movl %cr0, %eax # Read CR0.
+    btsl $31, %eax # Set PG=1.
+    movl %eax, %cr0 # Write CR0.
+    jmp   go_to_long_mode
+go_to_long_mode: 
+
+    #
+    # This is the next instruction after enabling paging.  Jump to long mode
+    #
+    .byte   0x67
+    .byte   0xea              # Far Jump Offset:Selector to reload CS
+#FIXME MISMATCH: "    dd      OFFSET in_long_mode"
+#FIXME MISMATCH: "    dw      SYS_CODE64_SEL    "
+in_long_mode:
+    movw    SYS_DATA64_SEL, %ax
+    movw    %ax, %es
+    movw    %ax, %ss
+    movw    %ax, %ds
+    jmp     .
+
+
+    #
+    # We're in long mode, so marshall the arguments to call the
+    # passed in function pointers
+    # Recall
+    #         [ebp][10h] = HobStart
+    #         [ebp][18h] = Stack
+    #         [ebp][20h] = PpisNeededByDxeIplEntryPoint <--- Call this first (for each call, pass HOB pointer)
+    #         [ebp][28h] = DxeCoreEntryPoint            <--- Call this second
+    #
+    .byte 0x48
+    movl 0x18(%ebp), %ebx     # Setup the stack
+    .byte 0x48
+    movl %ebx, %esp           # On a new stack now
+
+
+## 00000905  FF D0                  call rax
+
+    .byte 0x48
+    movl 0x10(%ebp), %ecx     # Pass Hob Start in RCX
+    .byte 0x48
+    movl 0x28(%ebp), %eax     # Get the function pointer for 
+                              # DxeCoreEntryPoint into EAX
+
+## 00000905  FF D0                  call rax
+    .byte 0xff
+    .byte 0xd0
+
+    #
+    # WE SHOULD NEVER GET HERE!!!!!!!!!!!!!
+    #
+no_long_mode: 
+    jmp   no_long_mode
+#_ActivateLongMode ENDP
+
+        .align 16
+
+gdtr: #FIXME MISMATCH: "gdtr    dw _GDT_END - _GDT_BASE - 1   "
+#FIXME MISMATCH: "        dd OFFSET _GDT_BASE          "
+
+#-----------------------------------------------------------------------------;
+#   global descriptor table (GDT)
+#-----------------------------------------------------------------------------;
+
+        .align 16
+
+.global _GDT_BASE
+_GDT_BASE: 
+# null descriptor
+.equ                NULL_SEL, .-_GDT_BASE     # Selector [0]
+        .word 0         # limit 15:0
+        .word 0         # base 15:0
+        .byte 0         # base 23:16
+        .byte 0         # type
+        .byte 0         # limit 19:16, flags
+        .byte 0         # base 31:24
+
+# linear data segment descriptor
+.equ            LINEAR_SEL, .-_GDT_BASE         # Selector [0x8]
+        .word 0xFFFF    # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0x92      # present, ring 0, data, expand-up, writable
+        .byte 0xCF              # page-granular, 32-bit
+        .byte 0
+
+# linear code segment descriptor
+.equ            LINEAR_CODE_SEL, .-_GDT_BASE         # Selector [0x10]
+        .word 0xFFFF    # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0x9F      # present, ring 0, data, expand-up, writable
+        .byte 0xCF              # page-granular, 32-bit
+        .byte 0
+
+# system data segment descriptor
+.equ            SYS_DATA_SEL, .-_GDT_BASE         # Selector [0x18]
+        .word 0xFFFF    # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0x93      # present, ring 0, data, expand-up, writable
+        .byte 0xCF              # page-granular, 32-bit
+        .byte 0
+
+# system code segment descriptor
+.equ            SYS_CODE_SEL, .-_GDT_BASE         # Selector [0x20]
+        .word 0xFFFF    # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0x9A      # present, ring 0, data, expand-up, writable
+        .byte 0xCF              # page-granular, 32-bit
+        .byte 0
+
+# spare segment descriptor
+.equ        SPARE3_SEL, .-_GDT_BASE             # Selector [0x28]
+        .word 0         # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0         # present, ring 0, data, expand-up, writable
+        .byte 0         # page-granular, 32-bit
+        .byte 0
+
+#
+# system data segment descriptor
+#
+.equ              SYS_DATA64_SEL, .-_GDT_BASE           # Selector [0x30]
+        .word 0xFFFF    # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0x92      # P | DPL [1..2] | 1   | 1   | C | R | A
+        .byte 0xCF      # G | D   | L    | AVL | Segment [19..16]
+        .byte 0
+
+#
+# system code segment descriptor
+#
+.equ              SYS_CODE64_SEL, .-_GDT_BASE           # Selector [0x38]
+        .word 0xFFFF    # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0x9A      # P | DPL [1..2] | 1   | 1   | C | R | A
+        .byte 0xAF      # G | D   | L    | AVL | Segment [19..16]
+        .byte 0
+
+# spare segment descriptor
+.equ        SPARE4_SEL, .-_GDT_BASE             # Selector [0x40]
+        .word 0         # limit 0xFFFFF
+        .word 0         # base 0
+        .byte 0
+        .byte 0         # present, ring 0, data, expand-up, writable
+        .byte 0         # page-granular, 32-bit
+        .byte 0
+
+_GDT_END: 
+
+
+
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.asm b/EdkModulePkg/Core/DxeIplPeim/Ia32/LongMode.asm
new file mode 100644 (file)
index 0000000..a241273
--- /dev/null
@@ -0,0 +1,294 @@
+      TITLE   LongMode.asm: Assembly code for the entering long mode
+
+;------------------------------------------------------------------------------
+;*
+;*   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.             
+;*   
+;*    LongMode.asm
+;*  
+;*   Abstract:
+;*
+;*    Transition from 32-bit protected mode EFI environment into x64 
+;*    64-bit bit long mode.
+;*  
+;------------------------------------------------------------------------------
+
+.686p
+.model  flat        
+
+;
+; Create the exception handler code in IA32 C code
+;
+
+.code
+.stack
+.MMX
+.XMM
+
+_LoadGo64Gdt   PROC Near Public
+    push    ebp               ; C prolog
+    push    edi
+    mov     ebp, esp
+    ;
+    ; Disable interrupts
+    ;
+    cli
+    ;
+    ; Reload the selectors
+    ; Note:
+    ;      Make the Selectors 64-bit ready
+    ;
+    mov     edi, OFFSET gdtr    ; Load GDT register
+    mov     ax,cs               ; Get the selector data from our code image          
+    mov     es,ax
+    lgdt    FWORD PTR es:[edi]  ; and update the GDTR   
+
+    db      067h
+    db      0eah              ; Far Jump Offset:Selector to reload CS
+    dd      OFFSET DataSelectorRld;   Offset is ensuing instruction boundary
+    dw      LINEAR_CODE_SEL   ;   Selector is our code selector, 10h
+DataSelectorRld::
+    mov     ax, SYS_DATA_SEL ; Update the Base for the new selectors, too
+    mov     ds, ax
+    mov     es, ax
+    mov     fs, ax
+    mov     gs, ax
+    mov     ss, ax  
+    
+    pop     edi
+    pop     ebp
+    ret
+_LoadGo64Gdt endp   
+    
+
+; VOID
+; ActivateLongMode (
+;   IN  EFI_PHYSICAL_ADDRESS  PageTables,  
+;   IN  EFI_PHYSICAL_ADDRESS  HobStart,
+;   IN  EFI_PHYSICAL_ADDRESS  Stack,
+;   IN  EFI_PHYSICAL_ADDRESS  PpisNeededByDxeIplEntryPoint,
+;   IN  EFI_PHYSICAL_ADDRESS  DxeCoreEntryPoint
+;   )
+;
+; Input:  [ebp][0h]  = Original ebp
+;         [ebp][4h]  = Return address
+;         [ebp][8h]  = PageTables
+;         [ebp][10h] = HobStart
+;         [ebp][18h] = Stack
+;         [ebp][20h] = CodeEntryPoint1 <--- Call this first (for each call, pass HOB pointer)
+;         [ebp][28h] = CodeEntryPoint2 <--- Call this second
+;
+;
+_ActivateLongMode  PROC Near Public
+    push    ebp               ; C prolog
+    mov     ebp, esp
+
+    ;
+    ; Use CPUID to determine if the processor supports long mode.
+    ;
+    mov     eax, 80000000h  ; Extended-function code 8000000h.
+    cpuid                   ; Is largest extended function
+    cmp     eax, 80000000h  ; any function > 80000000h?
+    jbe     no_long_mode    ; If not, no long mode.
+    mov     eax, 80000001h  ; Extended-function code 8000001h.
+    cpuid                   ; Now EDX = extended-features flags.
+    bt      edx, 29         ; Test if long mode is supported.
+    jnc     no_long_mode    ; Exit if not supported.
+
+    ;
+    ; Enable the 64-bit page-translation-table entries by
+    ; setting CR4.PAE=1 (this is _required_ before activating
+    ; long mode). Paging is not enabled until after long mode
+    ; is enabled.
+    ;
+    mov eax, cr4
+    bts eax, 5
+    mov cr4, eax
+
+    ;
+    ; Get the long-mode page tables, and initialize the
+    ; 64-bit CR3 (page-table base address) to point to the base
+    ; of the PML4 page table. The PML4 page table must be located
+    ; below 4 Gbytes because only 32 bits of CR3 are loaded when
+    ; the processor is not in 64-bit mode.
+    ;
+    mov eax, [ebp+8h]       ; Get Page Tables
+    mov cr3, eax            ; Initialize CR3 with PML4 base.
+
+    ;
+    ; Enable long mode (set EFER.LME=1).
+    ;
+    mov ecx, 0c0000080h ; EFER MSR number.
+    rdmsr               ; Read EFER.
+    bts eax, 8          ; Set LME=1.
+    wrmsr               ; Write EFER.
+
+    ;
+    ; Enable paging to activate long mode (set CR0.PG=1)
+    ;
+   
+   
+    mov eax, cr0 ; Read CR0.
+    bts eax, 31  ; Set PG=1.
+    mov cr0, eax ; Write CR0.
+    jmp   go_to_long_mode
+go_to_long_mode:
+
+    ;
+    ; This is the next instruction after enabling paging.  Jump to long mode
+    ;
+    db      067h
+    db      0eah              ; Far Jump Offset:Selector to reload CS
+    dd      OFFSET in_long_mode;   Offset is ensuing instruction boundary
+    dw      SYS_CODE64_SEL    ;   Selector is our code selector, 10h
+in_long_mode::
+    mov     ax, SYS_DATA64_SEL
+    mov     es, ax
+    mov     ss, ax
+    mov     ds, ax
+;;    jmp     $
+    
+           
+    ;
+    ; We're in long mode, so marshall the arguments to call the
+    ; passed in function pointers
+    ; Recall
+    ;         [ebp][10h] = HobStart
+    ;         [ebp][18h] = Stack
+    ;         [ebp][20h] = PpisNeededByDxeIplEntryPoint <--- Call this first (for each call, pass HOB pointer)
+    ;         [ebp][28h] = DxeCoreEntryPoint            <--- Call this second
+    ;
+    db  48h
+    mov ebx, [ebp+18h]        ; Setup the stack
+    db  48h
+    mov esp, ebx              ; On a new stack now
+
+
+;; 00000905  FF D0                 call rax
+
+    db  48h
+    mov ecx, [ebp+10h]        ; Pass Hob Start in RCX
+    db  48h
+    mov eax, [ebp+28h]        ; Get the function pointer for 
+                              ; DxeCoreEntryPoint into EAX
+
+;; 00000905  FF D0                 call rax
+    db 0ffh
+    db 0d0h
+
+    ;
+    ; WE SHOULD NEVER GET HERE!!!!!!!!!!!!!
+    ;
+no_long_mode:
+    jmp   no_long_mode
+_ActivateLongMode endp
+
+        align 16
+
+gdtr    dw GDT_END - GDT_BASE - 1   ; GDT limit
+        dd OFFSET GDT_BASE          ; (GDT base gets set above)
+
+;-----------------------------------------------------------------------------;
+;   global descriptor table (GDT)
+;-----------------------------------------------------------------------------;
+
+        align 16
+
+public GDT_BASE
+GDT_BASE:
+; null descriptor
+NULL_SEL            equ $-GDT_BASE    ; Selector [0]
+        dw 0            ; limit 15:0
+        dw 0            ; base 15:0
+        db 0            ; base 23:16
+        db 0            ; type
+        db 0            ; limit 19:16, flags
+        db 0            ; base 31:24
+
+; linear data segment descriptor
+LINEAR_SEL      equ $-GDT_BASE        ; Selector [0x8]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 092h         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; linear code segment descriptor
+LINEAR_CODE_SEL equ $-GDT_BASE        ; Selector [0x10]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 09Fh         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; system data segment descriptor
+SYS_DATA_SEL    equ $-GDT_BASE        ; Selector [0x18]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 093h         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; system code segment descriptor
+SYS_CODE_SEL    equ $-GDT_BASE        ; Selector [0x20]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 09Ah         ; present, ring 0, data, expand-up, writable
+        db 0CFh                 ; page-granular, 32-bit
+        db 0
+
+; spare segment descriptor
+SPARE3_SEL  equ $-GDT_BASE            ; Selector [0x28]
+        dw 0            ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 0            ; present, ring 0, data, expand-up, writable
+        db 0            ; page-granular, 32-bit
+        db 0
+
+;
+; system data segment descriptor
+;
+SYS_DATA64_SEL    equ $-GDT_BASE          ; Selector [0x30]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 092h         ; P | DPL [1..2] | 1   | 1   | C | R | A
+        db 0CFh         ; G | D   | L    | AVL | Segment [19..16]
+        db 0
+
+;
+; system code segment descriptor
+;
+SYS_CODE64_SEL    equ $-GDT_BASE          ; Selector [0x38]
+        dw 0FFFFh       ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 09Ah         ; P | DPL [1..2] | 1   | 1   | C | R | A
+        db 0AFh         ; G | D   | L    | AVL | Segment [19..16]
+        db 0
+
+; spare segment descriptor
+SPARE4_SEL  equ $-GDT_BASE            ; Selector [0x40]
+        dw 0            ; limit 0xFFFFF
+        dw 0            ; base 0
+        db 0
+        db 0            ; present, ring 0, data, expand-up, writable
+        db 0            ; page-granular, 32-bit
+        db 0
+
+GDT_END:
+
+END
+
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.c b/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.c
new file mode 100644 (file)
index 0000000..ef9c3b6
--- /dev/null
@@ -0,0 +1,160 @@
+/*++\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
+  VirtualMemory.c\r
+  \r
+Abstract:\r
+\r
+  x64 Virtual Memory Management Services in the form of an IA-32 driver.  \r
+  Used to establish a 1:1 Virtual to Physical Mapping that is required to\r
+  enter Long Mode (x64 64-bit mode).\r
+\r
+  While we make a 1:1 mapping (identity mapping) for all physical pages \r
+  we still need to use the MTRR's to ensure that the cachability attirbutes\r
+  for all memory regions is correct.\r
+\r
+  The basic idea is to use 2MB page table entries where ever possible. If\r
+  more granularity of cachability is required then 4K page tables are used.\r
+\r
+  References:\r
+    1) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 1:Basic Architecture, Intel\r
+    2) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel\r
+    3) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel\r
+  \r
+--*/  \r
+\r
+#include "VirtualMemory.h"\r
+\r
+EFI_PHYSICAL_ADDRESS\r
+CreateIdentityMappingPageTables (\r
+  VOID\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Allocates and fills in the Page Directory and Page Table Entries to\r
+  establish a 1:1 Virtual to Physical mapping.\r
+\r
+Arguments:\r
+\r
+  NumberOfProcessorPhysicalAddressBits - Number of processor address bits to use.\r
+                                         Limits the number of page table entries \r
+                                         to the physical address space.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           The 1:1 Virtual to Physical identity mapping was created\r
+\r
+--*/\r
+{  \r
+  UINT32                                        RegEax;\r
+  UINT8                                         PhysicalAddressBits;\r
+  EFI_PHYSICAL_ADDRESS                          PageAddress;\r
+  UINTN                                         IndexOfPml4Entries;\r
+  UINTN                                         IndexOfPdpEntries;\r
+  UINTN                                         IndexOfPageDirectoryEntries;\r
+  UINTN                                         NumberOfPml4EntriesNeeded;\r
+  UINTN                                         NumberOfPdpEntriesNeeded;\r
+  PAGE_MAP_AND_DIRECTORY_POINTER                *PageMapLevel4Entry;\r
+  PAGE_MAP_AND_DIRECTORY_POINTER                *PageMap;\r
+  PAGE_MAP_AND_DIRECTORY_POINTER                *PageDirectoryPointerEntry;\r
+  PAGE_TABLE_ENTRY                              *PageDirectoryEntry;\r
+\r
+  //\r
+  // By architecture only one PageMapLevel4 exists - so lets allocate storage for it.\r
+  //\r
+  PageMap = AllocatePages (1);\r
+  ASSERT (PageMap != NULL);\r
+\r
+  //\r
+  // Get physical address bits supported.\r
+  //\r
+  AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
+  if (RegEax >= 0x80000008) {\r
+    AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
+    PhysicalAddressBits = (UINT8) RegEax;\r
+  } else {\r
+    PhysicalAddressBits = 36;\r
+  }\r
+\r
+  //\r
+  // Calculate the table entries needed.\r
+  //\r
+  if (PhysicalAddressBits <= 39 ) {\r
+    NumberOfPml4EntriesNeeded = 1;\r
+    NumberOfPdpEntriesNeeded =  1 << (PhysicalAddressBits - 30);\r
+  } else {\r
+    NumberOfPml4EntriesNeeded = 1 << (PhysicalAddressBits - 39);\r
+    NumberOfPdpEntriesNeeded = 512;\r
+  }\r
+\r
+  PageMapLevel4Entry = PageMap;\r
+  PageAddress        = 0;\r
+  for (IndexOfPml4Entries = 0; IndexOfPml4Entries < NumberOfPml4EntriesNeeded; IndexOfPml4Entries++, PageMapLevel4Entry++) {\r
+    //\r
+    // Each PML4 entry points to a page of Page Directory Pointer entires.\r
+    // So lets allocate space for them and fill them in in the IndexOfPdpEntries loop.\r
+    //\r
+    PageDirectoryPointerEntry = AllocatePages (1);\r
+    ASSERT (PageDirectoryPointerEntry != NULL);\r
+\r
+    //\r
+    // Make a PML4 Entry\r
+    //\r
+    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry;\r
+    PageMapLevel4Entry->Bits.ReadWrite = 1;\r
+    PageMapLevel4Entry->Bits.Present = 1;\r
+\r
+    for (IndexOfPdpEntries = 0; IndexOfPdpEntries < NumberOfPdpEntriesNeeded; IndexOfPdpEntries++, PageDirectoryPointerEntry++) {\r
+      //\r
+      // Each Directory Pointer entries points to a page of Page Directory entires.\r
+      // So allocate space for them and fill them in in the IndexOfPageDirectoryEntries loop.\r
+      //       \r
+      PageDirectoryEntry = AllocatePages (1);\r
+      ASSERT (PageDirectoryEntry != NULL);\r
+\r
+      //\r
+      // Fill in a Page Directory Pointer Entries\r
+      //\r
+      PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry;\r
+      PageDirectoryPointerEntry->Bits.ReadWrite = 1;\r
+      PageDirectoryPointerEntry->Bits.Present = 1;\r
+\r
+      for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PageAddress += 0x200000) {\r
+        //\r
+        // Fill in the Page Directory entries\r
+        //\r
+        PageDirectoryEntry->Uint64 = (UINT64)PageAddress;\r
+        PageDirectoryEntry->Bits.ReadWrite = 1;\r
+        PageDirectoryEntry->Bits.Present = 1;\r
+        PageDirectoryEntry->Bits.MustBe1 = 1;\r
+\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // For the PML4 entries we are not using fill in a null entry.\r
+  // For now we just copy the first entry.\r
+  //\r
+  for (; IndexOfPml4Entries < 512; IndexOfPml4Entries++, PageMapLevel4Entry++) {\r
+     CopyMem (\r
+       PageMapLevel4Entry,\r
+       PageMap,\r
+       sizeof (PAGE_MAP_AND_DIRECTORY_POINTER)\r
+       );\r
+  }\r
+\r
+  return (EFI_PHYSICAL_ADDRESS) (UINTN)PageMap; // FIXME\r
+}\r
+\r
diff --git a/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.h b/EdkModulePkg/Core/DxeIplPeim/Ia32/VirtualMemory.h
new file mode 100644 (file)
index 0000000..ddb504a
--- /dev/null
@@ -0,0 +1,86 @@
+/*++ \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
+  VirtualMemory.h\r
+  \r
+Abstract:\r
+\r
+  x64 Long Mode Virtual Memory Management Definitions  \r
+\r
+  References:\r
+    1) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 1:Basic Architecture, Intel\r
+    2) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel\r
+    3) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel\r
+    4) AMD64 Architecture Programmer's Manual Volume 2: System Programming\r
+--*/  \r
+#ifndef _VIRTUAL_MEMORY_H_\r
+#define _VIRTUAL_MEMORY_H_\r
+\r
+\r
+#pragma pack(1)\r
+\r
+//\r
+// Page-Map Level-4 Offset (PML4) and\r
+// Page-Directory-Pointer Offset (PDPE) entries 4K & 2MB\r
+//\r
+\r
+typedef union {\r
+  struct {\r
+    UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory\r
+    UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write\r
+    UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User\r
+    UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching\r
+    UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached\r
+    UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)\r
+    UINT64  Reserved:1;               // Reserved\r
+    UINT64  MustBeZero:2;             // Must Be Zero\r
+    UINT64  Available:3;              // Available for use by system software\r
+    UINT64  PageTableBaseAddress:40;  // Page Table Base Address\r
+    UINT64  AvabilableHigh:11;        // Available for use by system software\r
+    UINT64  Nx:1;                     // No Execute bit\r
+  } Bits;\r
+  UINT64    Uint64;\r
+} PAGE_MAP_AND_DIRECTORY_POINTER;\r
+\r
+//\r
+// Page Table Entry 2MB\r
+//\r
+typedef union {\r
+  struct {\r
+    UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory\r
+    UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write\r
+    UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User\r
+    UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching\r
+    UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached\r
+    UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)\r
+    UINT64  Dirty:1;                  // 0 = Not Dirty, 1 = written by processor on access to page\r
+    UINT64  MustBe1:1;                // Must be 1 \r
+    UINT64  Global:1;                 // 0 = Not global page, 1 = global page TLB not cleared on CR3 write\r
+    UINT64  Available:3;              // Available for use by system software\r
+    UINT64  PAT:1;                    //\r
+    UINT64  MustBeZero:8;             // Must be zero;\r
+    UINT64  PageTableBaseAddress:31;  // Page Table Base Address\r
+    UINT64  AvabilableHigh:11;        // Available for use by system software\r
+    UINT64  Nx:1;                     // 0 = Execute Code, 1 = No Code Execution\r
+  } Bits;\r
+  UINT64    Uint64;\r
+} PAGE_TABLE_ENTRY;\r
+\r
+#pragma pack()\r
+\r
+EFI_PHYSICAL_ADDRESS\r
+CreateIdentityMappingPageTables (\r
+  VOID\r
+  )\r
+;\r
+\r
+#endif \r
index cdc418f6f309d31fbfdc33e5aab6c28373bf69d4..079ae924da9a181f7e800b28016c37a22483010e 100644 (file)
@@ -19,7 +19,7 @@ Abstract:
 \r
 --*/\r
 \r
-#include <DxeIpl.h>\r
+#include "DxeIpl.h"\r
 \r
 EFI_STATUS\r
 CreateArchSpecificHobs (\r
index 16b44b24d80cafde00b69da7e85738199055f854..3131533b2abdc58fc9796e59a994175da1e4513b 100644 (file)
@@ -17,7 +17,7 @@ Abstract:
 \r
 --*/\r
 \r
-#include <DxeIpl.h>\r
+#include "DxeIpl.h"\r
 \r
 EFI_STATUS\r
 PeiImageRead (\r
diff --git a/EdkModulePkg/Core/DxeIplPeim/Non-existing.c b/EdkModulePkg/Core/DxeIplPeim/Non-existing.c
new file mode 100644 (file)
index 0000000..f9f7df7
--- /dev/null
@@ -0,0 +1,55 @@
+/** @file\r
+  Non-existing functions other than Ia32 architecture.\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:  Non-existing.c\r
+\r
+**/\r
+\r
+#include "DxeIpl.h"\r
+\r
+EFI_PHYSICAL_ADDRESS\r
+CreateIdentityMappingPageTables (\r
+  IN UINT32                NumberOfProcessorPhysicalAddressBits\r
+  )\r
+{\r
+  //\r
+  // This function cannot work on non-Ia32 architecture.\r
+  //\r
+  ASSERT (FALSE);\r
+  return 0;\r
+}\r
+\r
+VOID\r
+ActivateLongMode (\r
+  IN  EFI_PHYSICAL_ADDRESS  PageTables,\r
+  IN  EFI_PHYSICAL_ADDRESS  HobStart,\r
+  IN  EFI_PHYSICAL_ADDRESS  Stack,\r
+  IN  EFI_PHYSICAL_ADDRESS  CodeEntryPoint1,\r
+  IN  EFI_PHYSICAL_ADDRESS  CodeEntryPoint2\r
+  )\r
+{\r
+  //\r
+  // This function cannot work on non-Ia32 architecture.\r
+  //\r
+  ASSERT (FALSE);\r
+}\r
+\r
+VOID\r
+LoadGo64Gdt(\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // This function cannot work on non-Ia32 architecture.\r
+  //\r
+  ASSERT (FALSE);\r
+}\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.dxs b/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.dxs
deleted file mode 100644 (file)
index 6370d86..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*++\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
-  DxeIpl.dxs\r
-\r
-Abstract:\r
-\r
-  Dependency expression file for DXE Initial Program Loader PEIM.\r
-  \r
---*/  \r
-\r
-#include <AutoGen.h>\r
-#include <PeimDepex.h>\r
-\r
-DEPENDENCY_START\r
-   EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI_GUID\r
-DEPENDENCY_END\r
-\r
-\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.h b/EdkModulePkg/Core/DxeIplX64Peim/DxeIpl.h
deleted file mode 100644 (file)
index 5068cb6..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*++\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
-  DxeIpl.h\r
-\r
-Abstract:\r
-\r
---*/\r
-\r
-#ifndef __PEI_DXEIPL_H__\r
-#define __PEI_DXEIPL_H__\r
-\r
-#define STACK_SIZE      0x20000\r
-#define BSP_STORE_SIZE  0x4000\r
-\r
-extern BOOLEAN gInMemory;\r
-\r
-VOID\r
-SwitchIplStacks (\r
-  VOID  *EntryPoint,\r
-  UINTN Parameter1,\r
-  UINTN Parameter2,\r
-  VOID  *NewStack,\r
-  VOID  *NewBsp\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-PeiFindFile (\r
-  IN  UINT8                  Type,\r
-  IN  UINT16                 SectionType,\r
-  OUT EFI_GUID               *FileName,\r
-  OUT VOID                   **Pe32Data\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-PeiLoadFile (\r
-  IN  EFI_PEI_PE_COFF_LOADER_PROTOCOL           *PeiEfiPeiPeCoffLoader,\r
-  IN  VOID                                      *Pe32Data,\r
-  OUT EFI_PHYSICAL_ADDRESS                      *ImageAddress,\r
-  OUT UINT64                                    *ImageSize,\r
-  OUT EFI_PHYSICAL_ADDRESS                      *EntryPoint\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
-  )\r
-;\r
-\r
-EFI_STATUS\r
-PeiImageRead (\r
-  IN     VOID    *FileHandle,\r
-  IN     UINTN   FileOffset,\r
-  IN OUT UINTN   *ReadSize,\r
-  OUT    VOID    *Buffer\r
-  )\r
-;\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeIplLoadFile (\r
-  IN EFI_PEI_FV_FILE_LOADER_PPI                 *This,\r
-  IN  EFI_FFS_FILE_HEADER                       *FfsHeader,\r
-  OUT EFI_PHYSICAL_ADDRESS                      *ImageAddress,\r
-  OUT UINT64                                    *ImageSize,\r
-  OUT EFI_PHYSICAL_ADDRESS                      *EntryPoint\r
-  );\r
-\r
-EFI_STATUS\r
-ShadowDxeIpl (\r
-  IN EFI_FFS_FILE_HEADER                       *DxeIpl,\r
-  IN EFI_PEI_PE_COFF_LOADER_PROTOCOL           *PeiEfiPeiPeCoffLoader\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeLoadCore (\r
-  IN EFI_DXE_IPL_PPI       *This,\r
-  IN EFI_PEI_SERVICES      **PeiServices,\r
-  IN EFI_PEI_HOB_POINTERS  HobList\r
-  );\r
-\r
-EFI_STATUS\r
-PeiProcessFile (\r
-  IN      UINT16                 SectionType,\r
-  IN      EFI_FFS_FILE_HEADER    *FfsFileHeader,\r
-  OUT     VOID                   **Pe32Data,\r
-  IN      EFI_PEI_HOB_POINTERS   *OrigHob\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeimInitializeDxeIpl (\r
-  IN EFI_FFS_FILE_HEADER       *FfsHeader,\r
-  IN EFI_PEI_SERVICES          **PeiServices\r
-  );\r
-\r
-EFI_STATUS\r
-PeiLoadPeImage (\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
-  )\r
-;\r
-\r
-VOID\r
-ActivateLongMode (\r
-  IN  EFI_PHYSICAL_ADDRESS  PageTables,  \r
-  IN  EFI_PHYSICAL_ADDRESS  HobStart,\r
-  IN  EFI_PHYSICAL_ADDRESS  Stack,\r
-  IN  EFI_PHYSICAL_ADDRESS  CodeEntryPoint1,\r
-  IN  EFI_PHYSICAL_ADDRESS  CodeEntryPoint2\r
-  );\r
-\r
-VOID\r
-LoadGo64Gdt();\r
-\r
-#endif\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeIplX64.msa b/EdkModulePkg/Core/DxeIplX64Peim/DxeIplX64.msa
deleted file mode 100644 (file)
index d9fcb9d..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
-  <MsaHeader>\r
-    <ModuleName>DxeIplX64</ModuleName>\r
-    <ModuleType>PEIM</ModuleType>\r
-    <GuidValue>0c55bdf7-d71d-4962-8fcb-348773e48929</GuidValue>\r
-    <Version>1.0</Version>\r
-    <Abstract>Component description file for DxeIplX64 module</Abstract>\r
-    <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>\r
-    <Copyright>Copyright 2006, Intel Corporation</Copyright>\r
-    <License>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
-      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.</License>\r
-    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
-  </MsaHeader>\r
-  <ModuleDefinitions>\r
-    <SupportedArchitectures>IA32</SupportedArchitectures>\r
-    <BinaryModule>false</BinaryModule>\r
-    <OutputFileBasename>DxeIplX64</OutputFileBasename>\r
-  </ModuleDefinitions>\r
-  <LibraryClassDefinitions>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>DebugLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>PeimEntryPoint</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>BaseLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>HobLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>PeiServicesLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>ReportStatusCodeLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>CacheMaintenanceLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>EdkPeCoffLoaderLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>UefiDecompressLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>TianoDecompressLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>CustomDecompressLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>PeiServicesTablePointerLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>BaseMemoryLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>MemoryAllocationLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>PcdLib</Keyword>\r
-    </LibraryClass>\r
-  </LibraryClassDefinitions>\r
-  <SourceFiles>\r
-    <Filename>DxeIpl.dxs</Filename>\r
-    <Filename>DxeIpl.h</Filename>\r
-    <Filename>DxeLoadX64.c</Filename>\r
-    <Filename SupArchList="IA32">x64/ImageRead.c</Filename>\r
-    <Filename SupArchList="IA32">x64/LongMode.asm</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="gcc">x64/LongMode.S</Filename>\r
-    <Filename SupArchList="IA32">x64/DxeLoadFunc.c</Filename>\r
-    <Filename SupArchList="IA32">x64/VirtualMemory.h</Filename>\r
-    <Filename SupArchList="IA32">x64/VirtualMemory.c</Filename>\r
-  </SourceFiles>\r
-  <PackageDependencies>\r
-    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
-    <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>\r
-  </PackageDependencies>\r
-  <Protocols>\r
-    <Protocol Usage="ALWAYS_CONSUMED">\r
-      <ProtocolCName>gEfiDecompressProtocolGuid</ProtocolCName>\r
-    </Protocol>\r
-    <Protocol Usage="ALWAYS_CONSUMED">\r
-      <ProtocolCName>gEfiTianoDecompressProtocolGuid</ProtocolCName>\r
-    </Protocol>\r
-    <Protocol Usage="ALWAYS_CONSUMED">\r
-      <ProtocolCName>gEfiCustomizedDecompressProtocolGuid</ProtocolCName>\r
-    </Protocol>\r
-  </Protocols>\r
-  <PPIs>\r
-    <Ppi Usage="SOMETIMES_PRODUCED">\r
-      <PpiCName>gEfiDxeIplPpiGuid</PpiCName>\r
-    </Ppi>\r
-    <Ppi Usage="SOMETIMES_PRODUCED">\r
-      <PpiCName>gEfiPeiFvFileLoaderPpiGuid</PpiCName>\r
-    </Ppi>\r
-    <Ppi Usage="SOMETIMES_PRODUCED">\r
-      <PpiCName>gEfiEndOfPeiSignalPpiGuid</PpiCName>\r
-    </Ppi>\r
-    <Ppi Usage="SOMETIMES_CONSUMED">\r
-      <PpiCName>gEfiPeiRecoveryModulePpiGuid</PpiCName>\r
-    </Ppi>\r
-    <Ppi Usage="SOMETIMES_CONSUMED">\r
-      <PpiCName>gEfiPeiS3ResumePpiGuid</PpiCName>\r
-    </Ppi>\r
-    <Ppi Usage="SOMETIMES_CONSUMED">\r
-      <PpiCName>gEfiPeiSectionExtractionPpiGuid</PpiCName>\r
-    </Ppi>\r
-    <Ppi Usage="SOMETIMES_CONSUMED">\r
-      <PpiCName>gEfiPeiSecurityPpiGuid</PpiCName>\r
-    </Ppi>\r
-  </PPIs>\r
-  <Guids>\r
-    <GuidCNames Usage="ALWAYS_CONSUMED">\r
-      <GuidCName>gEfiPeiPeCoffLoaderGuid</GuidCName>\r
-    </GuidCNames>\r
-  </Guids>\r
-  <Externs>\r
-    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
-    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
-    <Extern>\r
-      <ModuleEntryPoint>PeimInitializeDxeIpl</ModuleEntryPoint>\r
-    </Extern>\r
-  </Externs>\r
-  <PcdCoded>\r
-    <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
-      <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
-      <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <DefaultValue>TRUE</DefaultValue>\r
-      <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the EFI Compression algorithm</HelpText>\r
-    </PcdEntry>\r
-    <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
-      <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>\r
-      <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <DefaultValue>TRUE</DefaultValue>\r
-      <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Tiano Compression algorithm</HelpText>\r
-    </PcdEntry>\r
-    <PcdEntry PcdItemType="FEATURE_FLAG" Usage="ALWAYS_CONSUMED">\r
-      <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>\r
-      <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <DefaultValue>TRUE</DefaultValue>\r
-      <HelpText>If this feature is enabled, then the DXE IPL must support decompressing files compressed with the Custom Compression algorithm</HelpText>\r
-    </PcdEntry>\r
-  </PcdCoded>\r
-</ModuleSurfaceArea>\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/DxeLoadX64.c b/EdkModulePkg/Core/DxeIplX64Peim/DxeLoadX64.c
deleted file mode 100644 (file)
index 57ffb28..0000000
+++ /dev/null
@@ -1,1046 +0,0 @@
-/*++\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
-  DxeLoad.c\r
-\r
-Abstract:\r
-\r
-  Last PEIM.\r
-  Responsibility of this module is to load the DXE Core from a Firmware Volume.\r
-\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
-// Module Globals used in the DXE to PEI handoff\r
-// These must be module globals, so the stack can be switched\r
-//\r
-static EFI_DXE_IPL_PPI mDxeIplPpi = {\r
-  DxeLoadCore\r
-};\r
-\r
-static EFI_PEI_FV_FILE_LOADER_PPI mLoadFilePpi = {\r
-  DxeIplLoadFile\r
-};\r
-\r
-static EFI_PEI_PPI_DESCRIPTOR     mPpiLoadFile = {\r
-  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
-  &gEfiPeiFvFileLoaderPpiGuid,\r
-  &mLoadFilePpi\r
-};\r
-\r
-static EFI_PEI_PPI_DESCRIPTOR     mPpiList = {\r
-  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
-  &gEfiDxeIplPpiGuid,\r
-  &mDxeIplPpi\r
-};\r
-\r
-static EFI_PEI_PPI_DESCRIPTOR     mPpiSignal = {\r
-  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
-  &gEfiEndOfPeiSignalPpiGuid,\r
-  NULL\r
-};\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY  gEfiDecompress = {\r
-  UefiDecompressGetInfo,\r
-  UefiDecompress\r
-};\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY  gTianoDecompress = {\r
-  TianoDecompressGetInfo,\r
-  TianoDecompress\r
-};\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED DECOMPRESS_LIBRARY  gCustomDecompress = {\r
-  CustomDecompressGetInfo,\r
-  CustomDecompress\r
-};\r
-\r
-STATIC\r
-UINTN\r
-GetOccupiedSize (\r
-  IN UINTN   ActualSize,\r
-  IN UINTN   Alignment\r
-  )\r
-{\r
-  UINTN OccupiedSize;\r
-\r
-  OccupiedSize = ActualSize;\r
-  while ((OccupiedSize & (Alignment - 1)) != 0) {\r
-    OccupiedSize++;\r
-  }\r
-\r
-  return OccupiedSize;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeimInitializeDxeIpl (\r
-  IN EFI_FFS_FILE_HEADER       *FfsHeader,\r
-  IN EFI_PEI_SERVICES          **PeiServices\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Initializes the Dxe Ipl PPI\r
-\r
-Arguments:\r
-\r
-  FfsHeader   - Pointer to FFS file header\r
-  PeiServices - General purpose services available to every PEIM.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
-{\r
-  EFI_STATUS                                Status;\r
-  EFI_PEI_PE_COFF_LOADER_PROTOCOL           *PeiEfiPeiPeCoffLoader;\r
-  EFI_BOOT_MODE                             BootMode;\r
-\r
-  Status = PeiServicesGetBootMode (&BootMode);\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  if (!gInMemory && (BootMode != BOOT_ON_S3_RESUME)) {   \r
-    //\r
-    // The DxeIpl has not yet been shadowed\r
-    //\r
-    PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();\r
-\r
-    //\r
-    // Shadow DxeIpl and then re-run its entry point\r
-    //\r
-    Status = ShadowDxeIpl (FfsHeader, PeiEfiPeiPeCoffLoader);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
-  } else {\r
-    if (BootMode != BOOT_ON_S3_RESUME) {\r
-\r
-    //\r
-    // Install LoadFile PPI\r
-    //\r
-    Status = PeiServicesInstallPpi (&mPpiLoadFile);\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-      }\r
-    }\r
-    //\r
-    // Install DxeIpl PPI\r
-    //\r
-    Status = PeiServicesInstallPpi (&mPpiList);\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeLoadCore (\r
-  IN EFI_DXE_IPL_PPI       *This,\r
-  IN EFI_PEI_SERVICES      **PeiServices,\r
-  IN EFI_PEI_HOB_POINTERS  HobList\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Main entry point to last PEIM\r
-\r
-Arguments:\r
-\r
-  This         - Entry point for DXE IPL PPI\r
-  PeiServices  - General purpose services available to every PEIM.\r
-  HobList      - Address to the Pei HOB list\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS          - DEX core was successfully loaded.\r
-  EFI_OUT_OF_RESOURCES - There are not enough resources to load DXE core.\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                                                      *DxeCorePe32Data;\r
-  VOID                                                      *FvImageData;     \r
-  EFI_PHYSICAL_ADDRESS                                      DxeCoreAddress;\r
-  UINT64                                                    DxeCoreSize;\r
-  EFI_PHYSICAL_ADDRESS                                      DxeCoreEntryPoint;\r
-  EFI_PEI_PE_COFF_LOADER_PROTOCOL                           *PeiEfiPeiPeCoffLoader;\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
-  TopOfStack  = 0;\r
-  BaseOfStack = 0;\r
-  BspStore    = 0;\r
-  Status      = EFI_SUCCESS;\r
-\r
-  //\r
-  // if in S3 Resume, restore configure\r
-  //\r
-  Status = PeiServicesGetBootMode (&BootMode);\r
-\r
-  if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) {\r
-    Status = PeiServicesLocatePpi (\r
-               &gEfiPeiS3ResumePpiGuid,\r
-               0,\r
-               NULL,\r
-               (VOID **)&S3Resume\r
-               );\r
-\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
-    Status = S3Resume->S3RestoreConfig (PeiServices);\r
-\r
-    ASSERT_EFI_ERROR (Status);\r
-  }\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  //\r
-  // Install the PEI Protocols that are shared between PEI and DXE\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
-  // 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
-  //\r
-  // Add architecture-specifc HOBs (including the BspStore HOB)\r
-  //\r
-  Status = CreateArchSpecificHobs (&BspStore);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // See if we are in crisis recovery\r
-  //\r
-  Status = PeiServicesGetBootMode (&BootMode);\r
-  if (!EFI_ERROR (Status) && (BootMode == BOOT_IN_RECOVERY_MODE)) {\r
-    Status = PeiServicesLocatePpi (\r
-               &gEfiPeiRecoveryModulePpiGuid,\r
-               0,\r
-               NULL,\r
-               (VOID **)&PeiRecovery\r
-               );\r
-\r
-    ASSERT_EFI_ERROR (Status);\r
-    Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);\r
-    if (EFI_ERROR (Status)) {\r
-      DEBUG ((EFI_D_ERROR, "Load Recovery Capsule Failed.(Status = %r)\n", Status));\r
-      CpuDeadLoop ();\r
-    }\r
-  }\r
-\r
-  //\r
-  // Find the EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE type compressed Firmware Volume file\r
-  // The file found will be processed by PeiProcessFile: It will first be decompressed to\r
-  // a normal FV, then a corresponding FV type hob will be built. \r
-  //\r
-  Status = PeiFindFile (\r
-            EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,\r
-            EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
-            &FirmwareFileName,\r
-            &FvImageData\r
-            );\r
-\r
-  //\r
-  // Find the DXE Core in a Firmware Volume\r
-  //\r
-  Status = PeiFindFile (\r
-             EFI_FV_FILETYPE_DXE_CORE,\r
-             EFI_SECTION_PE32,\r
-             &DxeCoreFileName,\r
-             &DxeCorePe32Data\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
-  // memory, it may be corrupted when copying FV to high-end memory \r
-  //\r
-  LoadGo64Gdt();\r
-\r
-  //\r
-  // Limit to 36 bits of addressing for debug. Should get it from CPU\r
-  //\r
-  PageTables = CreateIdentityMappingPageTables (36);\r
-\r
-\r
-  //\r
-  // Load the DXE Core from a Firmware Volume\r
-  //\r
-  Status = PeiLoadPeImage (\r
-             PeiEfiPeiPeCoffLoader,\r
-             DxeCorePe32Data,\r
-             EfiBootServicesData,\r
-             &DxeCoreAddress,\r
-             &DxeCoreSize,\r
-             &DxeCoreEntryPoint\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // Transfer control to the DXE Core\r
-  // The handoff state is simply a pointer to the HOB list\r
-  //\r
-\r
-  Status = PeiServicesInstallPpi (&mPpiSignal);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  //\r
-  // Add HOB for the DXE Core\r
-  //\r
-  BuildModuleHob (\r
-    &DxeCoreFileName,\r
-    DxeCoreAddress,\r
-    DxeCoreSize,\r
-    DxeCoreEntryPoint\r
-    );\r
-\r
-  //\r
-  // Report Status Code EFI_SW_PEI_PC_HANDOFF_TO_NEXT\r
-  //\r
-  REPORT_STATUS_CODE (\r
-    EFI_PROGRESS_CODE,\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
-  //\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
-\r
-  //\r
-  // If we get here, then the DXE Core returned.  This is an error\r
-  // Dxe Core should not return.\r
-  //\r
-  ASSERT (FALSE);\r
-  CpuDeadLoop ();\r
-\r
-  return EFI_OUT_OF_RESOURCES;\r
-}\r
-\r
-EFI_STATUS\r
-PeiFindFile (\r
-  IN  UINT8                  Type,\r
-  IN  UINT16                 SectionType,\r
-  OUT EFI_GUID               *FileName,\r
-  OUT VOID                   **Pe32Data\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Finds a PE/COFF of a specific Type and SectionType in the Firmware Volumes\r
-  described in the HOB list. Able to search in a compression set in a FFS file.\r
-  But only one level of compression is supported, that is, not able to search\r
-  in a compression set that is within another compression set.\r
-\r
-Arguments:\r
-\r
-  Type        - The Type of file to retrieve\r
-\r
-  SectionType - The type of section to retrieve from a file\r
-\r
-  FileName    - The name of the file found in the Firmware Volume\r
-\r
-  Pe32Data    - Pointer to the beginning of the PE/COFF file found in the Firmware Volume\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS   - The file was found, and the name is returned in FileName, and a pointer to\r
-                  the PE/COFF image is returned in Pe32Data\r
-\r
-  EFI_NOT_FOUND - The file was not found in the Firmware Volumes present in the HOB List\r
-\r
---*/\r
-{\r
-  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader;\r
-  EFI_FFS_FILE_HEADER         *FfsFileHeader;\r
-  VOID                        *SectionData;\r
-  EFI_STATUS                  Status;\r
-  EFI_PEI_HOB_POINTERS        Hob;\r
-\r
-\r
-  FwVolHeader   = NULL;\r
-  FfsFileHeader = NULL;\r
-  SectionData   = NULL;\r
-  Status        = EFI_SUCCESS;\r
-\r
-  //\r
-  // For each Firmware Volume, look for a specified type\r
-  // of file and break out until no one is found \r
-  //\r
-  Hob.Raw = GetHobList ();\r
-  while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw)) != NULL) {\r
-    FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (Hob.FirmwareVolume->BaseAddress);\r
-    Status = PeiServicesFfsFindNextFile (\r
-               Type,\r
-               FwVolHeader,\r
-               &FfsFileHeader\r
-               );\r
-    if (!EFI_ERROR (Status)) {\r
-      Status = PeiProcessFile (\r
-                 SectionType,\r
-                 FfsFileHeader,\r
-                 Pe32Data,\r
-                 &Hob\r
-                 );\r
-      CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));\r
-      if (!EFI_ERROR (Status)) {\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-    Hob.Raw = GET_NEXT_HOB (Hob);\r
-  }\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-EFI_STATUS\r
-PeiLoadPeImage (\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
-Routine Description:\r
-\r
-  Loads and relocates a PE/COFF image into memory.\r
-\r
-Arguments:\r
-\r
-  PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol\r
-\r
-  Pe32Data         - The base address of the PE/COFF file that is to be loaded and relocated\r
-\r
-  ImageAddress     - The base address of the relocated PE/COFF image\r
-\r
-  ImageSize        - The size of the relocated PE/COFF image\r
-\r
-  EntryPoint       - The entry point of the relocated PE/COFF image\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS                     - The file was loaded and relocated\r
-  EFI_OUT_OF_RESOURCES            - There was not enough memory to load and relocate the PE/COFF file\r
-\r
---*/\r
-{\r
-  EFI_STATUS                            Status;\r
-  PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
-  EFI_PHYSICAL_ADDRESS                  MemoryBuffer;\r
-\r
-  ZeroMem (&ImageContext, sizeof (ImageContext));\r
-  ImageContext.Handle = Pe32Data;\r
-  Status              = GetImageReadFunction (&ImageContext);\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  Status = PeiEfiPeiPeCoffLoader->GetImageInfo (PeiEfiPeiPeCoffLoader, &ImageContext);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // Allocate Memory for the image\r
-  //\r
-  //\r
-  // Allocate Memory for the image\r
-  //\r
-  PeiServicesAllocatePages (MemoryType, EFI_SIZE_TO_PAGES ((UINT32) ImageContext.ImageSize), &MemoryBuffer);\r
-  ImageContext.ImageAddress = MemoryBuffer;\r
-  ASSERT (ImageContext.ImageAddress != 0);\r
-\r
-  //\r
-  // Load the image to our new buffer\r
-  //\r
-\r
-  Status = PeiEfiPeiPeCoffLoader->LoadImage (PeiEfiPeiPeCoffLoader, &ImageContext);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  \r
-  //\r
-  // Relocate the image in our new buffer\r
-  //\r
-  Status = PeiEfiPeiPeCoffLoader->RelocateImage (PeiEfiPeiPeCoffLoader, &ImageContext);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Flush the instruction cache so the image data is written before we execute it\r
-  //\r
-  InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);\r
-\r
-  *ImageAddress = ImageContext.ImageAddress;\r
-  *ImageSize    = ImageContext.ImageSize;\r
-  *EntryPoint   = ImageContext.EntryPoint;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-ShadowDxeIpl (\r
-  IN EFI_FFS_FILE_HEADER                       *DxeIplFileHeader,\r
-  IN EFI_PEI_PE_COFF_LOADER_PROTOCOL           *PeiEfiPeiPeCoffLoader\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Shadow the DXE IPL to a different memory location. This occurs after permanent\r
-  memory has been discovered.\r
-\r
-Arguments:\r
-\r
-  DxeIplFileHeader      - Pointer to the FFS file header of the DXE IPL driver\r
-\r
-  PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS   - DXE IPL was successfully shadowed to a different memory location.\r
-\r
-  EFI_ ERROR    - The shadow was unsuccessful.\r
-\r
-\r
---*/\r
-{\r
-  UINTN                     SectionLength;\r
-  UINTN                     OccupiedSectionLength;\r
-  EFI_PHYSICAL_ADDRESS      DxeIplAddress;\r
-  UINT64                    DxeIplSize;\r
-  EFI_PHYSICAL_ADDRESS      DxeIplEntryPoint;\r
-  EFI_STATUS                Status;\r
-  EFI_COMMON_SECTION_HEADER *Section;\r
-\r
-  Section = (EFI_COMMON_SECTION_HEADER *) (DxeIplFileHeader + 1);\r
-\r
-  while ((Section->Type != EFI_SECTION_PE32) && (Section->Type != EFI_SECTION_TE)) {\r
-    SectionLength         = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
-    OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);\r
-    Section               = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);\r
-  }\r
-  \r
-  //\r
-  // Relocate DxeIpl into memory by using loadfile service\r
-  //\r
-  Status = PeiLoadPeImage (\r
-            PeiEfiPeiPeCoffLoader,\r
-            (VOID *) (Section + 1),\r
-            EfiBootServicesData,\r
-            &DxeIplAddress,\r
-            &DxeIplSize,\r
-            &DxeIplEntryPoint\r
-            );\r
\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // Set gInMemory global variable to TRUE to indicate the dxeipl is shadowed.\r
-    //\r
-    *(BOOLEAN *) ((UINTN) &gInMemory + (UINTN) DxeIplEntryPoint - (UINTN) _ModuleEntryPoint) = TRUE;\r
-    Status = ((EFI_PEIM_ENTRY_POINT) (UINTN) DxeIplEntryPoint) (DxeIplFileHeader, GetPeiServicesTablePointer());\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeIplLoadFile (\r
-  IN EFI_PEI_FV_FILE_LOADER_PPI                 *This,\r
-  IN  EFI_FFS_FILE_HEADER                       *FfsHeader,\r
-  OUT EFI_PHYSICAL_ADDRESS                      *ImageAddress,\r
-  OUT UINT64                                    *ImageSize,\r
-  OUT EFI_PHYSICAL_ADDRESS                      *EntryPoint\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Given a pointer to an FFS file containing a PE32 image, get the\r
-  information on the PE32 image, and then "load" it so that it\r
-  can be executed.\r
-\r
-Arguments:\r
-\r
-  This  - pointer to our file loader protocol\r
-  FfsHeader - pointer to the FFS file header of the FFS file that\r
-              contains the PE32 image we want to load\r
-  ImageAddress  - returned address where the PE32 image is loaded\r
-  ImageSize     - returned size of the loaded PE32 image\r
-  EntryPoint    - entry point to the loaded PE32 image\r
-\r
-Returns:\r
\r
-  EFI_SUCCESS  - The FFS file was successfully loaded.\r
-  EFI_ERROR    - Unable to load the FFS file.\r
-\r
---*/\r
-{\r
-  EFI_PEI_PE_COFF_LOADER_PROTOCOL           *PeiEfiPeiPeCoffLoader;\r
-  EFI_STATUS                                Status;\r
-  VOID                                      *Pe32Data;\r
-\r
-  Pe32Data = NULL;\r
-  PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();\r
-\r
-  //\r
-  // Preprocess the FFS file to get a pointer to the PE32 information\r
-  // in the enclosed PE32 image.\r
-  //\r
-  Status = PeiProcessFile (\r
-            EFI_SECTION_PE32,\r
-            FfsHeader,\r
-            &Pe32Data,\r
-            NULL\r
-            );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // Load the PE image from the FFS file\r
-  //\r
-  Status = PeiLoadPeImage (\r
-            PeiEfiPeiPeCoffLoader,\r
-            Pe32Data,\r
-            EfiBootServicesData,\r
-            ImageAddress,\r
-            ImageSize,\r
-            EntryPoint\r
-            );\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-PeiProcessFile (\r
-  IN      UINT16                 SectionType,\r
-  IN      EFI_FFS_FILE_HEADER    *FfsFileHeader,\r
-  OUT     VOID                   **Pe32Data,\r
-  IN      EFI_PEI_HOB_POINTERS   *OrigHob\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-  SectionType       - The type of section in the FFS file to process.\r
-\r
-  FfsFileHeader     - Pointer to the FFS file to process, looking for the\r
-                      specified SectionType\r
-\r
-  Pe32Data          - returned pointer to the start of the PE32 image found\r
-                      in the FFS file.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS       - found the PE32 section in the FFS file\r
-\r
---*/\r
-{\r
-  EFI_STATUS                      Status;\r
-  VOID                            *SectionData;\r
-  DECOMPRESS_LIBRARY              *DecompressLibrary;\r
-  UINT8                           *DstBuffer;\r
-  UINT8                           *ScratchBuffer;\r
-  UINT32                          DstBufferSize;\r
-  UINT32                          ScratchBufferSize;\r
-  EFI_COMMON_SECTION_HEADER       *CmpSection;\r
-  UINTN                           CmpSectionLength;\r
-  UINTN                           OccupiedCmpSectionLength;\r
-  VOID                            *CmpFileData;\r
-  UINTN                           CmpFileSize;\r
-  EFI_COMMON_SECTION_HEADER       *Section;\r
-  UINTN                           SectionLength;\r
-  UINTN                           OccupiedSectionLength;\r
-  UINT64                          FileSize;\r
-  EFI_GUID_DEFINED_SECTION        *GuidedSectionHeader;\r
-  UINT32                          AuthenticationStatus;\r
-  EFI_PEI_SECTION_EXTRACTION_PPI  *SectionExtract;\r
-  UINT32                          BufferSize;\r
-  UINT8                           *Buffer;\r
-  EFI_PEI_SECURITY_PPI            *Security;\r
-  BOOLEAN                         StartCrisisRecovery;\r
-  EFI_GUID                        TempGuid;\r
-  EFI_FIRMWARE_VOLUME_HEADER      *FvHeader;\r
-  EFI_COMPRESSION_SECTION         *CompressionSection;\r
-  UINT32                          FvAlignment;\r
-\r
-  Status = PeiServicesFfsFindSectionData (\r
-             EFI_SECTION_COMPRESSION,\r
-             FfsFileHeader,\r
-             &SectionData\r
-             );\r
-\r
-  //\r
-  // First process the compression section\r
-  //\r
-  if (!EFI_ERROR (Status)) {\r
-    //\r
-    // Yes, there is a compression section, so extract the contents\r
-    // Decompress the image here\r
-    //\r
-    Section = (EFI_COMMON_SECTION_HEADER *) (UINTN) (VOID *) ((UINT8 *) (FfsFileHeader) + (UINTN) sizeof (EFI_FFS_FILE_HEADER));\r
-\r
-    do {\r
-      SectionLength         = *(UINT32 *) (Section->Size) & 0x00ffffff;\r
-      OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);\r
-\r
-      //\r
-      // Was the DXE Core file encapsulated in a GUID'd section?\r
-      //\r
-      if (Section->Type == EFI_SECTION_GUID_DEFINED) {\r
-        //\r
-        // Locate the GUID'd Section Extractor\r
-        //\r
-        GuidedSectionHeader = (VOID *) (Section + 1);\r
-\r
-        //\r
-        // This following code constitutes the addition of the security model\r
-        // to the DXE IPL.\r
-        //\r
-        //\r
-        // Set a default authenticatino state\r
-        //\r
-        AuthenticationStatus = 0;\r
-\r
-        Status = PeiServicesLocatePpi (\r
-                   &gEfiPeiSectionExtractionPpiGuid,\r
-                   0,\r
-                   NULL,\r
-                   (VOID **)&SectionExtract\r
-                   );\r
-\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-        //\r
-        // Verify Authentication State\r
-        //\r
-        CopyMem (&TempGuid, Section + 1, sizeof (EFI_GUID));\r
-\r
-        Status = SectionExtract->PeiGetSection (\r
-                                  GetPeiServicesTablePointer(),\r
-                                  SectionExtract,\r
-                                  (EFI_SECTION_TYPE *) &SectionType,\r
-                                  &TempGuid,\r
-                                  0,\r
-                                  (VOID **) &Buffer,\r
-                                  &BufferSize,\r
-                                  &AuthenticationStatus\r
-                                  );\r
-\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-        //\r
-        // If not ask the Security PPI, if exists, for disposition\r
-        //\r
-        //\r
-        Status = PeiServicesLocatePpi (\r
-                   &gEfiPeiSecurityPpiGuid,\r
-                   0,\r
-                   NULL,\r
-                   (VOID **)&Security\r
-                   );\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-\r
-        Status = Security->AuthenticationState (\r
-                            GetPeiServicesTablePointer(),\r
-                            (struct _EFI_PEI_SECURITY_PPI *) Security,\r
-                            AuthenticationStatus,\r
-                            FfsFileHeader,\r
-                            &StartCrisisRecovery\r
-                            );\r
-\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-        //\r
-        // If there is a security violation, report to caller and have\r
-        // the upper-level logic possible engender a crisis recovery\r
-        //\r
-        if (StartCrisisRecovery) {\r
-          return EFI_SECURITY_VIOLATION;\r
-        }\r
-      }\r
-\r
-      if (Section->Type == EFI_SECTION_PE32) {\r
-        //\r
-        // This is what we want\r
-        //\r
-        *Pe32Data = (VOID *) (Section + 1);\r
-        return EFI_SUCCESS;\r
-      } else if (Section->Type == EFI_SECTION_COMPRESSION) {\r
-        //\r
-        // This is a compression set, expand it\r
-        //\r
-        CompressionSection  = (EFI_COMPRESSION_SECTION *) Section;\r
-\r
-        switch (CompressionSection->CompressionType) {\r
-        case EFI_STANDARD_COMPRESSION:\r
-          if (FeaturePcdGet (PcdDxeIplSupportTianoDecompress)) {\r
-            DecompressLibrary = &gTianoDecompress;\r
-          } else {\r
-            ASSERT (FALSE);\r
-            return EFI_NOT_FOUND;\r
-          }\r
-          break;\r
-\r
-        case EFI_CUSTOMIZED_COMPRESSION:\r
-          //\r
-          // Load user customized compression protocol.\r
-          //\r
-          if (FeaturePcdGet (PcdDxeIplSupportCustomDecompress)) {\r
-            DecompressLibrary = &gCustomDecompress;\r
-          } else {\r
-            ASSERT (FALSE);\r
-            return EFI_NOT_FOUND;\r
-          }\r
-          break;\r
-\r
-        case EFI_NOT_COMPRESSED:\r
-        default:\r
-          //\r
-          // Need to support not compressed file\r
-          //\r
-          ASSERT_EFI_ERROR (Status);\r
-          return EFI_NOT_FOUND;\r
-        }\r
-\r
-        Status = DecompressLibrary->GetInfo (\r
-                   (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
-                   (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),\r
-                   &DstBufferSize,\r
-                   &ScratchBufferSize\r
-                   );\r
-        if (EFI_ERROR (Status)) {\r
-          //\r
-          // GetInfo failed\r
-          //\r
-          return EFI_NOT_FOUND;\r
-        }\r
-\r
-        //\r
-        // Allocate scratch buffer\r
-        //\r
-        ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
-        if (ScratchBuffer == NULL) {\r
-          return EFI_OUT_OF_RESOURCES;\r
-        }\r
-\r
-        //\r
-        // Allocate destination buffer\r
-        //\r
-        DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));\r
-        if (DstBuffer == NULL) {\r
-          return EFI_OUT_OF_RESOURCES;\r
-        }\r
-\r
-        //\r
-        // Call decompress function\r
-        //\r
-        Status = DecompressLibrary->Decompress (\r
-                    (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),\r
-                    DstBuffer,\r
-                    ScratchBuffer\r
-                    );\r
-\r
-        CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;\r
-        if (CmpSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {\r
-          // \r
-          // Firmware Volume Image in this Section\r
-          // Skip the section header to get FvHeader\r
-          //\r
-          FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (CmpSection + 1);\r
-\r
-          if (FvHeader->Signature == EFI_FVH_SIGNATURE) {            \r
-            //\r
-            // Adjust Fv Base Address Alignment based on Align Attributes in Fv Header\r
-            //\r
-            \r
-            //\r
-            // When FvImage support Alignment, we need to check whether \r
-            // its alignment is correct. \r
-            //\r
-            if (FvHeader->Attributes | EFI_FVB_ALIGNMENT_CAP) {\r
-              \r
-              //\r
-              // Calculate the mini alignment for this FvImage\r
-              //\r
-              FvAlignment = 1 << (LowBitSet32 (FvHeader->Attributes >> 16) + 1);\r
-              \r
-              //\r
-              // If current FvImage base address doesn't meet the its alignment,\r
-              // we need to reload this FvImage to another correct memory address.\r
-              //\r
-              if (((UINTN) FvHeader % FvAlignment) != 0) {\r
-                DstBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINTN) FvHeader->FvLength), FvAlignment);\r
-                if (DstBuffer == NULL) {\r
-                  return EFI_OUT_OF_RESOURCES;\r
-                }\r
-                CopyMem (DstBuffer, FvHeader, (UINTN) FvHeader->FvLength);\r
-                FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) DstBuffer;  \r
-              }\r
-            }\r
-            //\r
-            // Build new FvHob for new decompressed Fv image.\r
-            //\r
-            BuildFvHob ((EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader, FvHeader->FvLength);\r
-            \r
-            //\r
-            // Set the original FvHob to unused.\r
-            //\r
-            if (OrigHob != NULL) {\r
-              OrigHob->Header->HobType = EFI_HOB_TYPE_UNUSED;\r
-            }\r
-            \r
-            //\r
-            // when search FvImage Section return true.\r
-            //\r
-            if (SectionType == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {\r
-              *Pe32Data = (VOID *) FvHeader;\r
-              return EFI_SUCCESS;\r
-            } else {\r
-              return EFI_NOT_FOUND;\r
-            }\r
-\r
-          }\r
-        }\r
-        //\r
-        // Decompress successfully.\r
-        // Loop the decompressed data searching for expected section.\r
-        //\r
-        CmpFileData = (VOID *) DstBuffer;\r
-        CmpFileSize = DstBufferSize;\r
-        do {\r
-          CmpSectionLength = *(UINT32 *) (CmpSection->Size) & 0x00ffffff;\r
-          if (CmpSection->Type == EFI_SECTION_PE32) {\r
-            //\r
-            // This is what we want\r
-            //\r
-            *Pe32Data = (VOID *) (CmpSection + 1);\r
-            return EFI_SUCCESS;\r
-          }\r
-\r
-          OccupiedCmpSectionLength  = GetOccupiedSize (CmpSectionLength, 4);\r
-          CmpSection                = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);\r
-        } while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);\r
-      }\r
-      //\r
-      // End of the decompression activity\r
-      //\r
-\r
-      Section   = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);\r
-      FileSize  = FfsFileHeader->Size[0] & 0xFF;\r
-      FileSize += (FfsFileHeader->Size[1] << 8) & 0xFF00;\r
-      FileSize += (FfsFileHeader->Size[2] << 16) & 0xFF0000;\r
-      FileSize &= 0x00FFFFFF;\r
-    } while (Section->Type != 0 && (UINTN) ((UINT8 *) Section - (UINT8 *) FfsFileHeader) < FileSize);\r
-    \r
-    //\r
-    // search all sections (compression and non compression) in this FFS, don't \r
-    // find expected section.\r
-    //\r
-    return EFI_NOT_FOUND;\r
-  } else {\r
-    //\r
-    // For those FFS that doesn't contain compression section, directly search \r
-    // PE or TE section in this FFS.\r
-    //\r
-\r
-    Status = PeiServicesFfsFindSectionData (\r
-               EFI_SECTION_PE32,\r
-               FfsFileHeader,\r
-               &SectionData\r
-               );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      Status = PeiServicesFfsFindSectionData (\r
-                 EFI_SECTION_TE,\r
-                 FfsFileHeader,\r
-                 &SectionData\r
-                 );\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-    }\r
-  }\r
-\r
-  *Pe32Data = SectionData;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/DxeLoadFunc.c b/EdkModulePkg/Core/DxeIplX64Peim/x64/DxeLoadFunc.c
deleted file mode 100644 (file)
index c93c7e1..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*++\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 X64 Lakeport.\r
-\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
-  PeiServices - General purpose services available to every PEIM.\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
-\r
-  return EFI_SUCCESS;\r
-}\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/ImageRead.c b/EdkModulePkg/Core/DxeIplX64Peim/x64/ImageRead.c
deleted file mode 100644 (file)
index dd977f2..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*++\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
-  ImageRead.c\r
-\r
-Abstract:\r
-\r
---*/\r
-\r
-#include <DxeIpl.h>\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiImageRead (\r
-  IN     VOID    *FileHandle,\r
-  IN     UINTN   FileOffset,\r
-  IN OUT UINTN   *ReadSize,\r
-  OUT    VOID    *Buffer\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Support routine for the PE/COFF Loader that reads a buffer from a PE/COFF file\r
-\r
-Arguments:\r
-\r
-  FileHandle - The handle to the PE/COFF file\r
-\r
-  FileOffset - The offset, in bytes, into the file to read\r
-\r
-  ReadSize   - The number of bytes to read from the file starting at FileOffset\r
-\r
-  Buffer     - A pointer to the buffer to read the data into.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS - ReadSize bytes of data were read into Buffer from the PE/COFF file starting at FileOffset\r
-\r
---*/\r
-{\r
-  CHAR8 *Destination8;\r
-  CHAR8 *Source8;\r
-  UINTN Length;\r
-\r
-  Destination8  = Buffer;\r
-  Source8       = (CHAR8 *) ((UINTN) FileHandle + FileOffset);\r
-  Length        = *ReadSize;\r
-  while (Length--) {\r
-    *(Destination8++) = *(Source8++);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-GetImageReadFunction (\r
-  IN      PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Support routine to return the PE32 Image Reader.\r
-  If the PeiImageRead() function is less than a page\r
-  in legnth. If the function is more than a page the DXE IPL will crash!!!!\r
-\r
-Arguments:\r
-  ImageContext  - The context of the image being loaded\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS - If Image function location is found\r
-\r
---*/\r
-{\r
-  VOID        *MemoryBuffer;\r
-\r
-  if (gInMemory) {\r
-    ImageContext->ImageRead = PeiImageRead;\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // BugBug; This code assumes PeiImageRead() is less than a page in size!\r
-  //  Allocate a page so we can shaddow the read function from FLASH into \r
-  //  memory to increase performance. \r
-  //\r
-  \r
-  MemoryBuffer = AllocateCopyPool (0x400, (VOID *)(UINTN) PeiImageRead);\r
-  ASSERT (MemoryBuffer != NULL);\r
-\r
-  ImageContext->ImageRead = (PE_COFF_LOADER_READ_FILE) (UINTN) MemoryBuffer;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.S b/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.S
deleted file mode 100644 (file)
index 273b3d5..0000000
+++ /dev/null
@@ -1,296 +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.             
-#*   
-#*    LongMode.S
-#*  
-#*   Abstract:
-#*
-#*    Transition from 32-bit protected mode EFI environment into x64 
-#*    64-bit bit long mode.
-#*  
-#*   This file is not fully ported or operational.
-#*  
-#------------------------------------------------------------------------------
-
-.686p: 
-#.MODEL flat
-
-#
-# Create the exception handler code in IA32 C code
-#
-
-.code: 
-.stack: 
-.MMX: 
-.XMM: 
-
-.global _LoadGo64Gdt;
-_LoadGo64Gdt:
-    pushl   %ebp              # C prolog
-    pushl   %edi
-    movl    %esp, %ebp
-    #
-    # Disable interrupts
-    #
-    cli
-    #
-    # Reload the selectors
-    # Note:
-    #      Make the Selectors 64-bit ready
-    #
-    movl    gdtr, %edi          # Load GDT register
-    movw    %cs, %ax            # Get the selector data from our code image          
-    mov     %ax, %es
-# FIXME MISMATCH: "    lgdt    FWORD PTR es:[edi]  "
-
-    .byte   0x67
-    .byte   0xea              # Far Jump Offset:Selector to reload CS
-# FIXME MISMATCH: "    dd      OFFSET DataSelectorRld"
-# FIXME MISMATCH: "    dw      LINEAR_CODE_SEL   "
-DataSelectorRld:
-    movw    SYS_DATA_SEL, %ax # Update the Base for the new selectors, too
-    movw    %ax, %ds
-    movw    %ax, %es
-    movw    %ax, %fs
-    movw    %ax, %gs
-    movw    %ax, %ss
-
-    popl    %edi
-    popl    %ebp
-    ret
-#_LoadGo64Gdt ENDP
-
-
-# VOID
-# ActivateLongMode (
-#   IN  EFI_PHYSICAL_ADDRESS  PageTables,  
-#   IN  EFI_PHYSICAL_ADDRESS  HobStart,
-#   IN  EFI_PHYSICAL_ADDRESS  Stack,
-#   IN  EFI_PHYSICAL_ADDRESS  PpisNeededByDxeIplEntryPoint,
-#   IN  EFI_PHYSICAL_ADDRESS  DxeCoreEntryPoint
-#   )
-#
-# Input:  [ebp][0h]  = Original ebp
-#         [ebp][4h]  = Return address
-#         [ebp][8h]  = PageTables
-#         [ebp][10h] = HobStart
-#         [ebp][18h] = Stack
-#         [ebp][20h] = CodeEntryPoint1 <--- Call this first (for each call, pass HOB pointer)
-#         [ebp][28h] = CodeEntryPoint2 <--- Call this second
-#
-#
-.global _ActivateLongMode;
-_ActivateLongMode:
-    pushl   %ebp              # C prolog
-    movl    %esp, %ebp
-
-    #
-    # Use CPUID to determine if the processor supports long mode.
-    #
-    movl    $0x80000000, %eax # Extended-function code 8000000h.
-    cpuid                   # Is largest extended function
-    cmpl    $0x80000000, %eax # any function > 80000000h?
-    jbe     no_long_mode    # If not, no long mode.
-    movl    $0x80000001, %eax # Extended-function code 8000001h.
-    cpuid                   # Now EDX = extended-features flags.
-    btl     $29, %edx       # Test if long mode is supported.
-    jnc     no_long_mode    # Exit if not supported.
-
-    #
-    # Enable the 64-bit page-translation-table entries by
-    # setting CR4.PAE=1 (this is _required_ before activating
-    # long mode). Paging is not enabled until after long mode
-    # is enabled.
-    #
-    movl %cr4, %eax
-    btsl $5, %eax
-    movl %eax, %cr4
-
-    #
-    # Get the long-mode page tables, and initialize the
-    # 64-bit CR3 (page-table base address) to point to the base
-    # of the PML4 page table. The PML4 page table must be located
-    # below 4 Gbytes because only 32 bits of CR3 are loaded when
-    # the processor is not in 64-bit mode.
-    #
-    movl 0x8(%ebp), %eax    # Get Page Tables
-    movl %eax, %cr3          # Initialize CR3 with PML4 base.
-
-    #
-    # Enable long mode (set EFER.LME=1).
-    #
-    movl $0xc0000080, %ecx # EFER MSR number.
-    rdmsr               # Read EFER.
-    btsl $8, %eax       # Set LME=1.
-    wrmsr               # Write EFER.
-
-    #
-    # Enable paging to activate long mode (set CR0.PG=1)
-    #
-
-
-    movl %cr0, %eax # Read CR0.
-    btsl $31, %eax # Set PG=1.
-    movl %eax, %cr0 # Write CR0.
-    jmp   go_to_long_mode
-go_to_long_mode: 
-
-    #
-    # This is the next instruction after enabling paging.  Jump to long mode
-    #
-    .byte   0x67
-    .byte   0xea              # Far Jump Offset:Selector to reload CS
-#FIXME MISMATCH: "    dd      OFFSET in_long_mode"
-#FIXME MISMATCH: "    dw      SYS_CODE64_SEL    "
-in_long_mode:
-    movw    SYS_DATA64_SEL, %ax
-    movw    %ax, %es
-    movw    %ax, %ss
-    movw    %ax, %ds
-    jmp     .
-
-
-    #
-    # We're in long mode, so marshall the arguments to call the
-    # passed in function pointers
-    # Recall
-    #         [ebp][10h] = HobStart
-    #         [ebp][18h] = Stack
-    #         [ebp][20h] = PpisNeededByDxeIplEntryPoint <--- Call this first (for each call, pass HOB pointer)
-    #         [ebp][28h] = DxeCoreEntryPoint            <--- Call this second
-    #
-    .byte 0x48
-    movl 0x18(%ebp), %ebx     # Setup the stack
-    .byte 0x48
-    movl %ebx, %esp           # On a new stack now
-
-
-## 00000905  FF D0                  call rax
-
-    .byte 0x48
-    movl 0x10(%ebp), %ecx     # Pass Hob Start in RCX
-    .byte 0x48
-    movl 0x28(%ebp), %eax     # Get the function pointer for 
-                              # DxeCoreEntryPoint into EAX
-
-## 00000905  FF D0                  call rax
-    .byte 0xff
-    .byte 0xd0
-
-    #
-    # WE SHOULD NEVER GET HERE!!!!!!!!!!!!!
-    #
-no_long_mode: 
-    jmp   no_long_mode
-#_ActivateLongMode ENDP
-
-        .align 16
-
-gdtr: #FIXME MISMATCH: "gdtr    dw _GDT_END - _GDT_BASE - 1   "
-#FIXME MISMATCH: "        dd OFFSET _GDT_BASE          "
-
-#-----------------------------------------------------------------------------;
-#   global descriptor table (GDT)
-#-----------------------------------------------------------------------------;
-
-        .align 16
-
-.global _GDT_BASE
-_GDT_BASE: 
-# null descriptor
-.equ                NULL_SEL, .-_GDT_BASE     # Selector [0]
-        .word 0         # limit 15:0
-        .word 0         # base 15:0
-        .byte 0         # base 23:16
-        .byte 0         # type
-        .byte 0         # limit 19:16, flags
-        .byte 0         # base 31:24
-
-# linear data segment descriptor
-.equ            LINEAR_SEL, .-_GDT_BASE         # Selector [0x8]
-        .word 0xFFFF    # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0x92      # present, ring 0, data, expand-up, writable
-        .byte 0xCF              # page-granular, 32-bit
-        .byte 0
-
-# linear code segment descriptor
-.equ            LINEAR_CODE_SEL, .-_GDT_BASE         # Selector [0x10]
-        .word 0xFFFF    # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0x9F      # present, ring 0, data, expand-up, writable
-        .byte 0xCF              # page-granular, 32-bit
-        .byte 0
-
-# system data segment descriptor
-.equ            SYS_DATA_SEL, .-_GDT_BASE         # Selector [0x18]
-        .word 0xFFFF    # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0x93      # present, ring 0, data, expand-up, writable
-        .byte 0xCF              # page-granular, 32-bit
-        .byte 0
-
-# system code segment descriptor
-.equ            SYS_CODE_SEL, .-_GDT_BASE         # Selector [0x20]
-        .word 0xFFFF    # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0x9A      # present, ring 0, data, expand-up, writable
-        .byte 0xCF              # page-granular, 32-bit
-        .byte 0
-
-# spare segment descriptor
-.equ        SPARE3_SEL, .-_GDT_BASE             # Selector [0x28]
-        .word 0         # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0         # present, ring 0, data, expand-up, writable
-        .byte 0         # page-granular, 32-bit
-        .byte 0
-
-#
-# system data segment descriptor
-#
-.equ              SYS_DATA64_SEL, .-_GDT_BASE           # Selector [0x30]
-        .word 0xFFFF    # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0x92      # P | DPL [1..2] | 1   | 1   | C | R | A
-        .byte 0xCF      # G | D   | L    | AVL | Segment [19..16]
-        .byte 0
-
-#
-# system code segment descriptor
-#
-.equ              SYS_CODE64_SEL, .-_GDT_BASE           # Selector [0x38]
-        .word 0xFFFF    # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0x9A      # P | DPL [1..2] | 1   | 1   | C | R | A
-        .byte 0xAF      # G | D   | L    | AVL | Segment [19..16]
-        .byte 0
-
-# spare segment descriptor
-.equ        SPARE4_SEL, .-_GDT_BASE             # Selector [0x40]
-        .word 0         # limit 0xFFFFF
-        .word 0         # base 0
-        .byte 0
-        .byte 0         # present, ring 0, data, expand-up, writable
-        .byte 0         # page-granular, 32-bit
-        .byte 0
-
-_GDT_END: 
-
-
-
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.asm b/EdkModulePkg/Core/DxeIplX64Peim/x64/LongMode.asm
deleted file mode 100644 (file)
index a241273..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-      TITLE   LongMode.asm: Assembly code for the entering long mode
-
-;------------------------------------------------------------------------------
-;*
-;*   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.             
-;*   
-;*    LongMode.asm
-;*  
-;*   Abstract:
-;*
-;*    Transition from 32-bit protected mode EFI environment into x64 
-;*    64-bit bit long mode.
-;*  
-;------------------------------------------------------------------------------
-
-.686p
-.model  flat        
-
-;
-; Create the exception handler code in IA32 C code
-;
-
-.code
-.stack
-.MMX
-.XMM
-
-_LoadGo64Gdt   PROC Near Public
-    push    ebp               ; C prolog
-    push    edi
-    mov     ebp, esp
-    ;
-    ; Disable interrupts
-    ;
-    cli
-    ;
-    ; Reload the selectors
-    ; Note:
-    ;      Make the Selectors 64-bit ready
-    ;
-    mov     edi, OFFSET gdtr    ; Load GDT register
-    mov     ax,cs               ; Get the selector data from our code image          
-    mov     es,ax
-    lgdt    FWORD PTR es:[edi]  ; and update the GDTR   
-
-    db      067h
-    db      0eah              ; Far Jump Offset:Selector to reload CS
-    dd      OFFSET DataSelectorRld;   Offset is ensuing instruction boundary
-    dw      LINEAR_CODE_SEL   ;   Selector is our code selector, 10h
-DataSelectorRld::
-    mov     ax, SYS_DATA_SEL ; Update the Base for the new selectors, too
-    mov     ds, ax
-    mov     es, ax
-    mov     fs, ax
-    mov     gs, ax
-    mov     ss, ax  
-    
-    pop     edi
-    pop     ebp
-    ret
-_LoadGo64Gdt endp   
-    
-
-; VOID
-; ActivateLongMode (
-;   IN  EFI_PHYSICAL_ADDRESS  PageTables,  
-;   IN  EFI_PHYSICAL_ADDRESS  HobStart,
-;   IN  EFI_PHYSICAL_ADDRESS  Stack,
-;   IN  EFI_PHYSICAL_ADDRESS  PpisNeededByDxeIplEntryPoint,
-;   IN  EFI_PHYSICAL_ADDRESS  DxeCoreEntryPoint
-;   )
-;
-; Input:  [ebp][0h]  = Original ebp
-;         [ebp][4h]  = Return address
-;         [ebp][8h]  = PageTables
-;         [ebp][10h] = HobStart
-;         [ebp][18h] = Stack
-;         [ebp][20h] = CodeEntryPoint1 <--- Call this first (for each call, pass HOB pointer)
-;         [ebp][28h] = CodeEntryPoint2 <--- Call this second
-;
-;
-_ActivateLongMode  PROC Near Public
-    push    ebp               ; C prolog
-    mov     ebp, esp
-
-    ;
-    ; Use CPUID to determine if the processor supports long mode.
-    ;
-    mov     eax, 80000000h  ; Extended-function code 8000000h.
-    cpuid                   ; Is largest extended function
-    cmp     eax, 80000000h  ; any function > 80000000h?
-    jbe     no_long_mode    ; If not, no long mode.
-    mov     eax, 80000001h  ; Extended-function code 8000001h.
-    cpuid                   ; Now EDX = extended-features flags.
-    bt      edx, 29         ; Test if long mode is supported.
-    jnc     no_long_mode    ; Exit if not supported.
-
-    ;
-    ; Enable the 64-bit page-translation-table entries by
-    ; setting CR4.PAE=1 (this is _required_ before activating
-    ; long mode). Paging is not enabled until after long mode
-    ; is enabled.
-    ;
-    mov eax, cr4
-    bts eax, 5
-    mov cr4, eax
-
-    ;
-    ; Get the long-mode page tables, and initialize the
-    ; 64-bit CR3 (page-table base address) to point to the base
-    ; of the PML4 page table. The PML4 page table must be located
-    ; below 4 Gbytes because only 32 bits of CR3 are loaded when
-    ; the processor is not in 64-bit mode.
-    ;
-    mov eax, [ebp+8h]       ; Get Page Tables
-    mov cr3, eax            ; Initialize CR3 with PML4 base.
-
-    ;
-    ; Enable long mode (set EFER.LME=1).
-    ;
-    mov ecx, 0c0000080h ; EFER MSR number.
-    rdmsr               ; Read EFER.
-    bts eax, 8          ; Set LME=1.
-    wrmsr               ; Write EFER.
-
-    ;
-    ; Enable paging to activate long mode (set CR0.PG=1)
-    ;
-   
-   
-    mov eax, cr0 ; Read CR0.
-    bts eax, 31  ; Set PG=1.
-    mov cr0, eax ; Write CR0.
-    jmp   go_to_long_mode
-go_to_long_mode:
-
-    ;
-    ; This is the next instruction after enabling paging.  Jump to long mode
-    ;
-    db      067h
-    db      0eah              ; Far Jump Offset:Selector to reload CS
-    dd      OFFSET in_long_mode;   Offset is ensuing instruction boundary
-    dw      SYS_CODE64_SEL    ;   Selector is our code selector, 10h
-in_long_mode::
-    mov     ax, SYS_DATA64_SEL
-    mov     es, ax
-    mov     ss, ax
-    mov     ds, ax
-;;    jmp     $
-    
-           
-    ;
-    ; We're in long mode, so marshall the arguments to call the
-    ; passed in function pointers
-    ; Recall
-    ;         [ebp][10h] = HobStart
-    ;         [ebp][18h] = Stack
-    ;         [ebp][20h] = PpisNeededByDxeIplEntryPoint <--- Call this first (for each call, pass HOB pointer)
-    ;         [ebp][28h] = DxeCoreEntryPoint            <--- Call this second
-    ;
-    db  48h
-    mov ebx, [ebp+18h]        ; Setup the stack
-    db  48h
-    mov esp, ebx              ; On a new stack now
-
-
-;; 00000905  FF D0                 call rax
-
-    db  48h
-    mov ecx, [ebp+10h]        ; Pass Hob Start in RCX
-    db  48h
-    mov eax, [ebp+28h]        ; Get the function pointer for 
-                              ; DxeCoreEntryPoint into EAX
-
-;; 00000905  FF D0                 call rax
-    db 0ffh
-    db 0d0h
-
-    ;
-    ; WE SHOULD NEVER GET HERE!!!!!!!!!!!!!
-    ;
-no_long_mode:
-    jmp   no_long_mode
-_ActivateLongMode endp
-
-        align 16
-
-gdtr    dw GDT_END - GDT_BASE - 1   ; GDT limit
-        dd OFFSET GDT_BASE          ; (GDT base gets set above)
-
-;-----------------------------------------------------------------------------;
-;   global descriptor table (GDT)
-;-----------------------------------------------------------------------------;
-
-        align 16
-
-public GDT_BASE
-GDT_BASE:
-; null descriptor
-NULL_SEL            equ $-GDT_BASE    ; Selector [0]
-        dw 0            ; limit 15:0
-        dw 0            ; base 15:0
-        db 0            ; base 23:16
-        db 0            ; type
-        db 0            ; limit 19:16, flags
-        db 0            ; base 31:24
-
-; linear data segment descriptor
-LINEAR_SEL      equ $-GDT_BASE        ; Selector [0x8]
-        dw 0FFFFh       ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 092h         ; present, ring 0, data, expand-up, writable
-        db 0CFh                 ; page-granular, 32-bit
-        db 0
-
-; linear code segment descriptor
-LINEAR_CODE_SEL equ $-GDT_BASE        ; Selector [0x10]
-        dw 0FFFFh       ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 09Fh         ; present, ring 0, data, expand-up, writable
-        db 0CFh                 ; page-granular, 32-bit
-        db 0
-
-; system data segment descriptor
-SYS_DATA_SEL    equ $-GDT_BASE        ; Selector [0x18]
-        dw 0FFFFh       ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 093h         ; present, ring 0, data, expand-up, writable
-        db 0CFh                 ; page-granular, 32-bit
-        db 0
-
-; system code segment descriptor
-SYS_CODE_SEL    equ $-GDT_BASE        ; Selector [0x20]
-        dw 0FFFFh       ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 09Ah         ; present, ring 0, data, expand-up, writable
-        db 0CFh                 ; page-granular, 32-bit
-        db 0
-
-; spare segment descriptor
-SPARE3_SEL  equ $-GDT_BASE            ; Selector [0x28]
-        dw 0            ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 0            ; present, ring 0, data, expand-up, writable
-        db 0            ; page-granular, 32-bit
-        db 0
-
-;
-; system data segment descriptor
-;
-SYS_DATA64_SEL    equ $-GDT_BASE          ; Selector [0x30]
-        dw 0FFFFh       ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 092h         ; P | DPL [1..2] | 1   | 1   | C | R | A
-        db 0CFh         ; G | D   | L    | AVL | Segment [19..16]
-        db 0
-
-;
-; system code segment descriptor
-;
-SYS_CODE64_SEL    equ $-GDT_BASE          ; Selector [0x38]
-        dw 0FFFFh       ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 09Ah         ; P | DPL [1..2] | 1   | 1   | C | R | A
-        db 0AFh         ; G | D   | L    | AVL | Segment [19..16]
-        db 0
-
-; spare segment descriptor
-SPARE4_SEL  equ $-GDT_BASE            ; Selector [0x40]
-        dw 0            ; limit 0xFFFFF
-        dw 0            ; base 0
-        db 0
-        db 0            ; present, ring 0, data, expand-up, writable
-        db 0            ; page-granular, 32-bit
-        db 0
-
-GDT_END:
-
-END
-
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.c b/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.c
deleted file mode 100644 (file)
index ef9c3b6..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*++\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
-  VirtualMemory.c\r
-  \r
-Abstract:\r
-\r
-  x64 Virtual Memory Management Services in the form of an IA-32 driver.  \r
-  Used to establish a 1:1 Virtual to Physical Mapping that is required to\r
-  enter Long Mode (x64 64-bit mode).\r
-\r
-  While we make a 1:1 mapping (identity mapping) for all physical pages \r
-  we still need to use the MTRR's to ensure that the cachability attirbutes\r
-  for all memory regions is correct.\r
-\r
-  The basic idea is to use 2MB page table entries where ever possible. If\r
-  more granularity of cachability is required then 4K page tables are used.\r
-\r
-  References:\r
-    1) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 1:Basic Architecture, Intel\r
-    2) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel\r
-    3) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel\r
-  \r
---*/  \r
-\r
-#include "VirtualMemory.h"\r
-\r
-EFI_PHYSICAL_ADDRESS\r
-CreateIdentityMappingPageTables (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Allocates and fills in the Page Directory and Page Table Entries to\r
-  establish a 1:1 Virtual to Physical mapping.\r
-\r
-Arguments:\r
-\r
-  NumberOfProcessorPhysicalAddressBits - Number of processor address bits to use.\r
-                                         Limits the number of page table entries \r
-                                         to the physical address space.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS           The 1:1 Virtual to Physical identity mapping was created\r
-\r
---*/\r
-{  \r
-  UINT32                                        RegEax;\r
-  UINT8                                         PhysicalAddressBits;\r
-  EFI_PHYSICAL_ADDRESS                          PageAddress;\r
-  UINTN                                         IndexOfPml4Entries;\r
-  UINTN                                         IndexOfPdpEntries;\r
-  UINTN                                         IndexOfPageDirectoryEntries;\r
-  UINTN                                         NumberOfPml4EntriesNeeded;\r
-  UINTN                                         NumberOfPdpEntriesNeeded;\r
-  PAGE_MAP_AND_DIRECTORY_POINTER                *PageMapLevel4Entry;\r
-  PAGE_MAP_AND_DIRECTORY_POINTER                *PageMap;\r
-  PAGE_MAP_AND_DIRECTORY_POINTER                *PageDirectoryPointerEntry;\r
-  PAGE_TABLE_ENTRY                              *PageDirectoryEntry;\r
-\r
-  //\r
-  // By architecture only one PageMapLevel4 exists - so lets allocate storage for it.\r
-  //\r
-  PageMap = AllocatePages (1);\r
-  ASSERT (PageMap != NULL);\r
-\r
-  //\r
-  // Get physical address bits supported.\r
-  //\r
-  AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
-  if (RegEax >= 0x80000008) {\r
-    AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
-    PhysicalAddressBits = (UINT8) RegEax;\r
-  } else {\r
-    PhysicalAddressBits = 36;\r
-  }\r
-\r
-  //\r
-  // Calculate the table entries needed.\r
-  //\r
-  if (PhysicalAddressBits <= 39 ) {\r
-    NumberOfPml4EntriesNeeded = 1;\r
-    NumberOfPdpEntriesNeeded =  1 << (PhysicalAddressBits - 30);\r
-  } else {\r
-    NumberOfPml4EntriesNeeded = 1 << (PhysicalAddressBits - 39);\r
-    NumberOfPdpEntriesNeeded = 512;\r
-  }\r
-\r
-  PageMapLevel4Entry = PageMap;\r
-  PageAddress        = 0;\r
-  for (IndexOfPml4Entries = 0; IndexOfPml4Entries < NumberOfPml4EntriesNeeded; IndexOfPml4Entries++, PageMapLevel4Entry++) {\r
-    //\r
-    // Each PML4 entry points to a page of Page Directory Pointer entires.\r
-    // So lets allocate space for them and fill them in in the IndexOfPdpEntries loop.\r
-    //\r
-    PageDirectoryPointerEntry = AllocatePages (1);\r
-    ASSERT (PageDirectoryPointerEntry != NULL);\r
-\r
-    //\r
-    // Make a PML4 Entry\r
-    //\r
-    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry;\r
-    PageMapLevel4Entry->Bits.ReadWrite = 1;\r
-    PageMapLevel4Entry->Bits.Present = 1;\r
-\r
-    for (IndexOfPdpEntries = 0; IndexOfPdpEntries < NumberOfPdpEntriesNeeded; IndexOfPdpEntries++, PageDirectoryPointerEntry++) {\r
-      //\r
-      // Each Directory Pointer entries points to a page of Page Directory entires.\r
-      // So allocate space for them and fill them in in the IndexOfPageDirectoryEntries loop.\r
-      //       \r
-      PageDirectoryEntry = AllocatePages (1);\r
-      ASSERT (PageDirectoryEntry != NULL);\r
-\r
-      //\r
-      // Fill in a Page Directory Pointer Entries\r
-      //\r
-      PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry;\r
-      PageDirectoryPointerEntry->Bits.ReadWrite = 1;\r
-      PageDirectoryPointerEntry->Bits.Present = 1;\r
-\r
-      for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PageAddress += 0x200000) {\r
-        //\r
-        // Fill in the Page Directory entries\r
-        //\r
-        PageDirectoryEntry->Uint64 = (UINT64)PageAddress;\r
-        PageDirectoryEntry->Bits.ReadWrite = 1;\r
-        PageDirectoryEntry->Bits.Present = 1;\r
-        PageDirectoryEntry->Bits.MustBe1 = 1;\r
-\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // For the PML4 entries we are not using fill in a null entry.\r
-  // For now we just copy the first entry.\r
-  //\r
-  for (; IndexOfPml4Entries < 512; IndexOfPml4Entries++, PageMapLevel4Entry++) {\r
-     CopyMem (\r
-       PageMapLevel4Entry,\r
-       PageMap,\r
-       sizeof (PAGE_MAP_AND_DIRECTORY_POINTER)\r
-       );\r
-  }\r
-\r
-  return (EFI_PHYSICAL_ADDRESS) (UINTN)PageMap; // FIXME\r
-}\r
-\r
diff --git a/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.h b/EdkModulePkg/Core/DxeIplX64Peim/x64/VirtualMemory.h
deleted file mode 100644 (file)
index ddb504a..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*++ \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
-  VirtualMemory.h\r
-  \r
-Abstract:\r
-\r
-  x64 Long Mode Virtual Memory Management Definitions  \r
-\r
-  References:\r
-    1) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 1:Basic Architecture, Intel\r
-    2) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel\r
-    3) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel\r
-    4) AMD64 Architecture Programmer's Manual Volume 2: System Programming\r
---*/  \r
-#ifndef _VIRTUAL_MEMORY_H_\r
-#define _VIRTUAL_MEMORY_H_\r
-\r
-\r
-#pragma pack(1)\r
-\r
-//\r
-// Page-Map Level-4 Offset (PML4) and\r
-// Page-Directory-Pointer Offset (PDPE) entries 4K & 2MB\r
-//\r
-\r
-typedef union {\r
-  struct {\r
-    UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory\r
-    UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write\r
-    UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User\r
-    UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching\r
-    UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached\r
-    UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)\r
-    UINT64  Reserved:1;               // Reserved\r
-    UINT64  MustBeZero:2;             // Must Be Zero\r
-    UINT64  Available:3;              // Available for use by system software\r
-    UINT64  PageTableBaseAddress:40;  // Page Table Base Address\r
-    UINT64  AvabilableHigh:11;        // Available for use by system software\r
-    UINT64  Nx:1;                     // No Execute bit\r
-  } Bits;\r
-  UINT64    Uint64;\r
-} PAGE_MAP_AND_DIRECTORY_POINTER;\r
-\r
-//\r
-// Page Table Entry 2MB\r
-//\r
-typedef union {\r
-  struct {\r
-    UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory\r
-    UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write\r
-    UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User\r
-    UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching\r
-    UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached\r
-    UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)\r
-    UINT64  Dirty:1;                  // 0 = Not Dirty, 1 = written by processor on access to page\r
-    UINT64  MustBe1:1;                // Must be 1 \r
-    UINT64  Global:1;                 // 0 = Not global page, 1 = global page TLB not cleared on CR3 write\r
-    UINT64  Available:3;              // Available for use by system software\r
-    UINT64  PAT:1;                    //\r
-    UINT64  MustBeZero:8;             // Must be zero;\r
-    UINT64  PageTableBaseAddress:31;  // Page Table Base Address\r
-    UINT64  AvabilableHigh:11;        // Available for use by system software\r
-    UINT64  Nx:1;                     // 0 = Execute Code, 1 = No Code Execution\r
-  } Bits;\r
-  UINT64    Uint64;\r
-} PAGE_TABLE_ENTRY;\r
-\r
-#pragma pack()\r
-\r
-EFI_PHYSICAL_ADDRESS\r
-CreateIdentityMappingPageTables (\r
-  VOID\r
-  )\r
-;\r
-\r
-#endif \r
index 5b111656079d73cb202b5a5a5b85bea84e05b433..47b9a7fd35e4d34c5ae2b8a9ec1d2d16e418f36a 100644 (file)
           <MaxDatumSize>4</MaxDatumSize>\r
           <Value>10000000</Value>\r
         </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSwitchToLongMode</C_Name>\r
+          <Token>0x0001003b</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>FALSE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
+          <Token>0x00010034</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>\r
+          <Token>0x00010035</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>\r
+          <Token>0x00010036</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>4</MaxDatumSize>\r
           <Value>10000000</Value>\r
         </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSwitchToLongMode</C_Name>\r
+          <Token>0x0001003b</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>FALSE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
+          <Token>0x00010034</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>\r
+          <Token>0x00010035</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>\r
+          <Token>0x00010036</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>4</MaxDatumSize>\r
           <Value>10000000</Value>\r
         </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSwitchToLongMode</C_Name>\r
+          <Token>0x0001003b</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>FALSE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
+          <Token>0x00010034</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>\r
+          <Token>0x00010035</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>\r
+          <Token>0x00010036</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>4</MaxDatumSize>\r
           <Value>10000000</Value>\r
         </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSwitchToLongMode</C_Name>\r
+          <Token>0x0001003b</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>FALSE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
+          <Token>0x00010034</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>\r
+          <Token>0x00010035</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>TRUE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>\r
+          <Token>0x00010036</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
       </ModuleSaBuildOptions>\r
     </ModuleSA>\r
     <!--Mod: DxeIplX64 Type: PEIM Path: EdkModulePkg\Core\DxeIplX64Peim\DxeIplX64.msa-->\r
-    <ModuleSA ModuleGuid="0c55bdf7-d71d-4962-8fcb-348773e48929" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3" SupArchList="IA32">\r
-      <Libraries>\r
-        <!--Pkg: EdkModulePkg Mod: BaseCustomDecompressLibNull Path: EdkModulePkg\Library\BaseCustomDecompressLibNull\BaseCustomDecompressLibNull.msa-->\r
-        <Instance ModuleGuid="e5566134-c75e-4ace-bad1-e23a3b335e30" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3"/>\r
-        <!--Pkg: EdkModulePkg Mod: BaseUefiTianoDecompressLib Path: EdkModulePkg\Library\BaseUefiTianoDecompressLib\BaseUefiTianoDecompressLib.msa-->\r
-        <Instance ModuleGuid="d774c4d9-c121-4da3-a5e2-0f317e3c630c" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiMemoryAllocationLib Path: MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLib.msa-->\r
-        <Instance ModuleGuid="b694e0dc-cd4e-4b30-885b-9c164ed3e74a" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiDxeDebugLibReportStatusCode Path: MdePkg\Library\PeiDxeDebugLibReportStatusCode\PeiDxeDebugLibReportStatusCode.msa-->\r
-        <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiPcdLib Path: MdePkg\Library\PeiPcdLib\PeiPcdLib.msa-->\r
-        <Instance ModuleGuid="9dbf6f25-0da2-4a1d-8e12-e78de6ab4d0e" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: EdkModulePkg Mod: EdkPeCoffLoaderLib Path: EdkModulePkg\Library\EdkPeCoffLoaderLib\EdkPeCoffLoaderLib.msa-->\r
-        <Instance ModuleGuid="858bbbc9-474f-4556-a361-0ae52a44ffa5" ModuleVersion="1.0" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: BasePeCoffLib Path: MdePkg\Library\BasePeCoffLib\BasePeCoffLib.msa-->\r
-        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiHobLib Path: MdePkg\Library\PeiHobLib\PeiHobLib.msa-->\r
-        <Instance ModuleGuid="9643128f-ac24-4b3e-b6be-d8849a306153" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiMemoryLib Path: MdePkg\Library\PeiMemoryLib\PeiMemoryLib.msa-->\r
-        <Instance ModuleGuid="3a9759d2-53bc-4eb2-abcd-c93099419063" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiReportStatusCodeLib Path: MdePkg\Library\PeiReportStatusCodeLib\PeiReportStatusCodeLib.msa-->\r
-        <Instance ModuleGuid="8c690838-7a22-45c4-aa58-a33e3e515cd4" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiIoLibCpuIo Path: MdePkg\Library\PeiIoLibCpuIo\PeiIoLibCpuIo.msa-->\r
-        <Instance ModuleGuid="b2585b69-fb63-4220-844a-8fbea8bf01af" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiServicesTablePointerLibMm7 Path: MdePkg\Library\PeiServicesTablePointerLibMm7\PeiServicesTablePointerLibMm7.msa-->\r
-        <Instance ModuleGuid="e6e9c1f8-2c8a-4f4b-a27c-c382e4bb8e67" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: BaseLib Path: MdePkg\Library\BaseLib\BaseLib.msa-->\r
-        <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeiServicesLib Path: MdePkg\Library\PeiServicesLib\PeiServicesLib.msa-->\r
-        <Instance ModuleGuid="a804239b-4155-446f-acc8-f0825d74908c" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: BaseTimerLibLocalApic Path: MdePkg\Library\BaseTimerLibLocalApic\BaseTimerLibLocalApic.msa-->\r
-        <Instance ModuleGuid="b5a05743-9b71-489b-a0ed-a0eb3950d23b" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: PeimEntryPoint Path: MdePkg\Library\PeimEntryPoint\PeimEntryPoint.msa-->\r
-        <Instance ModuleGuid="fa177ff7-1fc7-458d-a358-d9d62ae61cec" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-        <!--Pkg: MdePkg Mod: BaseCacheMaintenanceLib Path: MdePkg\Library\BaseCacheMaintenanceLib\BaseCacheMaintenanceLib.msa-->\r
-        <Instance ModuleGuid="123dd843-57c9-4158-8418-ce68b3944ce7" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
-      </Libraries>\r
-      <PcdBuildDefinition>\r
-        <PcdData ItemType="FEATURE_FLAG">\r
-          <C_Name>PcdDxeIplSupportEfiDecompress</C_Name>\r
-          <Token>0x00010034</Token>\r
-          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>BOOLEAN</DatumType>\r
-          <MaxDatumSize>1</MaxDatumSize>\r
-          <Value>TRUE</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FEATURE_FLAG">\r
-          <C_Name>PcdDxeIplSupportTianoDecompress</C_Name>\r
-          <Token>0x00010035</Token>\r
-          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>BOOLEAN</DatumType>\r
-          <MaxDatumSize>1</MaxDatumSize>\r
-          <Value>TRUE</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FEATURE_FLAG">\r
-          <C_Name>PcdDxeIplSupportCustomDecompress</C_Name>\r
-          <Token>0x00010036</Token>\r
-          <TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>BOOLEAN</DatumType>\r
-          <MaxDatumSize>1</MaxDatumSize>\r
-          <Value>TRUE</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdDebugPropertyMask</C_Name>\r
-          <Token>0x00000005</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT8</DatumType>\r
-          <MaxDatumSize>1</MaxDatumSize>\r
-          <Value>0x0f</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdDebugClearMemoryValue</C_Name>\r
-          <Token>0x00000008</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT8</DatumType>\r
-          <MaxDatumSize>1</MaxDatumSize>\r
-          <Value>0xAF</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdDebugPrintErrorLevel</C_Name>\r
-          <Token>0x00000006</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT32</DatumType>\r
-          <MaxDatumSize>4</MaxDatumSize>\r
-          <Value>0x80000000</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdReportStatusCodePropertyMask</C_Name>\r
-          <Token>0x00000007</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT8</DatumType>\r
-          <MaxDatumSize>1</MaxDatumSize>\r
-          <Value>0x06</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdMaximumUnicodeStringLength</C_Name>\r
-          <Token>0x00000001</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT32</DatumType>\r
-          <MaxDatumSize>4</MaxDatumSize>\r
-          <Value>1000000</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdMaximumAsciiStringLength</C_Name>\r
-          <Token>0x00000002</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT32</DatumType>\r
-          <MaxDatumSize>4</MaxDatumSize>\r
-          <Value>1000000</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdMaximumLinkedListLength</C_Name>\r
-          <Token>0x00000003</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT32</DatumType>\r
-          <MaxDatumSize>4</MaxDatumSize>\r
-          <Value>1000000</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdSpinLockTimeout</C_Name>\r
-          <Token>0x00000004</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT32</DatumType>\r
-          <MaxDatumSize>4</MaxDatumSize>\r
-          <Value>10000000</Value>\r
-        </PcdData>\r
-        <PcdData ItemType="FIXED_AT_BUILD">\r
-          <C_Name>PcdFSBClock</C_Name>\r
-          <Token>0x0000000c</Token>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-          <DatumType>UINT32</DatumType>\r
-          <MaxDatumSize>4</MaxDatumSize>\r
-          <Value>200000000</Value>\r
-        </PcdData>\r
-      </PcdBuildDefinition>\r
-      <ModuleSaBuildOptions>\r
-        <FvBinding>NULL</FvBinding>\r
-        <FfsFormatKey>PE32_PEIM</FfsFormatKey>\r
-      </ModuleSaBuildOptions>\r
-    </ModuleSA>\r
   </FrameworkModules>\r
   <DynamicPcdBuildDefinitions>\r
     <PcdBuildData ItemType="DYNAMIC">\r
index 5b473f7b59288dd01c420ae8d974727385a2a0ee..9e083f93b17bf8ced172ae1f0b06d7023b8884f1 100644 (file)
     <Filename>Bus/Usb/UsbMouse/Dxe/UsbMouse.msa</Filename>\r
     <Filename>Core/Dxe/DxeMain.msa</Filename>\r
     <Filename>Core/DxeIplPeim/DxeIpl.msa</Filename>\r
-    <Filename>Core/DxeIplX64Peim/DxeIplX64.msa</Filename>\r
     <Filename>Core/Pei/PeiMain.msa</Filename>\r
     <Filename>Library/BaseCustomDecompressLibNull/BaseCustomDecompressLibNull.msa</Filename>\r
     <Filename>Library/BaseUefiTianoDecompressLib/BaseUefiTianoDecompressLib.msa</Filename>\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
+      <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
+      <HelpText>If this feature is enabled, then the DXE IPL will load a 64-bit DxeCore.</HelpText>\r
+    </PcdEntry>\r
   </PcdDeclarations>\r
 </PackageSurfaceArea>
\ No newline at end of file