Added a 64-bit version of EnablePaging64() on X64. AsmEnablePaging64() is the transition code to switch the processor from 32-bit into 64-bit long mode and thus is typically linked with 32-bit images only. However, it's desired to link the transition code into a 64-bit image in some special cases. CPU driver is a good example among those.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1092 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
bxing 2006-07-25 08:30:02 +00:00
parent 991d660b95
commit ebca816989
3 changed files with 62 additions and 43 deletions

@ -378,6 +378,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
<Filename SupArchList="X64">X64/ReadPmc.asm</Filename>
<Filename SupArchList="X64">X64/Monitor.asm</Filename>
<Filename SupArchList="X64">X64/Mwait.asm</Filename>
<Filename SupArchList="X64">X64/EnablePaging64.asm</Filename>
<Filename SupArchList="X64">X64/DisablePaging64.asm</Filename>
<Filename SupArchList="X64">X64/Wbinvd.asm</Filename>
<Filename SupArchList="X64">X64/Invd.asm</Filename>

@ -0,0 +1,61 @@
;------------------------------------------------------------------------------
;
; 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:
;
; 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
mov dword ptr [rsp], @F ; offset for far retf, seg is the 1st arg
mov rax, cr4 ; mov eax, cr4
or al, (1 SHL 5)
mov cr4, rax ; enable PAE
mov ecx, 0c0000080h
rdmsr
or ah, 1 ; set LME
wrmsr
mov rax, cr0 ; mov eax, 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
jmp $ ; halt processor if EntryPoint() returned
InternalX86EnablePaging64 ENDP
END

@ -108,46 +108,3 @@ 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);
}