1.Restore BSP IDT table to AP when AP wakeup.
2.Restore Virtual wire mode on AP when AP wakeup. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10575 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
;------------------------------------------------------------------------------
|
||||
; X64 assembly file for AP startup vector.
|
||||
;
|
||||
; Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
|
||||
; Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
; 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
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
.code
|
||||
|
||||
include AsmInclude.inc
|
||||
include AsmInclude.inc
|
||||
;-------------------------------------------------------------------------------------
|
||||
|
||||
;-------------------------------------------------------------------------------------
|
||||
@@ -34,7 +34,7 @@ RendezvousFunnelProcStart::
|
||||
db 8ch, 0c8h ; mov ax, cs
|
||||
db 8eh, 0d8h ; mov ds, ax
|
||||
db 8eh, 0c0h ; mov es, ax
|
||||
db 8eh, 0d0h ; mov ss, ax
|
||||
db 8eh, 0d0h ; mov ss, ax
|
||||
db 33h, 0c0h ; xor ax, ax
|
||||
db 8eh, 0e0h ; mov fs, ax
|
||||
db 8eh, 0e8h ; mov gs, ax
|
||||
@@ -48,15 +48,20 @@ RendezvousFunnelProcStart::
|
||||
db 0BEh
|
||||
dw Cr3OffsetLocation ; mov si, Cr3Location
|
||||
db 66h, 8Bh, 0Ch ; mov ecx,dword ptr [si] ; ECX is keeping the value of CR3
|
||||
|
||||
|
||||
db 0BEh
|
||||
dw GdtrLocation ; mov si, GdtrProfile
|
||||
db 66h ; db 66h
|
||||
db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si]
|
||||
|
||||
db 0BEh
|
||||
dw IdtrLocation ; mov si, IdtrProfile
|
||||
db 66h ; db 66h
|
||||
db 2Eh, 0Fh, 01h, 1Ch ; lidt fword ptr cs:[si]
|
||||
|
||||
db 33h, 0C0h ; xor ax, ax
|
||||
db 8Eh, 0D8h ; mov ds, ax
|
||||
|
||||
|
||||
db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0
|
||||
db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0)
|
||||
db 0Fh, 22h, 0C0h ; mov cr0, eax
|
||||
@@ -81,25 +86,25 @@ ProtectedModeStart::
|
||||
db 0Fh, 22h, 0E0h ; mov cr4, eax
|
||||
|
||||
db 0Fh, 22h, 0D9h ; mov cr3, ecx
|
||||
|
||||
|
||||
db 8Bh, 0F2h ; mov esi, edx ; Save wakeup buffer address
|
||||
|
||||
|
||||
db 0B9h
|
||||
dd 0C0000080h ; mov ecx, 0c0000080h ; EFER MSR number.
|
||||
db 0Fh, 32h ; rdmsr ; Read EFER.
|
||||
db 0Fh, 0BAh, 0E8h, 08h ; bts eax, 8 ; Set LME=1.
|
||||
db 0Fh, 30h ; wrmsr ; Write EFER.
|
||||
|
||||
|
||||
db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Read CR0.
|
||||
db 0Fh, 0BAh, 0E8h, 1Fh ; bts eax, 31 ; Set PG=1.
|
||||
db 0Fh, 22h, 0C0h ; mov cr0, eax ; Write CR0.
|
||||
|
||||
LONG_JUMP::
|
||||
|
||||
|
||||
db 67h, 0EAh ; far jump
|
||||
dd 0h ; 32-bit offset
|
||||
dw 38h ; 16-bit selector
|
||||
|
||||
|
||||
LongModeStart::
|
||||
|
||||
mov ax, 30h
|
||||
@@ -146,13 +151,13 @@ Releaselock::
|
||||
sub rsp, 20h
|
||||
call rax
|
||||
add rsp, 20h
|
||||
|
||||
|
||||
GoToSleep::
|
||||
|
||||
cli
|
||||
hlt
|
||||
jmp $-2
|
||||
|
||||
|
||||
RendezvousFunnelProc ENDP
|
||||
RendezvousFunnelProcEnd::
|
||||
|
||||
@@ -160,7 +165,7 @@ RendezvousFunnelProcEnd::
|
||||
;-------------------------------------------------------------------------------------
|
||||
; AsmGetAddressMap (&AddressMap);
|
||||
;-------------------------------------------------------------------------------------
|
||||
AsmGetAddressMap PROC
|
||||
AsmGetAddressMap PROC
|
||||
|
||||
mov rax, offset RendezvousFunnelProcStart
|
||||
mov qword ptr [rcx], rax
|
||||
@@ -169,9 +174,9 @@ AsmGetAddressMap PROC
|
||||
mov qword ptr [rcx+18h], LongModeStart - RendezvousFunnelProcStart
|
||||
mov qword ptr [rcx+20h], LONG_JUMP - RendezvousFunnelProcStart
|
||||
mov qword ptr [rcx+28h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart
|
||||
|
||||
|
||||
ret
|
||||
|
||||
|
||||
AsmGetAddressMap ENDP
|
||||
|
||||
END
|
||||
|
Reference in New Issue
Block a user