summaryrefslogtreecommitdiff
path: root/EdkModulePkg/Core/DxeIplPeim
diff options
context:
space:
mode:
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>2006-05-14 09:14:46 +0000
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>2006-05-14 09:14:46 +0000
commite20ee534ac22960fef84e868cb45eb54b813a290 (patch)
treeb16e0f1e7b07d5765e5d86fd826e99b37c5edd40 /EdkModulePkg/Core/DxeIplPeim
parentd4864e235043b5adacfc50b47c0a747161398a1d (diff)
downloadedk2-platforms-e20ee534ac22960fef84e868cb45eb54b813a290.tar.xz
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@150 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkModulePkg/Core/DxeIplPeim')
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/DxeIpl.mbd126
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/DxeIplX64.mbd98
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/DxeIplX64.msa207
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/DxeLoadX64.c2006
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/build.xml119
-rw-r--r--EdkModulePkg/Core/DxeIplPeim/x64/LongMode.asm2707
6 files changed, 2646 insertions, 2617 deletions
diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeIpl.mbd b/EdkModulePkg/Core/DxeIplPeim/DxeIpl.mbd
index a604fccf08..3b5ae36e0d 100644
--- a/EdkModulePkg/Core/DxeIplPeim/DxeIpl.mbd
+++ b/EdkModulePkg/Core/DxeIplPeim/DxeIpl.mbd
@@ -1,63 +1,63 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<ModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
- <MbdHeader>
- <BaseName>DxeIpl</BaseName>
- <Guid>86D70125-BAA3-4296-A62F-602BEBBB9081</Guid>
- <Version>EDK_RELEASE_VERSION 0x00020000</Version>
- <Description>FIX ME!</Description>
- <Copyright>Copyright (c) 2004-2006, Intel Corporation</Copyright>
- <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>
- <Created>2006-03-12 17:09</Created>
- <Modified>2006-03-22 18:54</Modified>
- </MbdHeader>
- <Libraries>
- <Library>PeimEntryPoint</Library>
- <Library>PeiMemoryLib</Library>
- <Library>PeiCoreLib</Library>
- <Library>PeiServicesTablePointerLib</Library>
- <Library>PeiHobLib</Library>
- <Library>BaseCacheMaintenanceLib</Library>
- <Library>BaseUefiTianoDecompressLib</Library>
- <Library>BaseCustomDecompressLibNull</Library>
- <Library>PeiReportStatusCodeLib</Library>
- <Library>BaseDebugLibReportStatusCode</Library>
- <Library>BaseLib</Library>
- <Library>PeiMemoryAllocationLib</Library>
- <Arch ArchType="IA32">
- <Library OverrideID="8888">EdkPeCoffLoaderLib</Library>
- <Library OverrideID="8888">BasePeCoffLib</Library>
- </Arch>
- <Arch ArchType="X64">
- <Library>EdkPeCoffLoaderLib</Library>
- <Library>BasePeCoffLib</Library>
- </Arch>
- <Arch ArchType="IPF">
- <Library>EdkPeCoffLoaderLib</Library>
- <Library>BasePeCoffLib</Library>
- </Arch>
- <Arch ArchType="EBC">
- <Library>EdkPeCoffLoaderLib</Library>
- <Library>BasePeCoffLib</Library>
- </Arch>
- </Libraries>
- <BuildOptions ToolChain="MSFT">
- <ImageEntryPoint>_ModuleEntryPoint</ImageEntryPoint>
- </BuildOptions>
-</ModuleBuildDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<ModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
+ <MbdHeader>
+ <BaseName>DxeIpl</BaseName>
+ <Guid>86D70125-BAA3-4296-A62F-602BEBBB9081</Guid>
+ <Version>EDK_RELEASE_VERSION 0x00020000</Version>
+ <Description>FIX ME!</Description>
+ <Copyright>Copyright (c) 2004-2006, Intel Corporation</Copyright>
+ <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>
+ <Created>2006-03-12 17:09</Created>
+ <Modified>2006-03-22 18:54</Modified>
+ </MbdHeader>
+ <Libraries>
+ <Library>PeimEntryPoint</Library>
+ <Library>PeiMemoryLib</Library>
+ <Library>PeiCoreLib</Library>
+ <Library OverrideID="4444">PeiServicesTablePointerLib</Library>
+ <Library>PeiHobLib</Library>
+ <Library>BaseCacheMaintenanceLib</Library>
+ <Library>BaseUefiTianoDecompressLib</Library>
+ <Library>BaseCustomDecompressLibNull</Library>
+ <Library>PeiReportStatusCodeLib</Library>
+ <Library>BaseDebugLibReportStatusCode</Library>
+ <Library>BaseLib</Library>
+ <Library>PeiMemoryAllocationLib</Library>
+ <Arch ArchType="IA32">
+ <Library OverrideID="8888">EdkPeCoffLoaderLib</Library>
+ <Library OverrideID="8888">BasePeCoffLib</Library>
+ </Arch>
+ <Arch ArchType="X64">
+ <Library>EdkPeCoffLoaderLib</Library>
+ <Library>BasePeCoffLib</Library>
+ </Arch>
+ <Arch ArchType="IPF">
+ <Library>EdkPeCoffLoaderLib</Library>
+ <Library>BasePeCoffLib</Library>
+ </Arch>
+ <Arch ArchType="EBC">
+ <Library>EdkPeCoffLoaderLib</Library>
+ <Library>BasePeCoffLib</Library>
+ </Arch>
+ </Libraries>
+ <BuildOptions ToolChain="MSFT">
+ <ImageEntryPoint>_ModuleEntryPoint</ImageEntryPoint>
+ </BuildOptions>
+</ModuleBuildDescription>
diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.mbd b/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.mbd
index 2df91ecde8..ef039fc800 100644
--- a/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.mbd
+++ b/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.mbd
@@ -1,49 +1,49 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<ModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
- <MbdHeader>
- <BaseName>DxeIpl</BaseName>
- <Guid>86D70125-BAA3-4296-A62F-602BEBBB9081</Guid>
- <Version>EDK_RELEASE_VERSION 0x00020000</Version>
- <Description>FIX ME!</Description>
- <Copyright>Copyright 2004-2006, Intel Corporation</Copyright>
- <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>
- <Created>2006-04-03 23:58</Created>
- </MbdHeader>
- <Libraries>
- <Library>PeimEntryPoint</Library>
- <Library>PeiMemoryLib</Library>
- <Library>PeiCoreLib</Library>
- <Library>PeiServicesTablePointerLib</Library>
- <Library>PeiHobLib</Library>
- <Library>BaseCacheMaintenanceLib</Library>
- <Library>BaseUefiTianoDecompressLib</Library>
- <Library>BaseCustomDecompressLibNull</Library>
- <Library>PeiReportStatusCodeLib</Library>
- <Library>BaseDebugLibReportStatusCode</Library>
- <Library>BaseLib</Library>
- <Library>PeiMemoryAllocationLib</Library>
- <Library>PeiReportStatusCodeLib</Library>
- <Arch ArchType="IA32" OverrideID="8888">
- <Library>EdkPeCoffLoaderX64Lib</Library>
- <Library>EdkPeCoffLoaderLib</Library>
- <Library>BasePeCoffLib</Library>
- </Arch>
- </Libraries>
-</ModuleBuildDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<ModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
+ <MbdHeader>
+ <BaseName>DxeIplX64</BaseName>
+ <Guid>86D70125-BAA3-4296-A62F-602BEBBB9081</Guid>
+ <Version>EDK_RELEASE_VERSION 0x00020000</Version>
+ <Description>FIX ME!</Description>
+ <Copyright>Copyright 2004-2006, Intel Corporation</Copyright>
+ <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>
+ <Created>2006-04-03 23:58</Created>
+ </MbdHeader>
+ <Libraries>
+ <Library>PeimEntryPoint</Library>
+ <Library>PeiMemoryLib</Library>
+ <Library>PeiCoreLib</Library>
+ <Library OverrideID="4444">PeiServicesTablePointerLib</Library>
+ <Library>PeiHobLib</Library>
+ <Library>BaseCacheMaintenanceLib</Library>
+ <Library>BaseUefiTianoDecompressLib</Library>
+ <Library>BaseCustomDecompressLibNull</Library>
+ <Library>BaseDebugLibReportStatusCode</Library>
+ <Library>BaseLib</Library>
+ <Library>PeiMemoryAllocationLib</Library>
+ <Library>PeiReportStatusCodeLib</Library>
+ <Library>EdkPeCoffLoaderX64Lib</Library>
+ <Library>EdkPeCoffLoaderLib</Library>
+ <Library>BasePeCoffLib</Library>
+ </Libraries>
+ <BuildOptions ToolChain="MSFT">
+ <ImageEntryPoint>_ModuleEntryPoint</ImageEntryPoint>
+ </BuildOptions>
+</ModuleBuildDescription>
diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.msa b/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.msa
index e69b824e10..638809dcd2 100644
--- a/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.msa
+++ b/EdkModulePkg/Core/DxeIplPeim/DxeIplX64.msa
@@ -1,85 +1,122 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
- <MsaHeader>
- <BaseName>DxeIpl</BaseName>
- <ModuleType>PEIM</ModuleType>
- <ComponentType>PE32_PEIM</ComponentType>
- <Guid>86D70125-BAA3-4296-A62F-602BEBBB9081</Guid>
- <Version>EDK_RELEASE_VERSION 0x00020000</Version>
- <Abstract>Component description file for DxeIpl module</Abstract>
- <Description>FIX ME!</Description>
- <Copyright>Copyright 2004-2006, Intel Corporation</Copyright>
- <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>
- <Specification>EFI_SPECIFICATION_VERSION 0x00000000</Specification>
- <Created>2006-04-03 23:58</Created>
- </MsaHeader>
- <LibraryClassDefinitions>
- <LibraryClass Usage="ALWAYS_CONSUMED">DebugLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">PeimEntryPoint</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">BaseLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">HobLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">PerformanceLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">PeiCoreLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">ReportStatusCodeLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">CacheMaintenanceLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">EdkPeCoffLoaderLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">UefiDecompressLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">TianoDecompressLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">CustomDecompressLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">PeiServicesTablePointerLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">BaseMemoryLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">MemoryAllocationLib</LibraryClass>
- <LibraryClass Usage="ALWAYS_CONSUMED">EdkPeCoffLoaderX64Lib</LibraryClass>
- </LibraryClassDefinitions>
- <SourceFiles>
- <Filename>DxeIpl.dxs</Filename>
- <Filename>DxeLoadX64.c</Filename>
- <Arch ArchType="IA32">
- <Filename>x64/ImageRead.c</Filename>
- <Filename>x64/LongMode.asm</Filename>
- <Filename>x64/DxeLoadFunc.c</Filename>
- <Filename>x64/VirtualMemory.c</Filename>
- </Arch>
- </SourceFiles>
- <Includes>
- <PackageName>MdePkg</PackageName>
- <PackageName>EdkModulePkg</PackageName>
- </Includes>
- <Protocols>
- <Protocol Usage="ALWAYS_CONSUMED">Decompress</Protocol>
- <Protocol Usage="ALWAYS_CONSUMED">TianoDecompress</Protocol>
- <Protocol Usage="ALWAYS_CONSUMED">CustomizedDecompress</Protocol>
- </Protocols>
- <PPIs>
- <Ppi Usage="ALWAYS_CONSUMED">PeiInMemory</Ppi>
- <Ppi Usage="ALWAYS_CONSUMED">RecoveryModule</Ppi>
- <Ppi Usage="ALWAYS_CONSUMED">SectionExtraction</Ppi>
- <Ppi Usage="ALWAYS_CONSUMED">Security</Ppi>
- <Ppi Usage="ALWAYS_CONSUMED">DxeIpl</Ppi>
- <Ppi Usage="ALWAYS_CONSUMED">S3Resume</Ppi>
- <Ppi Usage="ALWAYS_CONSUMED">EndOfPeiSignal</Ppi>
- <Ppi Usage="ALWAYS_CONSUMED">FvFileLoader</Ppi>
- </PPIs>
- <Guids>
- <GuidEntry Usage="ALWAYS_CONSUMED">
- <C_Name>PeiPeCoffLoader</C_Name>
- </GuidEntry>
- </Guids>
-</ModuleSurfaceArea>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
+ <MsaHeader>
+ <BaseName>DxeIplX64</BaseName>
+ <ModuleType>PEIM</ModuleType>
+ <ComponentType>PE32_PEIM</ComponentType>
+ <Guid>86D70125-BAA3-4296-A62F-602BEBBB9081</Guid>
+ <Version>EDK_RELEASE_VERSION 0x00020000</Version>
+ <Abstract>Component description file for DxeIpl module</Abstract>
+ <Description>FIX ME!</Description>
+ <Copyright>Copyright 2004-2006, Intel Corporation</Copyright>
+ <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>
+ <Specification>EFI_SPECIFICATION_VERSION 0x00000000</Specification>
+ <Created>2006-04-03 23:58</Created>
+ </MsaHeader>
+ <LibraryClassDefinitions>
+ <LibraryClass Usage="ALWAYS_CONSUMED">DebugLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">PeimEntryPoint</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">BaseLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">HobLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">PerformanceLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">PeiCoreLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">ReportStatusCodeLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">CacheMaintenanceLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">EdkPeCoffLoaderLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">UefiDecompressLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">TianoDecompressLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">CustomDecompressLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">PeiServicesTablePointerLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">BaseMemoryLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">MemoryAllocationLib</LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">EdkPeCoffLoaderX64Lib</LibraryClass>
+ </LibraryClassDefinitions>
+ <SourceFiles>
+ <Filename>DxeIpl.dxs</Filename>
+ <Filename>DxeLoadX64.c</Filename>
+ <Arch ArchType="IA32">
+ <Filename>x64/ImageRead.c</Filename>
+ <Filename>x64/LongMode.asm</Filename>
+ <Filename>x64/DxeLoadFunc.c</Filename>
+ <Filename>x64/VirtualMemory.c</Filename>
+ </Arch>
+ </SourceFiles>
+ <Includes>
+ <PackageName>MdePkg</PackageName>
+ <PackageName>EdkModulePkg</PackageName>
+ </Includes>
+ <Protocols>
+ <Protocol Usage="ALWAYS_CONSUMED">Decompress</Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">TianoDecompress</Protocol>
+ <Protocol Usage="ALWAYS_CONSUMED">CustomizedDecompress</Protocol>
+ </Protocols>
+ <Hobs>
+ <Hob Usage="SOMETIMES_PRODUCED" HobType="MEMORY_ALLOCATION">
+ <C_Name>gEfiHobMemoryAllocBspStoreGuid</C_Name>
+ <Guid>0x564b33cd, 0xc92a, 0x4593, 0x90, 0xbf, 0x24, 0x73, 0xe4, 0x3c, 0x63, 0x22</Guid>
+ </Hob>
+ <Hob Usage="SOMETIMES_PRODUCED" HobType="GUID_EXTENSION">
+ <C_Name>gEfiDecompressProtocolGuid</C_Name>
+ <Guid>0xd8117cfe, 0x94a6, 0x11d4, 0x9a, 0x3a, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d</Guid>
+ </Hob>
+ <Hob Usage="SOMETIMES_PRODUCED" HobType="GUID_EXTENSION">
+ <C_Name>gEfiTianoDecompressProtocolGuid</C_Name>
+ <Guid>0xe84cf29c, 0x191f, 0x4eae, 0x96, 0xe1, 0xf4, 0x6a, 0xec, 0xea, 0xea, 0x0b</Guid>
+ </Hob>
+ <Hob Usage="SOMETIMES_PRODUCED" HobType="GUID_EXTENSION">
+ <C_Name>gEfiCustomizedDecompressProtocolGuid</C_Name>
+ <Guid>0x9a44198e, 0xa4a2, 0x44e6, 0x8a, 0x1f, 0x39, 0xbe, 0xfd, 0xac, 0x89, 0x6f</Guid>
+ </Hob>
+ <Hob Usage="SOMETIMES_PRODUCED" HobType="GUID_EXTENSION">
+ <C_Name>gEfiPeiPeCoffLoaderGuid</C_Name>
+ <Guid>0xd8117cff, 0x94a6, 0x11d4, 0x9a, 0x3a, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d</Guid>
+ </Hob>
+ <Hob Usage="SOMETIMES_PRODUCED" HobType="MEMORY_ALLOCATION">
+ <C_Name>gEfiHobMemoryAllocModuleGuid</C_Name>
+ <Guid>0xf8e21975, 0x0899, 0x4f58, 0xa4, 0xbe, 0x55, 0x25, 0xa9, 0xc6, 0xd7, 0x7a</Guid>
+ </Hob>
+ <Hob Usage="SOMETIMES_PRODUCED" HobType="FIRMWARE_VOLUME">
+ <Name>DecompressedFvmain.fv</Name>
+ </Hob>
+ </Hobs>
+ <PPIs>
+ <Ppi Usage="SOMETIMES_PRODUCED">DxeIpl</Ppi>
+ <Ppi Usage="SOMETIMES_PRODUCED">FvFileLoader</Ppi>
+ <Ppi Usage="SOMETIMES_PRODUCED">EndOfPeiSignal</Ppi>
+ <Ppi Usage="SOMETIMES_CONSUMED">RecoveryModule</Ppi>
+ <Ppi Usage="SOMETIMES_CONSUMED">S3Resume</Ppi>
+ <Ppi Usage="SOMETIMES_CONSUMED">SectionExtraction</Ppi>
+ <Ppi Usage="SOMETIMES_CONSUMED">Security</Ppi>
+ <Ppi Usage="PRIVATE">PeiInMemory</Ppi>
+ </PPIs>
+ <Guids>
+ <GuidEntry Usage="ALWAYS_CONSUMED">
+ <C_Name>PeiPeCoffLoader</C_Name>
+ </GuidEntry>
+ </Guids>
+ <Externs>
+ <Extern>
+ <ModuleEntryPoint>PeimInitializeDxeIpl</ModuleEntryPoint>
+ </Extern>
+ </Externs>
+ <BuildOptions ToolChain="MSFT">
+ <ImageEntryPoint>_ModuleEntryPoint</ImageEntryPoint>
+ </BuildOptions>
+</ModuleSurfaceArea>
diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeLoadX64.c b/EdkModulePkg/Core/DxeIplPeim/DxeLoadX64.c
index 6727bf4ca7..e0dbe84c36 100644
--- a/EdkModulePkg/Core/DxeIplPeim/DxeLoadX64.c
+++ b/EdkModulePkg/Core/DxeIplPeim/DxeLoadX64.c
@@ -1,1018 +1,990 @@
-/*++
-
-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.
-
-Module Name:
-
- DxeLoad.c
-
-Abstract:
-
- Last PEIM.
- Responsibility of this module is to load the DXE Core from a Firmware Volume.
-
---*/
-
-#include <DxeIpl.h>
-
-#pragma warning( disable : 4305 )
-
-BOOLEAN gInMemory = FALSE;
-
-//
-// GUID for EM64T
-//
-#define EFI_PPI_NEEDED_BY_DXE \
- { \
- 0x4d37da42, 0x3a0c, 0x4eda, 0xb9, 0xeb, 0xbc, 0x0e, 0x1d, 0xb4, 0x71, 0x3b \
- }
-EFI_GUID mPpiNeededByDxeGuid = EFI_PPI_NEEDED_BY_DXE;
-
-//
-// Module Globals used in the DXE to PEI handoff
-// These must be module globals, so the stack can be switched
-//
-static EFI_DXE_IPL_PPI mDxeIplPpi = {
- DxeLoadCore
-};
-
-static EFI_PEI_FV_FILE_LOADER_PPI mLoadFilePpi = {
- DxeIplLoadFile
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiLoadFile = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gEfiPeiFvFileLoaderPpiGuid,
- &mLoadFilePpi
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiList = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gEfiDxeIplPpiGuid,
- &mDxeIplPpi
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiPeiInMemory = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gPeiInMemoryGuid,
- NULL
-};
-
-static EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
- &gEfiEndOfPeiSignalPpiGuid,
- NULL
-};
-
-DECOMPRESS_LIBRARY gEfiDecompress = {
- UefiDecompressGetInfo,
- UefiDecompress
-};
-
-DECOMPRESS_LIBRARY gTianoDecompress = {
- TianoDecompressGetInfo,
- TianoDecompress
-};
-
-DECOMPRESS_LIBRARY gCustomDecompress = {
- CustomDecompressGetInfo,
- CustomDecompress
-};
-
-STATIC
-UINTN
-GetOccupiedSize (
- IN UINTN ActualSize,
- IN UINTN Alignment
- )
-{
- UINTN OccupiedSize;
-
- OccupiedSize = ActualSize;
- while ((OccupiedSize & (Alignment - 1)) != 0) {
- OccupiedSize++;
- }
-
- return OccupiedSize;
-}
-
-EFI_STATUS
-EFIAPI
-PeimInitializeDxeIpl (
- IN EFI_FFS_FILE_HEADER *FfsHeader,
- IN EFI_PEI_SERVICES **PeiServices
- )
-/*++
-
-Routine Description:
-
- Initializes the Dxe Ipl PPI
-
-Arguments:
-
- FfsHeader - Pointer to FFS file header
- PeiServices - General purpose services available to every PEIM.
-
-Returns:
-
- EFI_SUCCESS
-
---*/
-{
- EFI_STATUS Status;
- EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
- EFI_BOOT_MODE BootMode;
-
- Status = PeiCoreGetBootMode (&BootMode);
-
- ASSERT_EFI_ERROR (Status);
-
- Status = PeiCoreLocatePpi (
- &gPeiInMemoryGuid,
- 0,
- NULL,
- NULL
- );
-
- if (EFI_ERROR (Status) && (BootMode != BOOT_ON_S3_RESUME)) {
- //
- // The DxeIpl has not yet been shadowed
- //
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
-
- //
- // Shadow DxeIpl and then re-run its entry point
- //
- Status = ShadowDxeIpl (FfsHeader, PeiEfiPeiPeCoffLoader);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- } else {
- if (BootMode != BOOT_ON_S3_RESUME) {
- //
- // The DxeIpl has been shadowed
- //
- gInMemory = TRUE;
-
- //
- // Install LoadFile PPI
- //
- Status = PeiCoreInstallPpi (&mPpiLoadFile);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
- //
- // Install DxeIpl PPI
- //
- PeiCoreInstallPpi (&mPpiList);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- }
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-DxeLoadCore (
- IN EFI_DXE_IPL_PPI *This,
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_HOB_POINTERS HobList
- )
-/*++
-
-Routine Description:
-
- Main entry point to last PEIM
-
-Arguments:
-
- This - Entry point for DXE IPL PPI
- PeiServices - General purpose services available to every PEIM.
- HobList - Address to the Pei HOB list
-
-Returns:
-
- EFI_SUCCESS - DEX core was successfully loaded.
- EFI_OUT_OF_RESOURCES - There are not enough resources to load DXE core.
-
---*/
-{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS TopOfStack;
- EFI_PHYSICAL_ADDRESS BaseOfStack;
- EFI_PHYSICAL_ADDRESS BspStore;
- EFI_GUID DxeCoreFileName;
- VOID *DxeCorePe32Data;
- EFI_PHYSICAL_ADDRESS DxeCoreAddress;
- UINT64 DxeCoreSize;
- EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint;
- VOID *PpisNeededByDxePe32Data;
- EFI_PHYSICAL_ADDRESS PpisNeededByDxeAddress;
- UINT64 PpisNeededByDxeSize;
- EFI_PHYSICAL_ADDRESS PpisNeededByDxeEntryPoint;
- EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
- EFI_BOOT_MODE BootMode;
- EFI_PEI_RECOVERY_MODULE_PPI *PeiRecovery;
- EFI_PEI_S3_RESUME_PPI *S3Resume;
- EFI_PHYSICAL_ADDRESS PageTables;
-
- TopOfStack = 0;
- BaseOfStack = 0;
- BspStore = 0;
- Status = EFI_SUCCESS;
-
- //
- // if in S3 Resume, restore configure
- //
- Status = PeiCoreGetBootMode (&BootMode);
-
- if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) {
- Status = PeiCoreLocatePpi (
- &gEfiPeiS3ResumePpiGuid,
- 0,
- NULL,
- (VOID **)&S3Resume
- );
-
- ASSERT_EFI_ERROR (Status);
-
- Status = S3Resume->S3RestoreConfig (PeiServices);
-
- ASSERT_EFI_ERROR (Status);
- }
-
- Status = EFI_SUCCESS;
-
- //
- // Install the PEI Protocols that are shared between PEI and DXE
- //
-#ifdef EFI_NT_EMULATOR
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
- ASSERT (PeiEfiPeiPeCoffLoader != NULL);
-#else
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderX64Protocol ();
-#endif
-
-#if 0
- Status = InstallEfiPeiPeCoffLoader64 (PeiServices, &PeiEfiPeiPeCoffLoader, NULL);
- ASSERT_EFI_ERROR (Status);
-#endif
- //
- // Allocate 128KB for the Stack
- //
- PeiCoreAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);
- ASSERT (BaseOfStack != 0);
-
- //
- // Compute the top of the stack we were allocated. Pre-allocate a 32 bytes
- // for safety (PpisNeededByDxe and DxeCore).
- //
- TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - 32;
-
- //
- // Add architecture-specifc HOBs (including the BspStore HOB)
- //
- Status = CreateArchSpecificHobs (&BspStore);
- ASSERT_EFI_ERROR (Status);
-
- //
- // See if we are in crisis recovery
- //
- Status = PeiCoreGetBootMode (&BootMode);
- if (!EFI_ERROR (Status) && (BootMode == BOOT_IN_RECOVERY_MODE)) {
- Status = PeiCoreLocatePpi (
- &gEfiPeiRecoveryModulePpiGuid,
- 0,
- NULL,
- (VOID **)&PeiRecovery
- );
-
- ASSERT_EFI_ERROR (Status);
- Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);
- ASSERT_EFI_ERROR (Status);
- }
-
- //
- // Find the DXE Core in a Firmware Volume
- //
- Status = PeiFindFile (
- EFI_FV_FILETYPE_DXE_CORE,
- EFI_SECTION_PE32,
- &DxeCoreFileName,
- &DxeCorePe32Data
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Find the PpisNeededByDxe in a Firmware Volume
- //
- Status = PeiFindFile (
- EFI_FV_FILETYPE_ALL,
- EFI_SECTION_PE32,
- &mPpiNeededByDxeGuid,
- &PpisNeededByDxePe32Data
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Transfer control to the DXE Core
- // The handoff state is simply a pointer to the HOB list
- //
- // PEI_PERF_END (PeiServices, L"DxeIpl", NULL, 0);
-
- Status = PeiCoreInstallPpi (&mPpiSignal);
- ASSERT_EFI_ERROR (Status);
-
- //
- // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA \
- // memory, it may be corrupted when copying FV to high-end memory
- LoadGo64Gdt();
-
- //
- // Limit to 36 bits of addressing for debug. Should get it from CPU
- //
- PageTables = CreateIdentityMappingPageTables (36);
-
- //
- // Load the PpiNeededByDxe from a Firmware Volume
- //
- Status = PeiLoadx64File (
- PeiEfiPeiPeCoffLoader,
- PpisNeededByDxePe32Data,
- EfiBootServicesData,
- &PpisNeededByDxeAddress,
- &PpisNeededByDxeSize,
- &PpisNeededByDxeEntryPoint
- );
- ASSERT_EFI_ERROR (Status);
-
-
- //
- // Load the DXE Core from a Firmware Volume
- //
- Status = PeiLoadx64File (
- PeiEfiPeiPeCoffLoader,
- DxeCorePe32Data,
- EfiBootServicesData,
- &DxeCoreAddress,
- &DxeCoreSize,
- &DxeCoreEntryPoint
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- //
- // Add HOB for the DXE Core
- //
- BuildModuleHob (
- &DxeCoreFileName,
- DxeCoreAddress,
- DxeCoreSize,
- DxeCoreEntryPoint
- );
-
- //
- // Report Status Code EFI_SW_PEI_PC_HANDOFF_TO_NEXT
- //
- REPORT_STATUS_CODE (
- EFI_PROGRESS_CODE,
- EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT
- );
-
- DEBUG ((EFI_D_INFO, "DXE Core Entry\n"));
- //
- // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.
- // Call x64 drivers passing in single argument, a pointer to the HOBs.
- //
- ActivateLongMode (
- PageTables,
- (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw),
- TopOfStack,
- PpisNeededByDxeEntryPoint,
- DxeCoreEntryPoint
- );
-
- //
- // If we get here, then the DXE Core returned. This is an error
- //
- ASSERT_EFI_ERROR (Status);
-
- return EFI_OUT_OF_RESOURCES;
-}
-
-EFI_STATUS
-PeiFindFile (
- IN UINT8 Type,
- IN UINT16 SectionType,
- OUT EFI_GUID *FileName,
- OUT VOID **Pe32Data
- )
-/*++
-
-Routine Description:
-
- Finds a PE/COFF of a specific Type and SectionType in the Firmware Volumes
- described in the HOB list. Able to search in a compression set in a FFS file.
- But only one level of compression is supported, that is, not able to search
- in a compression set that is within another compression set.
-
-Arguments:
-
- Type - The Type of file to retrieve
-
- SectionType - The type of section to retrieve from a file
-
- FileName - The name of the file found in the Firmware Volume
-
- Pe32Data - Pointer to the beginning of the PE/COFF file found in the Firmware Volume
-
-Returns:
-
- EFI_SUCCESS - The file was found, and the name is returned in FileName, and a pointer to
- the PE/COFF image is returned in Pe32Data
-
- EFI_NOT_FOUND - The file was not found in the Firmware Volumes present in the HOB List
-
---*/
-{
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
- EFI_FFS_FILE_HEADER *FfsFileHeader;
- VOID *SectionData;
- EFI_STATUS Status;
- EFI_PEI_HOB_POINTERS Hob;
-
-
- FwVolHeader = NULL;
- FfsFileHeader = NULL;
- SectionData = NULL;
-
- //
- // Foreach Firmware Volume, look for a specified type
- // of file and break out when one is found
- //
- Hob.Raw = GetHobList ();
- while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw)) != NULL) {
- FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (Hob.FirmwareVolume->BaseAddress);
- Status = PeiCoreFfsFindNextFile (
- Type,
- FwVolHeader,
- &FfsFileHeader
- );
- if (!EFI_ERROR (Status)) {
- CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));
- Status = PeiProcessFile (
- SectionType,
- FfsFileHeader,
- Pe32Data
- );
- return Status;
- }
- Hob.Raw = GET_NEXT_HOB (Hob);
- }
- return EFI_NOT_FOUND;
-}
-
-EFI_STATUS
-PeiLoadx64File (
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader,
- IN VOID *Pe32Data,
- IN EFI_MEMORY_TYPE MemoryType,
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
- OUT UINT64 *ImageSize,
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint
- )
-/*++
-
-Routine Description:
-
- Loads and relocates a PE/COFF image into memory.
-
-Arguments:
-
- PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol
-
- Pe32Data - The base address of the PE/COFF file that is to be loaded and relocated
-
- ImageAddress - The base address of the relocated PE/COFF image
-
- ImageSize - The size of the relocated PE/COFF image
-
- EntryPoint - The entry point of the relocated PE/COFF image
-
-Returns:
-
- EFI_SUCCESS - The file was loaded and relocated
- EFI_OUT_OF_RESOURCES - There was not enough memory to load and relocate the PE/COFF file
-
---*/
-{
- EFI_STATUS Status;
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
- EFI_PHYSICAL_ADDRESS MemoryBuffer;
-
- ZeroMem (&ImageContext, sizeof (ImageContext));
- ImageContext.Handle = Pe32Data;
- Status = GetImageReadFunction (&ImageContext);
-
- ASSERT_EFI_ERROR (Status);
-
- Status = PeiEfiPeiPeCoffLoader->GetImageInfo (PeiEfiPeiPeCoffLoader, &ImageContext);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Allocate Memory for the image
- //
- //
- // Allocate Memory for the image
- //
- PeiCoreAllocatePages (MemoryType, EFI_SIZE_TO_PAGES ((UINT32) ImageContext.ImageSize), &MemoryBuffer);
- ImageContext.ImageAddress = MemoryBuffer;
- ASSERT (ImageContext.ImageAddress != 0);
-
- //
- // Load the image to our new buffer
- //
-
- Status = PeiEfiPeiPeCoffLoader->LoadImage (PeiEfiPeiPeCoffLoader, &ImageContext);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Relocate the image in our new buffer
- //
- Status = PeiEfiPeiPeCoffLoader->RelocateImage (PeiEfiPeiPeCoffLoader, &ImageContext);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Flush the instruction cache so the image data is written before we execute it
- //
- InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);
-
- *ImageAddress = ImageContext.ImageAddress;
- *ImageSize = ImageContext.ImageSize;
- *EntryPoint = ImageContext.EntryPoint;
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-ShadowDxeIpl (
- IN EFI_FFS_FILE_HEADER *DxeIplFileHeader,
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader
- )
-/*++
-
-Routine Description:
-
- Shadow the DXE IPL to a different memory location. This occurs after permanent
- memory has been discovered.
-
-Arguments:
-
- DxeIplFileHeader - Pointer to the FFS file header of the DXE IPL driver
-
- PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol
-
-Returns:
-
- EFI_SUCCESS - DXE IPL was successfully shadowed to a different memory location.
-
- EFI_ ERROR - The shadow was unsuccessful.
-
-
---*/
-{
- UINTN SectionLength;
- UINTN OccupiedSectionLength;
- EFI_PHYSICAL_ADDRESS DxeIplAddress;
- UINT64 DxeIplSize;
- EFI_PHYSICAL_ADDRESS DxeIplEntryPoint;
- EFI_STATUS Status;
- EFI_COMMON_SECTION_HEADER *Section;
-
- Section = (EFI_COMMON_SECTION_HEADER *) (DxeIplFileHeader + 1);
-
- while ((Section->Type != EFI_SECTION_PE32) && (Section->Type != EFI_SECTION_TE)) {
- SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
- OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
- Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
- }
-
- //
- // Relocate DxeIpl into memory by using loadfile service
- //
- Status = PeiLoadx64File (
- PeiEfiPeiPeCoffLoader,
- (VOID *) (Section + 1),
- EfiBootServicesData,
- &DxeIplAddress,
- &DxeIplSize,
- &DxeIplEntryPoint
- );
-
- if (Status == EFI_SUCCESS) {
- //
- // Install PeiInMemory to indicate the Dxeipl is shadowed
- //
- Status = PeiCoreInstallPpi (&mPpiPeiInMemory);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = ((EFI_PEIM_ENTRY_POINT) (UINTN) DxeIplEntryPoint) (DxeIplFileHeader, GetPeiServicesTablePointer());
- }
-
- return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DxeIplLoadFile (
- IN EFI_PEI_FV_FILE_LOADER_PPI *This,
- IN EFI_FFS_FILE_HEADER *FfsHeader,
- OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
- OUT UINT64 *ImageSize,
- OUT EFI_PHYSICAL_ADDRESS *EntryPoint
- )
-/*++
-
-Routine Description:
-
- Given a pointer to an FFS file containing a PE32 image, get the
- information on the PE32 image, and then "load" it so that it
- can be executed.
-
-Arguments:
-
- This - pointer to our file loader protocol
- FfsHeader - pointer to the FFS file header of the FFS file that
- contains the PE32 image we want to load
- ImageAddress - returned address where the PE32 image is loaded
- ImageSize - returned size of the loaded PE32 image
- EntryPoint - entry point to the loaded PE32 image
-
-Returns:
-
- EFI_SUCCESS - The FFS file was successfully loaded.
- EFI_ERROR - Unable to load the FFS file.
-
---*/
-{
- EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
- EFI_STATUS Status;
- VOID *Pe32Data;
-
- Pe32Data = NULL;
- PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
-
- //
- // Preprocess the FFS file to get a pointer to the PE32 information
- // in the enclosed PE32 image.
- //
- Status = PeiProcessFile (
- EFI_SECTION_PE32,
- FfsHeader,
- &Pe32Data
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Load the PE image from the FFS file
- //
- Status = PeiLoadx64File (
- PeiEfiPeiPeCoffLoader,
- Pe32Data,
- EfiBootServicesData,
- ImageAddress,
- ImageSize,
- EntryPoint
- );
-
- return Status;
-}
-
-EFI_STATUS
-PeiProcessFile (
- IN UINT16 SectionType,
- IN EFI_FFS_FILE_HEADER *FfsFileHeader,
- OUT VOID **Pe32Data
- )
-/*++
-
-Routine Description:
-
-Arguments:
-
- SectionType - The type of section in the FFS file to process.
-
- FfsFileHeader - Pointer to the FFS file to process, looking for the
- specified SectionType
-
- Pe32Data - returned pointer to the start of the PE32 image found
- in the FFS file.
-
-Returns:
-
- EFI_SUCCESS - found the PE32 section in the FFS file
-
---*/
-{
- EFI_STATUS Status;
- VOID *SectionData;
- DECOMPRESS_LIBRARY *DecompressLibrary;
- UINT8 *DstBuffer;
- UINT8 *ScratchBuffer;
- UINT32 DstBufferSize;
- UINT32 ScratchBufferSize;
- EFI_COMMON_SECTION_HEADER *CmpSection;
- UINTN CmpSectionLength;
- UINTN OccupiedCmpSectionLength;
- VOID *CmpFileData;
- UINTN CmpFileSize;
- EFI_COMMON_SECTION_HEADER *Section;
- UINTN SectionLength;
- UINTN OccupiedSectionLength;
- UINT64 FileSize;
- EFI_GUID_DEFINED_SECTION *GuidedSectionHeader;
- UINT32 AuthenticationStatus;
- EFI_PEI_SECTION_EXTRACTION_PPI *SectionExtract;
- UINT32 BufferSize;
- UINT8 *Buffer;
- EFI_PEI_SECURITY_PPI *Security;
- BOOLEAN StartCrisisRecovery;
- EFI_GUID TempGuid;
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
- EFI_COMPRESSION_SECTION *CompressionSection;
-
- Status = PeiCoreFfsFindSectionData (
- EFI_SECTION_COMPRESSION,
- FfsFileHeader,
- &SectionData
- );
-
- //
- // Upon finding a DXE Core file, see if there is first a compression section
- //
- if (!EFI_ERROR (Status)) {
- //
- // Yes, there is a compression section, so extract the contents
- // Decompress the image here
- //
- Section = (EFI_COMMON_SECTION_HEADER *) (UINTN) (VOID *) ((UINT8 *) (FfsFileHeader) + (UINTN) sizeof (EFI_FFS_FILE_HEADER));
-
- do {
- SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
- OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
-
- //
- // Was the DXE Core file encapsulated in a GUID'd section?
- //
- if (Section->Type == EFI_SECTION_GUID_DEFINED) {
- //
- // Locate the GUID'd Section Extractor
- //
- GuidedSectionHeader = (VOID *) (Section + 1);
-
- //
- // This following code constitutes the addition of the security model
- // to the DXE IPL.
- //
- //
- // Set a default authenticatino state
- //
- AuthenticationStatus = 0;
-
- Status = PeiCoreLocatePpi (
- &gEfiPeiSectionExtractionPpiGuid,
- 0,
- NULL,
- (VOID **)&SectionExtract
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Verify Authentication State
- //
- CopyMem (&TempGuid, Section + 1, sizeof (EFI_GUID));
-
- Status = SectionExtract->PeiGetSection (
- GetPeiServicesTablePointer(),
- SectionExtract,
- (EFI_SECTION_TYPE *) &SectionType,
- &TempGuid,
- 0,
- (VOID **) &Buffer,
- &BufferSize,
- &AuthenticationStatus
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // If not ask the Security PPI, if exists, for disposition
- //
- //
- Status = PeiCoreLocatePpi (
- &gEfiPeiSecurityPpiGuid,
- 0,
- NULL,
- (VOID **)&Security
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = Security->AuthenticationState (
- GetPeiServicesTablePointer(),
- (struct _EFI_PEI_SECURITY_PPI *) Security,
- AuthenticationStatus,
- FfsFileHeader,
- &StartCrisisRecovery
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // If there is a security violation, report to caller and have
- // the upper-level logic possible engender a crisis recovery
- //
- if (StartCrisisRecovery) {
- return EFI_SECURITY_VIOLATION;
- }
- }
-
- if (Section->Type == EFI_SECTION_PE32) {
- //
- // This is what we want
- //
- *Pe32Data = (VOID *) (Section + 1);
- return EFI_SUCCESS;
- } else if (Section->Type == EFI_SECTION_COMPRESSION) {
- //
- // This is a compression set, expand it
- //
- CompressionSection = (EFI_COMPRESSION_SECTION *) Section;
-
- switch (CompressionSection->CompressionType) {
- case EFI_STANDARD_COMPRESSION:
- DecompressLibrary = &gTianoDecompress;
- break;
-
- case EFI_CUSTOMIZED_COMPRESSION:
- //
- // Load user customized compression protocol.
- //
- DecompressLibrary = &gCustomDecompress;
- break;
-
- case EFI_NOT_COMPRESSED:
- default:
- //
- // Need to support not compressed file
- //
- ASSERT_EFI_ERROR (Status);
- return EFI_NOT_FOUND;
- }
-
- Status = DecompressLibrary->GetInfo (
- (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
- (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),
- &DstBufferSize,
- &ScratchBufferSize
- );
- if (EFI_ERROR (Status)) {
- //
- // GetInfo failed
- //
- return EFI_NOT_FOUND;
- }
-
- //
- // Allocate scratch buffer
- //
- ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));
- if (ScratchBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Allocate destination buffer
- //
- DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));
- if (DstBuffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Call decompress function
- //
- Status = DecompressLibrary->Decompress (
- (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
- DstBuffer,
- ScratchBuffer
- );
-
- CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;
- if (CmpSection->Type == EFI_SECTION_RAW) {
- //
- // Skip the section header and
- // adjust the pointer alignment to 16
- //
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (DstBuffer + 16);
-
- if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
- FfsFileHeader = NULL;
- BuildFvHob ((EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader, FvHeader->FvLength);
- Status = PeiCoreFfsFindNextFile (
- EFI_FV_FILETYPE_DXE_CORE,
- FvHeader,
- &FfsFileHeader
- );
-
- if (EFI_ERROR (Status)) {
- return EFI_NOT_FOUND;
- }
-
- return PeiProcessFile (SectionType, FfsFileHeader, Pe32Data);
- }
- }
- //
- // Decompress successfully.
- // Loop the decompressed data searching for expected section.
- //
- CmpFileData = (VOID *) DstBuffer;
- CmpFileSize = DstBufferSize;
- do {
- CmpSectionLength = *(UINT32 *) (CmpSection->Size) & 0x00ffffff;
- if (CmpSection->Type == EFI_SECTION_PE32) {
- //
- // This is what we want
- //
- *Pe32Data = (VOID *) (CmpSection + 1);
- return EFI_SUCCESS;
- }
-
- OccupiedCmpSectionLength = GetOccupiedSize (CmpSectionLength, 4);
- CmpSection = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);
- } while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);
- }
-
- Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
- FileSize = FfsFileHeader->Size[0] & 0xFF;
- FileSize += (FfsFileHeader->Size[1] << 8) & 0xFF00;
- FileSize += (FfsFileHeader->Size[2] << 16) & 0xFF0000;
- FileSize &= 0x00FFFFFF;
- } while (Section->Type != 0 && (UINTN) ((UINT8 *) Section - (UINT8 *) FfsFileHeader) < FileSize);
-
- //
- // End of the decompression activity
- //
- } else {
-
- Status = PeiCoreFfsFindSectionData (
- EFI_SECTION_PE32,
- FfsFileHeader,
- &SectionData
- );
-
- if (EFI_ERROR (Status)) {
- Status = PeiCoreFfsFindSectionData (
- EFI_SECTION_TE,
- FfsFileHeader,
- &SectionData
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
- }
-
- *Pe32Data = SectionData;
-
- return EFI_SUCCESS;
+/*++
+
+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.
+
+Module Name:
+
+ DxeLoad.c
+
+Abstract:
+
+ Last PEIM.
+ Responsibility of this module is to load the DXE Core from a Firmware Volume.
+
+--*/
+
+#include <DxeIpl.h>
+
+#pragma warning( disable : 4305 )
+
+BOOLEAN gInMemory = FALSE;
+
+//
+// GUID for EM64T
+//
+#define EFI_PPI_NEEDED_BY_DXE \
+ { \
+ 0x4d37da42, 0x3a0c, 0x4eda, 0xb9, 0xeb, 0xbc, 0x0e, 0x1d, 0xb4, 0x71, 0x3b \
+ }
+EFI_GUID mPpiNeededByDxeGuid = EFI_PPI_NEEDED_BY_DXE;
+
+//
+// Module Globals used in the DXE to PEI handoff
+// These must be module globals, so the stack can be switched
+//
+static EFI_DXE_IPL_PPI mDxeIplPpi = {
+ DxeLoadCore
+};
+
+static EFI_PEI_FV_FILE_LOADER_PPI mLoadFilePpi = {
+ DxeIplLoadFile
+};
+
+static EFI_PEI_PPI_DESCRIPTOR mPpiLoadFile = {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gEfiPeiFvFileLoaderPpiGuid,
+ &mLoadFilePpi
+};
+
+static EFI_PEI_PPI_DESCRIPTOR mPpiList = {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gEfiDxeIplPpiGuid,
+ &mDxeIplPpi
+};
+
+static EFI_PEI_PPI_DESCRIPTOR mPpiPeiInMemory = {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gPeiInMemoryGuid,
+ NULL
+};
+
+static EFI_PEI_PPI_DESCRIPTOR mPpiSignal = {
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+ &gEfiEndOfPeiSignalPpiGuid,
+ NULL
+};
+
+DECOMPRESS_LIBRARY gEfiDecompress = {
+ UefiDecompressGetInfo,
+ UefiDecompress
+};
+
+DECOMPRESS_LIBRARY gTianoDecompress = {
+ TianoDecompressGetInfo,
+ TianoDecompress
+};
+
+DECOMPRESS_LIBRARY gCustomDecompress = {
+ CustomDecompressGetInfo,
+ CustomDecompress
+};
+
+STATIC
+UINTN
+GetOccupiedSize (
+ IN UINTN ActualSize,
+ IN UINTN Alignment
+ )
+{
+ UINTN OccupiedSize;
+
+ OccupiedSize = ActualSize;
+ while ((OccupiedSize & (Alignment - 1)) != 0) {
+ OccupiedSize++;
+ }
+
+ return OccupiedSize;
+}
+
+EFI_STATUS
+EFIAPI
+PeimInitializeDxeIpl (
+ IN EFI_FFS_FILE_HEADER *FfsHeader,
+ IN EFI_PEI_SERVICES **PeiServices
+ )
+/*++
+
+Routine Description:
+
+ Initializes the Dxe Ipl PPI
+
+Arguments:
+
+ FfsHeader - Pointer to FFS file header
+ PeiServices - General purpose services available to every PEIM.
+
+Returns:
+
+ EFI_SUCCESS
+
+--*/
+{
+ EFI_STATUS Status;
+ EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
+ EFI_BOOT_MODE BootMode;
+
+ Status = PeiCoreGetBootMode (&BootMode);
+
+ ASSERT_EFI_ERROR (Status);
+
+ Status = PeiCoreLocatePpi (
+ &gPeiInMemoryGuid,
+ 0,
+ NULL,
+ NULL
+ );
+
+ if (EFI_ERROR (Status) && (BootMode != BOOT_ON_S3_RESUME)) {
+ //
+ // The DxeIpl has not yet been shadowed
+ //
+ PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
+
+ //
+ // Shadow DxeIpl and then re-run its entry point
+ //
+ Status = ShadowDxeIpl (FfsHeader, PeiEfiPeiPeCoffLoader);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ } else {
+ if (BootMode != BOOT_ON_S3_RESUME) {
+ //
+ // The DxeIpl has been shadowed
+ //
+ gInMemory = TRUE;
+
+ //
+ // Install LoadFile PPI
+ //
+ Status = PeiCoreInstallPpi (&mPpiLoadFile);
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ }
+ //
+ // Install DxeIpl PPI
+ //
+ PeiCoreInstallPpi (&mPpiList);
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ }
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+DxeLoadCore (
+ IN EFI_DXE_IPL_PPI *This,
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN EFI_PEI_HOB_POINTERS HobList
+ )
+/*++
+
+Routine Description:
+
+ Main entry point to last PEIM
+
+Arguments:
+
+ This - Entry point for DXE IPL PPI
+ PeiServices - General purpose services available to every PEIM.
+ HobList - Address to the Pei HOB list
+
+Returns:
+
+ EFI_SUCCESS - DEX core was successfully loaded.
+ EFI_OUT_OF_RESOURCES - There are not enough resources to load DXE core.
+
+--*/
+{
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS TopOfStack;
+ EFI_PHYSICAL_ADDRESS BaseOfStack;
+ EFI_PHYSICAL_ADDRESS BspStore;
+ EFI_GUID DxeCoreFileName;
+ VOID *DxeCorePe32Data;
+ EFI_PHYSICAL_ADDRESS DxeCoreAddress;
+ UINT64 DxeCoreSize;
+ EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint;
+ EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
+ EFI_BOOT_MODE BootMode;
+ EFI_PEI_RECOVERY_MODULE_PPI *PeiRecovery;
+ EFI_PEI_S3_RESUME_PPI *S3Resume;
+ EFI_PHYSICAL_ADDRESS PageTables;
+
+ TopOfStack = 0;
+ BaseOfStack = 0;
+ BspStore = 0;
+ Status = EFI_SUCCESS;
+
+ //
+ // if in S3 Resume, restore configure
+ //
+ Status = PeiCoreGetBootMode (&BootMode);
+
+ if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) {
+ Status = PeiCoreLocatePpi (
+ &gEfiPeiS3ResumePpiGuid,
+ 0,
+ NULL,
+ (VOID **)&S3Resume
+ );
+
+ ASSERT_EFI_ERROR (Status);
+
+ Status = S3Resume->S3RestoreConfig (PeiServices);
+
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ Status = EFI_SUCCESS;
+
+ //
+ // Install the PEI Protocols that are shared between PEI and DXE
+ //
+#ifdef EFI_NT_EMULATOR
+ PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
+ ASSERT (PeiEfiPeiPeCoffLoader != NULL);
+#else
+ PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderX64Protocol ();
+#endif
+
+#if 0
+ Status = InstallEfiPeiPeCoffLoader64 (PeiServices, &PeiEfiPeiPeCoffLoader, NULL);
+ ASSERT_EFI_ERROR (Status);
+#endif
+ //
+ // Allocate 128KB for the Stack
+ //
+ PeiCoreAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack);
+ ASSERT (BaseOfStack != 0);
+
+ //
+ // Compute the top of the stack we were allocated. Pre-allocate a 32 bytes
+ // for safety (PpisNeededByDxe and DxeCore).
+ //
+ TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - 32;
+
+ //
+ // Add architecture-specifc HOBs (including the BspStore HOB)
+ //
+ Status = CreateArchSpecificHobs (&BspStore);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // See if we are in crisis recovery
+ //
+ Status = PeiCoreGetBootMode (&BootMode);
+ if (!EFI_ERROR (Status) && (BootMode == BOOT_IN_RECOVERY_MODE)) {
+ Status = PeiCoreLocatePpi (
+ &gEfiPeiRecoveryModulePpiGuid,
+ 0,
+ NULL,
+ (VOID **)&PeiRecovery
+ );
+
+ ASSERT_EFI_ERROR (Status);
+ Status = PeiRecovery->LoadRecoveryCapsule (PeiServices, PeiRecovery);
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ //
+ // Find the DXE Core in a Firmware Volume
+ //
+ Status = PeiFindFile (
+ EFI_FV_FILETYPE_DXE_CORE,
+ EFI_SECTION_PE32,
+ &DxeCoreFileName,
+ &DxeCorePe32Data
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Transfer control to the DXE Core
+ // The handoff state is simply a pointer to the HOB list
+ //
+ // PEI_PERF_END (PeiServices, L"DxeIpl", NULL, 0);
+
+ Status = PeiCoreInstallPpi (&mPpiSignal);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA \
+ // memory, it may be corrupted when copying FV to high-end memory
+ LoadGo64Gdt();
+
+ //
+ // Limit to 36 bits of addressing for debug. Should get it from CPU
+ //
+ PageTables = CreateIdentityMappingPageTables (36);
+
+
+ //
+ // Load the DXE Core from a Firmware Volume
+ //
+ Status = PeiLoadx64File (
+ PeiEfiPeiPeCoffLoader,
+ DxeCorePe32Data,
+ EfiBootServicesData,
+ &DxeCoreAddress,
+ &DxeCoreSize,
+ &DxeCoreEntryPoint
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ //
+ // Add HOB for the DXE Core
+ //
+ BuildModuleHob (
+ &DxeCoreFileName,
+ DxeCoreAddress,
+ DxeCoreSize,
+ DxeCoreEntryPoint
+ );
+
+ //
+ // Report Status Code EFI_SW_PEI_PC_HANDOFF_TO_NEXT
+ //
+ REPORT_STATUS_CODE (
+ EFI_PROGRESS_CODE,
+ EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT
+ );
+
+ DEBUG ((EFI_D_INFO, "DXE Core Entry\n"));
+ //
+ // Go to Long Mode. Interrupts will not get turned on until the CPU AP is loaded.
+ // Call x64 drivers passing in single argument, a pointer to the HOBs.
+ //
+ ActivateLongMode (
+ PageTables,
+ (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw),
+ TopOfStack,
+ 0x00000000,
+ DxeCoreEntryPoint
+ );
+
+ //
+ // If we get here, then the DXE Core returned. This is an error
+ //
+ ASSERT_EFI_ERROR (Status);
+
+ return EFI_OUT_OF_RESOURCES;
+}
+
+EFI_STATUS
+PeiFindFile (
+ IN UINT8 Type,
+ IN UINT16 SectionType,
+ OUT EFI_GUID *FileName,
+ OUT VOID **Pe32Data
+ )
+/*++
+
+Routine Description:
+
+ Finds a PE/COFF of a specific Type and SectionType in the Firmware Volumes
+ described in the HOB list. Able to search in a compression set in a FFS file.
+ But only one level of compression is supported, that is, not able to search
+ in a compression set that is within another compression set.
+
+Arguments:
+
+ Type - The Type of file to retrieve
+
+ SectionType - The type of section to retrieve from a file
+
+ FileName - The name of the file found in the Firmware Volume
+
+ Pe32Data - Pointer to the beginning of the PE/COFF file found in the Firmware Volume
+
+Returns:
+
+ EFI_SUCCESS - The file was found, and the name is returned in FileName, and a pointer to
+ the PE/COFF image is returned in Pe32Data
+
+ EFI_NOT_FOUND - The file was not found in the Firmware Volumes present in the HOB List
+
+--*/
+{
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
+ EFI_FFS_FILE_HEADER *FfsFileHeader;
+ VOID *SectionData;
+ EFI_STATUS Status;
+ EFI_PEI_HOB_POINTERS Hob;
+
+
+ FwVolHeader = NULL;
+ FfsFileHeader = NULL;
+ SectionData = NULL;
+
+ //
+ // Foreach Firmware Volume, look for a specified type
+ // of file and break out when one is found
+ //
+ Hob.Raw = GetHobList ();
+ while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw)) != NULL) {
+ FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) (Hob.FirmwareVolume->BaseAddress);
+ Status = PeiCoreFfsFindNextFile (
+ Type,
+ FwVolHeader,
+ &FfsFileHeader
+ );
+ if (!EFI_ERROR (Status)) {
+ CopyMem (FileName, &FfsFileHeader->Name, sizeof (EFI_GUID));
+ Status = PeiProcessFile (
+ SectionType,
+ FfsFileHeader,
+ Pe32Data
+ );
+ return Status;
+ }
+ Hob.Raw = GET_NEXT_HOB (Hob);
+ }
+ return EFI_NOT_FOUND;
+}
+
+EFI_STATUS
+PeiLoadx64File (
+ IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader,
+ IN VOID *Pe32Data,
+ IN EFI_MEMORY_TYPE MemoryType,
+ OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
+ OUT UINT64 *ImageSize,
+ OUT EFI_PHYSICAL_ADDRESS *EntryPoint
+ )
+/*++
+
+Routine Description:
+
+ Loads and relocates a PE/COFF image into memory.
+
+Arguments:
+
+ PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol
+
+ Pe32Data - The base address of the PE/COFF file that is to be loaded and relocated
+
+ ImageAddress - The base address of the relocated PE/COFF image
+
+ ImageSize - The size of the relocated PE/COFF image
+
+ EntryPoint - The entry point of the relocated PE/COFF image
+
+Returns:
+
+ EFI_SUCCESS - The file was loaded and relocated
+ EFI_OUT_OF_RESOURCES - There was not enough memory to load and relocate the PE/COFF file
+
+--*/
+{
+ EFI_STATUS Status;
+ PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
+ EFI_PHYSICAL_ADDRESS MemoryBuffer;
+
+ ZeroMem (&ImageContext, sizeof (ImageContext));
+ ImageContext.Handle = Pe32Data;
+ Status = GetImageReadFunction (&ImageContext);
+
+ ASSERT_EFI_ERROR (Status);
+
+ Status = PeiEfiPeiPeCoffLoader->GetImageInfo (PeiEfiPeiPeCoffLoader, &ImageContext);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ //
+ // Allocate Memory for the image
+ //
+ //
+ // Allocate Memory for the image
+ //
+ PeiCoreAllocatePages (MemoryType, EFI_SIZE_TO_PAGES ((UINT32) ImageContext.ImageSize), &MemoryBuffer);
+ ImageContext.ImageAddress = MemoryBuffer;
+ ASSERT (ImageContext.ImageAddress != 0);
+
+ //
+ // Load the image to our new buffer
+ //
+
+ Status = PeiEfiPeiPeCoffLoader->LoadImage (PeiEfiPeiPeCoffLoader, &ImageContext);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Relocate the image in our new buffer
+ //
+ Status = PeiEfiPeiPeCoffLoader->RelocateImage (PeiEfiPeiPeCoffLoader, &ImageContext);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Flush the instruction cache so the image data is written before we execute it
+ //
+ InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);
+
+ *ImageAddress = ImageContext.ImageAddress;
+ *ImageSize = ImageContext.ImageSize;
+ *EntryPoint = ImageContext.EntryPoint;
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+ShadowDxeIpl (
+ IN EFI_FFS_FILE_HEADER *DxeIplFileHeader,
+ IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader
+ )
+/*++
+
+Routine Description:
+
+ Shadow the DXE IPL to a different memory location. This occurs after permanent
+ memory has been discovered.
+
+Arguments:
+
+ DxeIplFileHeader - Pointer to the FFS file header of the DXE IPL driver
+
+ PeiEfiPeiPeCoffLoader - Pointer to a PE COFF loader protocol
+
+Returns:
+
+ EFI_SUCCESS - DXE IPL was successfully shadowed to a different memory location.
+
+ EFI_ ERROR - The shadow was unsuccessful.
+
+
+--*/
+{
+ UINTN SectionLength;
+ UINTN OccupiedSectionLength;
+ EFI_PHYSICAL_ADDRESS DxeIplAddress;
+ UINT64 DxeIplSize;
+ EFI_PHYSICAL_ADDRESS DxeIplEntryPoint;
+ EFI_STATUS Status;
+ EFI_COMMON_SECTION_HEADER *Section;
+
+ Section = (EFI_COMMON_SECTION_HEADER *) (DxeIplFileHeader + 1);
+
+ while ((Section->Type != EFI_SECTION_PE32) && (Section->Type != EFI_SECTION_TE)) {
+ SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
+ OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
+ Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
+ }
+
+ //
+ // Relocate DxeIpl into memory by using loadfile service
+ //
+ Status = PeiLoadx64File (
+ PeiEfiPeiPeCoffLoader,
+ (VOID *) (Section + 1),
+ EfiBootServicesData,
+ &DxeIplAddress,
+ &DxeIplSize,
+ &DxeIplEntryPoint
+ );
+
+ if (Status == EFI_SUCCESS) {
+ //
+ // Install PeiInMemory to indicate the Dxeipl is shadowed
+ //
+ Status = PeiCoreInstallPpi (&mPpiPeiInMemory);
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = ((EFI_PEIM_ENTRY_POINT) (UINTN) DxeIplEntryPoint) (DxeIplFileHeader, GetPeiServicesTablePointer());
+ }
+
+ return Status;
+}
+
+EFI_STATUS
+EFIAPI
+DxeIplLoadFile (
+ IN EFI_PEI_FV_FILE_LOADER_PPI *This,
+ IN EFI_FFS_FILE_HEADER *FfsHeader,
+ OUT EFI_PHYSICAL_ADDRESS *ImageAddress,
+ OUT UINT64 *ImageSize,
+ OUT EFI_PHYSICAL_ADDRESS *EntryPoint
+ )
+/*++
+
+Routine Description:
+
+ Given a pointer to an FFS file containing a PE32 image, get the
+ information on the PE32 image, and then "load" it so that it
+ can be executed.
+
+Arguments:
+
+ This - pointer to our file loader protocol
+ FfsHeader - pointer to the FFS file header of the FFS file that
+ contains the PE32 image we want to load
+ ImageAddress - returned address where the PE32 image is loaded
+ ImageSize - returned size of the loaded PE32 image
+ EntryPoint - entry point to the loaded PE32 image
+
+Returns:
+
+ EFI_SUCCESS - The FFS file was successfully loaded.
+ EFI_ERROR - Unable to load the FFS file.
+
+--*/
+{
+ EFI_PEI_PE_COFF_LOADER_PROTOCOL *PeiEfiPeiPeCoffLoader;
+ EFI_STATUS Status;
+ VOID *Pe32Data;
+
+ Pe32Data = NULL;
+ PeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)GetPeCoffLoaderProtocol ();
+
+ //
+ // Preprocess the FFS file to get a pointer to the PE32 information
+ // in the enclosed PE32 image.
+ //
+ Status = PeiProcessFile (
+ EFI_SECTION_PE32,
+ FfsHeader,
+ &Pe32Data
+ );
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ //
+ // Load the PE image from the FFS file
+ //
+ Status = PeiLoadx64File (
+ PeiEfiPeiPeCoffLoader,
+ Pe32Data,
+ EfiBootServicesData,
+ ImageAddress,
+ ImageSize,
+ EntryPoint
+ );
+
+ return Status;
+}
+
+EFI_STATUS
+PeiProcessFile (
+ IN UINT16 SectionType,
+ IN EFI_FFS_FILE_HEADER *FfsFileHeader,
+ OUT VOID **Pe32Data
+ )
+/*++
+
+Routine Description:
+
+Arguments:
+
+ SectionType - The type of section in the FFS file to process.
+
+ FfsFileHeader - Pointer to the FFS file to process, looking for the
+ specified SectionType
+
+ Pe32Data - returned pointer to the start of the PE32 image found
+ in the FFS file.
+
+Returns:
+
+ EFI_SUCCESS - found the PE32 section in the FFS file
+
+--*/
+{
+ EFI_STATUS Status;
+ VOID *SectionData;
+ DECOMPRESS_LIBRARY *DecompressLibrary;
+ UINT8 *DstBuffer;
+ UINT8 *ScratchBuffer;
+ UINT32 DstBufferSize;
+ UINT32 ScratchBufferSize;
+ EFI_COMMON_SECTION_HEADER *CmpSection;
+ UINTN CmpSectionLength;
+ UINTN OccupiedCmpSectionLength;
+ VOID *CmpFileData;
+ UINTN CmpFileSize;
+ EFI_COMMON_SECTION_HEADER *Section;
+ UINTN SectionLength;
+ UINTN OccupiedSectionLength;
+ UINT64 FileSize;
+ EFI_GUID_DEFINED_SECTION *GuidedSectionHeader;
+ UINT32 AuthenticationStatus;
+ EFI_PEI_SECTION_EXTRACTION_PPI *SectionExtract;
+ UINT32 BufferSize;
+ UINT8 *Buffer;
+ EFI_PEI_SECURITY_PPI *Security;
+ BOOLEAN StartCrisisRecovery;
+ EFI_GUID TempGuid;
+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
+ EFI_COMPRESSION_SECTION *CompressionSection;
+
+ Status = PeiCoreFfsFindSectionData (
+ EFI_SECTION_COMPRESSION,
+ FfsFileHeader,
+ &SectionData
+ );
+
+ //
+ // Upon finding a DXE Core file, see if there is first a compression section
+ //
+ if (!EFI_ERROR (Status)) {
+ //
+ // Yes, there is a compression section, so extract the contents
+ // Decompress the image here
+ //
+ Section = (EFI_COMMON_SECTION_HEADER *) (UINTN) (VOID *) ((UINT8 *) (FfsFileHeader) + (UINTN) sizeof (EFI_FFS_FILE_HEADER));
+
+ do {
+ SectionLength = *(UINT32 *) (Section->Size) & 0x00ffffff;
+ OccupiedSectionLength = GetOccupiedSize (SectionLength, 4);
+
+ //
+ // Was the DXE Core file encapsulated in a GUID'd section?
+ //
+ if (Section->Type == EFI_SECTION_GUID_DEFINED) {
+ //
+ // Locate the GUID'd Section Extractor
+ //
+ GuidedSectionHeader = (VOID *) (Section + 1);
+
+ //
+ // This following code constitutes the addition of the security model
+ // to the DXE IPL.
+ //
+ //
+ // Set a default authenticatino state
+ //
+ AuthenticationStatus = 0;
+
+ Status = PeiCoreLocatePpi (
+ &gEfiPeiSectionExtractionPpiGuid,
+ 0,
+ NULL,
+ (VOID **)&SectionExtract
+ );
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ //
+ // Verify Authentication State
+ //
+ CopyMem (&TempGuid, Section + 1, sizeof (EFI_GUID));
+
+ Status = SectionExtract->PeiGetSection (
+ GetPeiServicesTablePointer(),
+ SectionExtract,
+ (EFI_SECTION_TYPE *) &SectionType,
+ &TempGuid,
+ 0,
+ (VOID **) &Buffer,
+ &BufferSize,
+ &AuthenticationStatus
+ );
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ //
+ // If not ask the Security PPI, if exists, for disposition
+ //
+ //
+ Status = PeiCoreLocatePpi (
+ &gEfiPeiSecurityPpiGuid,
+ 0,
+ NULL,
+ (VOID **)&Security
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = Security->AuthenticationState (
+ GetPeiServicesTablePointer(),
+ (struct _EFI_PEI_SECURITY_PPI *) Security,
+ AuthenticationStatus,
+ FfsFileHeader,
+ &StartCrisisRecovery
+ );
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ //
+ // If there is a security violation, report to caller and have
+ // the upper-level logic possible engender a crisis recovery
+ //
+ if (StartCrisisRecovery) {
+ return EFI_SECURITY_VIOLATION;
+ }
+ }
+
+ if (Section->Type == EFI_SECTION_PE32) {
+ //
+ // This is what we want
+ //
+ *Pe32Data = (VOID *) (Section + 1);
+ return EFI_SUCCESS;
+ } else if (Section->Type == EFI_SECTION_COMPRESSION) {
+ //
+ // This is a compression set, expand it
+ //
+ CompressionSection = (EFI_COMPRESSION_SECTION *) Section;
+
+ switch (CompressionSection->CompressionType) {
+ case EFI_STANDARD_COMPRESSION:
+ DecompressLibrary = &gTianoDecompress;
+ break;
+
+ case EFI_CUSTOMIZED_COMPRESSION:
+ //
+ // Load user customized compression protocol.
+ //
+ DecompressLibrary = &gCustomDecompress;
+ break;
+
+ case EFI_NOT_COMPRESSED:
+ default:
+ //
+ // Need to support not compressed file
+ //
+ ASSERT_EFI_ERROR (Status);
+ return EFI_NOT_FOUND;
+ }
+
+ Status = DecompressLibrary->GetInfo (
+ (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
+ (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION),
+ &DstBufferSize,
+ &ScratchBufferSize
+ );
+ if (EFI_ERROR (Status)) {
+ //
+ // GetInfo failed
+ //
+ return EFI_NOT_FOUND;
+ }
+
+ //
+ // Allocate scratch buffer
+ //
+ ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));
+ if (ScratchBuffer == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ //
+ // Allocate destination buffer
+ //
+ DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));
+ if (DstBuffer == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ //
+ // Call decompress function
+ //
+ Status = DecompressLibrary->Decompress (
+ (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1),
+ DstBuffer,
+ ScratchBuffer
+ );
+
+ CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer;
+ if (CmpSection->Type == EFI_SECTION_RAW) {
+ //
+ // Skip the section header and
+ // adjust the pointer alignment to 16
+ //
+ FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (DstBuffer + 16);
+
+ if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
+ FfsFileHeader = NULL;
+ BuildFvHob ((EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader, FvHeader->FvLength);
+ Status = PeiCoreFfsFindNextFile (
+ EFI_FV_FILETYPE_DXE_CORE,
+ FvHeader,
+ &FfsFileHeader
+ );
+
+ if (EFI_ERROR (Status)) {
+ return EFI_NOT_FOUND;
+ }
+
+ return PeiProcessFile (SectionType, FfsFileHeader, Pe32Data);
+ }
+ }
+ //
+ // Decompress successfully.
+ // Loop the decompressed data searching for expected section.
+ //
+ CmpFileData = (VOID *) DstBuffer;
+ CmpFileSize = DstBufferSize;
+ do {
+ CmpSectionLength = *(UINT32 *) (CmpSection->Size) & 0x00ffffff;
+ if (CmpSection->Type == EFI_SECTION_PE32) {
+ //
+ // This is what we want
+ //
+ *Pe32Data = (VOID *) (CmpSection + 1);
+ return EFI_SUCCESS;
+ }
+
+ OccupiedCmpSectionLength = GetOccupiedSize (CmpSectionLength, 4);
+ CmpSection = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) CmpSection + OccupiedCmpSectionLength);
+ } while (CmpSection->Type != 0 && (UINTN) ((UINT8 *) CmpSection - (UINT8 *) CmpFileData) < CmpFileSize);
+ }
+
+ Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + OccupiedSectionLength);
+ FileSize = FfsFileHeader->Size[0] & 0xFF;
+ FileSize += (FfsFileHeader->Size[1] << 8) & 0xFF00;
+ FileSize += (FfsFileHeader->Size[2] << 16) & 0xFF0000;
+ FileSize &= 0x00FFFFFF;
+ } while (Section->Type != 0 && (UINTN) ((UINT8 *) Section - (UINT8 *) FfsFileHeader) < FileSize);
+
+ //
+ // End of the decompression activity
+ //
+ } else {
+
+ Status = PeiCoreFfsFindSectionData (
+ EFI_SECTION_PE32,
+ FfsFileHeader,
+ &SectionData
+ );
+
+ if (EFI_ERROR (Status)) {
+ Status = PeiCoreFfsFindSectionData (
+ EFI_SECTION_TE,
+ FfsFileHeader,
+ &SectionData
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ }
+ }
+
+ *Pe32Data = SectionData;
+
+ return EFI_SUCCESS;
} \ No newline at end of file
diff --git a/EdkModulePkg/Core/DxeIplPeim/build.xml b/EdkModulePkg/Core/DxeIplPeim/build.xml
index bb88e8a2c8..158d088a13 100644
--- a/EdkModulePkg/Core/DxeIplPeim/build.xml
+++ b/EdkModulePkg/Core/DxeIplPeim/build.xml
@@ -1,47 +1,74 @@
-<?xml version="1.0" encoding="UTF-8"?><!-- 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.-->
-<project basedir="." default="DxeIpl"><!--Apply external ANT tasks-->
- <taskdef resource="GenBuild.tasks"/>
- <taskdef resource="net/sf/antcontrib/antlib.xml"/>
- <property environment="env"/>
- <property name="WORKSPACE_DIR" value="${env.WORKSPACE}"/>
- <import file="${WORKSPACE_DIR}/Tools/Conf/BuildMacro.xml"/><!--MODULE_RELATIVE PATH is relative to PACKAGE_DIR-->
- <property name="MODULE_RELATIVE_PATH" value="Core/DxeIplPeim"/>
- <property name="MODULE_DIR" value="${PACKAGE_DIR}/${MODULE_RELATIVE_PATH}"/>
- <property name="COMMON_FILE" value="${WORKSPACE_DIR}/Tools/Conf/Common.xml"/>
- <target name="DxeIpl">
- <GenBuild baseName="DxeIpl" mbdFilename="${MODULE_DIR}/DxeIpl.mbd" msaFilename="${MODULE_DIR}/DxeIpl.msa"/>
- </target>
- <target depends="DxeIpl_clean" name="clean"/>
- <target depends="DxeIpl_cleanall" name="cleanall"/>
- <target name="DxeIpl_clean">
- <OutputDirSetup baseName="DxeIpl" mbdFilename="${MODULE_DIR}/DxeIpl.mbd" msaFilename="${MODULE_DIR}/DxeIpl.msa"/>
- <if>
- <available file="${DEST_DIR_OUTPUT}/DxeIpl_build.xml"/>
- <then>
- <ant antfile="${DEST_DIR_OUTPUT}/DxeIpl_build.xml" target="clean"/>
- </then>
- </if>
- <delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>
- </target>
- <target name="DxeIpl_cleanall">
- <OutputDirSetup baseName="DxeIpl" mbdFilename="${MODULE_DIR}/DxeIpl.mbd" msaFilename="${MODULE_DIR}/DxeIpl.msa"/>
- <if>
- <available file="${DEST_DIR_OUTPUT}/DxeIpl_build.xml"/>
- <then>
- <ant antfile="${DEST_DIR_OUTPUT}/DxeIpl_build.xml" target="cleanall"/>
- </then>
- </if>
- <delete dir="${DEST_DIR_OUTPUT}"/>
- <delete dir="${DEST_DIR_DEBUG}"/>
- <delete>
- <fileset dir="${BIN_DIR}" includes="**DxeIpl*"/>
- </delete>
- </target>
+<?xml version="1.0" encoding="UTF-8"?><!-- 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.-->
+<project basedir="." default="DxeIpl"><!--Apply external ANT tasks-->
+ <taskdef resource="GenBuild.tasks"/>
+ <taskdef resource="net/sf/antcontrib/antlib.xml"/>
+ <property environment="env"/>
+ <property name="WORKSPACE_DIR" value="${env.WORKSPACE}"/>
+ <import file="${WORKSPACE_DIR}/Tools/Conf/BuildMacro.xml"/><!--MODULE_RELATIVE PATH is relative to PACKAGE_DIR-->
+ <property name="MODULE_RELATIVE_PATH" value="Core/DxeIplPeim"/>
+ <property name="MODULE_DIR" value="${PACKAGE_DIR}/${MODULE_RELATIVE_PATH}"/>
+ <property name="COMMON_FILE" value="${WORKSPACE_DIR}/Tools/Conf/Common.xml"/>
+ <target name="DxeIplX64">
+ <GenBuild baseName="DxeIplX64" mbdFilename="${MODULE_DIR}/DxeIplX64.mbd" msaFilename="${MODULE_DIR}/DxeIplX64.msa"/>
+ </target>
+ <target name="DxeIpl">
+ <GenBuild baseName="DxeIpl" mbdFilename="${MODULE_DIR}/DxeIpl.mbd" msaFilename="${MODULE_DIR}/DxeIpl.msa"/>
+ </target>
+ <target depends="DxeIpl_clean" name="clean"/>
+ <target depends="DxeIpl_cleanall" name="cleanall"/>
+ <target name="DxeIplX64_clean">
+ <OutputDirSetup baseName="DxeIplX64" mbdFilename="${MODULE_DIR}/DxeIplX64.mbd" msaFilename="${MODULE_DIR}/DxeIplX64.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/DxeIplX64_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/DxeIplX64_build.xml" target="clean"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>
+ </target>
+ <target name="DxeIpl_clean">
+ <OutputDirSetup baseName="DxeIpl" mbdFilename="${MODULE_DIR}/DxeIpl.mbd" msaFilename="${MODULE_DIR}/DxeIpl.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/DxeIpl_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/DxeIpl_build.xml" target="clean"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>
+ </target>
+ <target name="DxeIplX64_cleanall">
+ <OutputDirSetup baseName="DxeIplX64" mbdFilename="${MODULE_DIR}/DxeIplX64.mbd" msaFilename="${MODULE_DIR}/DxeIplX64.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/DxeIplX64_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/DxeIplX64_build.xml" target="cleanall"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}"/>
+ <delete dir="${DEST_DIR_DEBUG}"/>
+ <delete>
+ <fileset dir="${BIN_DIR}" includes="**DxeIplX64*"/>
+ </delete>
+ </target>
+ <target name="DxeIpl_cleanall">
+ <OutputDirSetup baseName="DxeIpl" mbdFilename="${MODULE_DIR}/DxeIpl.mbd" msaFilename="${MODULE_DIR}/DxeIpl.msa"/>
+ <if>
+ <available file="${DEST_DIR_OUTPUT}/DxeIpl_build.xml"/>
+ <then>
+ <ant antfile="${DEST_DIR_OUTPUT}/DxeIpl_build.xml" target="cleanall"/>
+ </then>
+ </if>
+ <delete dir="${DEST_DIR_OUTPUT}"/>
+ <delete dir="${DEST_DIR_DEBUG}"/>
+ <delete>
+ <fileset dir="${BIN_DIR}" includes="**DxeIpl*"/>
+ </delete>
+ </target>
</project> \ No newline at end of file
diff --git a/EdkModulePkg/Core/DxeIplPeim/x64/LongMode.asm b/EdkModulePkg/Core/DxeIplPeim/x64/LongMode.asm
index a9c4e774cf..ae87bd83e4 100644
--- a/EdkModulePkg/Core/DxeIplPeim/x64/LongMode.asm
+++ b/EdkModulePkg/Core/DxeIplPeim/x64/LongMode.asm
@@ -1,1357 +1,1350 @@
- 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
-
- db 48h
- mov ecx, [ebp+10h] ; Pass Hob Start in RCX
- db 48h
- mov eax, [ebp+20h] ; Get the function pointer for
- ; PpisNeededByDxeIplEntryPoint into EAX
-
-;; 00000905 FF D0 call rax
- db 0ffh
- db 0d0h
-
- 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:
-
-;
-;
-;------------------------------------------------------------------------------
-; Generic IDT Vector Handlers for the Host. They are all the same so they
-; will compress really well.
-;
-; By knowing the return address for Vector 00 you can can calculate the
-; vector number by looking at the call CommonInterruptEntry return address.
-; (return address - AsmIdtVector00Base)/8 == IDT index
-;
-;------------------------------------------------------------------------------
-
-_AsmIdtVector00 PROC NEAR PUBLIC
- call CommonInterruptEntry
-_AsmIdtVector00 ENDP
-AsmIdtVector00Base PROC NEAR PUBLIC
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
- call CommonInterruptEntry
- nop
- nop
- nop
-AsmIdtVector00Base ENDP
-
-
-;---------------------------------------;
-; CommonInterruptEntry ;
-;---------------------------------------;
-; The follow algorithm is used for the common interrupt routine.
-; TBD: Save EFI_SYSTEM_CONTEXT_x64 on the stack per AP definition
-;
-;
-CommonInterruptEntry PROC NEAR PUBLIC
- cli
- jmp $
- iret
-
-CommonInterruptEntry ENDP
-
-END
-
+ 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:
+
+;
+;
+;------------------------------------------------------------------------------
+; Generic IDT Vector Handlers for the Host. They are all the same so they
+; will compress really well.
+;
+; By knowing the return address for Vector 00 you can can calculate the
+; vector number by looking at the call CommonInterruptEntry return address.
+; (return address - AsmIdtVector00Base)/8 == IDT index
+;
+;------------------------------------------------------------------------------
+
+_AsmIdtVector00 PROC NEAR PUBLIC
+ call CommonInterruptEntry
+_AsmIdtVector00 ENDP
+AsmIdtVector00Base PROC NEAR PUBLIC
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+ call CommonInterruptEntry
+ nop
+ nop
+ nop
+AsmIdtVector00Base ENDP
+
+
+;---------------------------------------;
+; CommonInterruptEntry ;
+;---------------------------------------;
+; The follow algorithm is used for the common interrupt routine.
+; TBD: Save EFI_SYSTEM_CONTEXT_x64 on the stack per AP definition
+;
+;
+CommonInterruptEntry PROC NEAR PUBLIC
+ cli
+ jmp $
+ iret
+
+CommonInterruptEntry ENDP
+
+END
+