diff options
author | lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524> | 2006-05-14 09:14:46 +0000 |
---|---|---|
committer | lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524> | 2006-05-14 09:14:46 +0000 |
commit | e20ee534ac22960fef84e868cb45eb54b813a290 (patch) | |
tree | b16e0f1e7b07d5765e5d86fd826e99b37c5edd40 /EdkModulePkg/Core/DxeIplPeim | |
parent | d4864e235043b5adacfc50b47c0a747161398a1d (diff) | |
download | edk2-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.mbd | 126 | ||||
-rw-r--r-- | EdkModulePkg/Core/DxeIplPeim/DxeIplX64.mbd | 98 | ||||
-rw-r--r-- | EdkModulePkg/Core/DxeIplPeim/DxeIplX64.msa | 207 | ||||
-rw-r--r-- | EdkModulePkg/Core/DxeIplPeim/DxeLoadX64.c | 2006 | ||||
-rw-r--r-- | EdkModulePkg/Core/DxeIplPeim/build.xml | 119 | ||||
-rw-r--r-- | EdkModulePkg/Core/DxeIplPeim/x64/LongMode.asm | 2707 |
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 + |