mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-20 20:24:28 +02:00
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:
parent
991d660b95
commit
ebca816989
@ -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/ReadPmc.asm</Filename>
|
||||||
<Filename SupArchList="X64">X64/Monitor.asm</Filename>
|
<Filename SupArchList="X64">X64/Monitor.asm</Filename>
|
||||||
<Filename SupArchList="X64">X64/Mwait.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/DisablePaging64.asm</Filename>
|
||||||
<Filename SupArchList="X64">X64/Wbinvd.asm</Filename>
|
<Filename SupArchList="X64">X64/Wbinvd.asm</Filename>
|
||||||
<Filename SupArchList="X64">X64/Invd.asm</Filename>
|
<Filename SupArchList="X64">X64/Invd.asm</Filename>
|
||||||
|
61
MdePkg/Library/BaseLib/X64/EnablePaging64.asm
Normal file
61
MdePkg/Library/BaseLib/X64/EnablePaging64.asm
Normal file
@ -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);
|
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);
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user