From 744e71a3bf96a450329f5b7788202f5fabe19c9d Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Thu, 30 Apr 2009 07:17:52 +0000 Subject: Fix the bug that EnablePaging64() should assert() for x64 platform. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8223 6f19259b-4bc3-4df7-8a09-765794883524 --- MdePkg/Library/BaseLib/BaseLib.inf | 2 - MdePkg/Library/BaseLib/X64/EnablePaging64.S | 61 ------------------------- MdePkg/Library/BaseLib/X64/EnablePaging64.asm | 64 --------------------------- MdePkg/Library/BaseLib/X64/Non-existing.c | 44 ++++++++++++++++++ 4 files changed, 44 insertions(+), 127 deletions(-) delete mode 100644 MdePkg/Library/BaseLib/X64/EnablePaging64.S delete mode 100644 MdePkg/Library/BaseLib/X64/EnablePaging64.asm (limited to 'MdePkg/Library') diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index 71c1950..822ee59 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -370,7 +370,6 @@ X64/Invd.asm X64/Wbinvd.asm X64/DisablePaging64.asm - X64/EnablePaging64.asm X64/Mwait.asm X64/Monitor.asm X64/ReadPmc.asm @@ -533,7 +532,6 @@ X64/FxSave.S | GCC X64/FxRestore.S | GCC X64/FlushCacheLine.S | GCC - X64/EnablePaging64.S | GCC X64/EnableInterrupts.S | GCC X64/EnableDisableInterrupts.S | GCC X64/DisablePaging64.S | GCC diff --git a/MdePkg/Library/BaseLib/X64/EnablePaging64.S b/MdePkg/Library/BaseLib/X64/EnablePaging64.S deleted file mode 100644 index 82c6eb7..0000000 --- a/MdePkg/Library/BaseLib/X64/EnablePaging64.S +++ /dev/null @@ -1,61 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2006 - 2008, 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: -# -# EnablePaging64.S -# -# Abstract: -# -# AsmEnablePaging64 function -# -# Notes: -# -#------------------------------------------------------------------------------ - - -#------------------------------------------------------------------------------ -# VOID -# EFIAPI -# InternalX86EnablePaging64 ( -# IN UINT16 Cs, -# IN UINT64 EntryPoint, -# IN UINT64 Context1, OPTIONAL -# IN UINT64 Context2, OPTIONAL -# IN UINT64 NewStack -# ); -#------------------------------------------------------------------------------ -.global ASM_PFX(InternalX86EnablePaging64) -ASM_PFX(InternalX86EnablePaging64): - cli - pop %rax # skip the return address - callq Base -Base: - addl $(L1-Base),(%rsp) # offset for ret, seg is the 1st arg - mov %cr4,%rax - or $0x20,%al - mov %rax,%cr4 # enable PAE - mov $0xc0000080,%ecx - rdmsr - or $0x1,%ah # set LME - wrmsr - mov %cr0,%rax - bts $0x1f,%eax - mov %rax,%cr0 # enable paging - lret -L1: # long mode starts here - addr32 mov (%esp),%rbx - addr32 mov 0x8(%esp),%rcx - addr32 mov 0x10(%esp),%rdx - addr32 mov 0x18(%esp),%rsp - add $-0x20,%rsp - callq *%rbx - jmp . # dead loop if EntryPoint() returned diff --git a/MdePkg/Library/BaseLib/X64/EnablePaging64.asm b/MdePkg/Library/BaseLib/X64/EnablePaging64.asm deleted file mode 100644 index bd5770d..0000000 --- a/MdePkg/Library/BaseLib/X64/EnablePaging64.asm +++ /dev/null @@ -1,64 +0,0 @@ -;------------------------------------------------------------------------------ -; -; Copyright (c) 2006 - 2008, 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: -; -; EnablePaging64.Asm -; -; Abstract: -; -; AsmEnablePaging64 function -; -; Notes: -; -;------------------------------------------------------------------------------ - - .code - -;------------------------------------------------------------------------------ -; VOID -; EFIAPI -; InternalX86EnablePaging64 ( -; IN UINT16 Cs, -; IN UINT64 EntryPoint, -; IN UINT64 Context1, OPTIONAL -; IN UINT64 Context2, OPTIONAL -; IN UINT64 NewStack -; ); -;------------------------------------------------------------------------------ -InternalX86EnablePaging64 PROC - cli - pop rax ; skip the return address - call @Base -@Base: - add dword ptr [rsp], @F - @Base ; offset for far retf, seg is the 1st arg - mov rax, cr4 - or al, (1 SHL 5) - mov cr4, rax ; enable PAE - mov ecx, 0c0000080h - rdmsr - or ah, 1 ; set LME - wrmsr - mov rax, cr0 - bts eax, 31 - mov cr0, rax ; enable paging - retf -@@: ; long mode starts here - mov rbx, [esp] - mov rcx, [esp + 8] - mov rdx, [esp + 10h] - mov rsp, [esp + 18h] - add rsp, -20h - call rbx - hlt ; halt processor if EntryPoint() returned -InternalX86EnablePaging64 ENDP - - END diff --git a/MdePkg/Library/BaseLib/X64/Non-existing.c b/MdePkg/Library/BaseLib/X64/Non-existing.c index 9814cba..5e48c96 100644 --- a/MdePkg/Library/BaseLib/X64/Non-existing.c +++ b/MdePkg/Library/BaseLib/X64/Non-existing.c @@ -107,3 +107,47 @@ InternalX86DisablePaging32 ( // ASSERT (FALSE); } + + +/** + Enables the 64-bit paging mode on the CPU. + + Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables + must be properly initialized prior to calling this service. This function + assumes the current execution mode is 32-bit protected mode with flat + descriptors. This function is only available on IA-32. After the 64-bit + paging mode is enabled, control is transferred to the function specified by + EntryPoint using the new stack specified by NewStack and passing in the + parameters specified by Context1 and Context2. Context1 and Context2 are + optional and may be 0. The function EntryPoint must never return. + + @param Cs The 16-bit selector to load in the CS before EntryPoint + is called. The descriptor in the GDT that this selector + references must be setup for long mode. + @param EntryPoint The 64-bit virtual address of the function to call with + the new stack after paging is enabled. + @param Context1 The 64-bit virtual address of the context to pass into + the EntryPoint function as the first parameter after + paging is enabled. + @param Context2 The 64-bit virtual address of the context to pass into + the EntryPoint function as the second parameter after + paging is enabled. + @param NewStack The 64-bit virtual address of the new stack to use for + the EntryPoint function after paging is enabled. + +**/ +VOID +EFIAPI +InternalX86EnablePaging64 ( + IN UINT16 Cs, + IN UINT64 EntryPoint, + IN UINT64 Context1, OPTIONAL + IN UINT64 Context2, OPTIONAL + IN UINT64 NewStack + ) +{ + // + // This function cannot work on x64 platform. + // + ASSERT (FALSE); +} -- cgit v1.1