]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/X64/MpFuncs.asm
1.Restore BSP IDT table to AP when AP wakeup.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / MpServicesOnFrameworkMpServicesThunk / X64 / MpFuncs.asm
index ad74c2dace4c0fbec677a802fca17560904f67e6..91bdb224512410df8a18889798442d4add0460a6 100644 (file)
@@ -1,7 +1,7 @@
 ;------------------------------------------------------------------------------\r
 ; X64 assembly file for AP startup vector.\r
 ;\r
-; Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>\r
+; Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
 ; This program and the accompanying materials\r
 ; are licensed and made available under the terms and conditions of the BSD License\r
 ; which accompanies this distribution.  The full text of the license may be found at\r
@@ -14,7 +14,7 @@
 \r
 .code\r
 \r
-include  AsmInclude.inc \r
+include  AsmInclude.inc\r
 ;-------------------------------------------------------------------------------------\r
 \r
 ;-------------------------------------------------------------------------------------\r
@@ -34,7 +34,7 @@ RendezvousFunnelProcStart::
         db 8ch,  0c8h                 ; mov        ax,  cs\r
         db 8eh,  0d8h                 ; mov        ds,  ax\r
         db 8eh,  0c0h                 ; mov        es,  ax\r
-        db 8eh,  0d0h                 ; mov        ss,  ax \r
+        db 8eh,  0d0h                 ; mov        ss,  ax\r
         db 33h,  0c0h                 ; xor        ax,  ax\r
         db 8eh,  0e0h                 ; mov        fs,  ax\r
         db 8eh,  0e8h                 ; mov        gs,  ax\r
@@ -48,15 +48,20 @@ RendezvousFunnelProcStart::
         db 0BEh\r
         dw Cr3OffsetLocation          ; mov        si, Cr3Location\r
         db 66h,  8Bh, 0Ch             ; mov        ecx,dword ptr [si]          ; ECX is keeping the value of CR3\r
-        \r
+\r
         db 0BEh\r
         dw GdtrLocation               ; mov        si, GdtrProfile\r
         db 66h                        ; db         66h\r
         db 2Eh,  0Fh, 01h, 14h        ; lgdt       fword ptr cs:[si]\r
 \r
+        db 0BEh\r
+        dw IdtrLocation               ; mov        si, IdtrProfile\r
+        db 66h                        ; db         66h\r
+        db 2Eh,  0Fh, 01h, 1Ch        ; lidt       fword ptr cs:[si]\r
+\r
         db 33h,  0C0h                 ; xor        ax,  ax\r
         db 8Eh,  0D8h                 ; mov        ds,  ax\r
-        \r
+\r
         db 0Fh,  20h, 0C0h            ; mov        eax, cr0                    ; Get control register 0\r
         db 66h,  83h, 0C8h, 01h       ; or         eax, 000000001h             ; Set PE bit (bit #0)\r
         db 0Fh,  22h, 0C0h            ; mov        cr0, eax\r
@@ -81,25 +86,25 @@ ProtectedModeStart::
         db 0Fh,  22h,  0E0h           ; mov        cr4, eax\r
 \r
         db 0Fh,  22h,  0D9h           ; mov        cr3, ecx\r
-        \r
+\r
         db 8Bh,  0F2h                 ; mov        esi, edx                    ; Save wakeup buffer address\r
-        \r
+\r
         db 0B9h\r
         dd 0C0000080h                 ; mov        ecx, 0c0000080h             ; EFER MSR number.\r
         db 0Fh,  32h                  ; rdmsr                                  ; Read EFER.\r
         db 0Fh,  0BAh, 0E8h, 08h      ; bts        eax, 8                      ; Set LME=1.\r
         db 0Fh,  30h                  ; wrmsr                                  ; Write EFER.\r
-        \r
+\r
         db 0Fh,  20h,  0C0h           ; mov        eax, cr0                    ; Read CR0.\r
         db 0Fh,  0BAh, 0E8h, 1Fh      ; bts        eax, 31                     ; Set PG=1.\r
         db 0Fh,  22h,  0C0h           ; mov        cr0, eax                    ; Write CR0.\r
 \r
 LONG_JUMP::\r
-        \r
+\r
         db 67h,  0EAh                 ; far jump\r
         dd 0h                         ; 32-bit offset\r
         dw 38h                        ; 16-bit selector\r
-        \r
+\r
 LongModeStart::\r
 \r
         mov         ax,  30h\r
@@ -146,13 +151,13 @@ Releaselock::
         sub         rsp, 20h\r
         call        rax\r
         add         rsp, 20h\r
-        \r
+\r
 GoToSleep::\r
 \r
         cli\r
         hlt\r
         jmp         $-2\r
-        \r
+\r
 RendezvousFunnelProc   ENDP\r
 RendezvousFunnelProcEnd::\r
 \r
@@ -160,7 +165,7 @@ RendezvousFunnelProcEnd::
 ;-------------------------------------------------------------------------------------\r
 ;  AsmGetAddressMap (&AddressMap);\r
 ;-------------------------------------------------------------------------------------\r
-AsmGetAddressMap   PROC  \r
+AsmGetAddressMap   PROC\r
 \r
         mov         rax, offset RendezvousFunnelProcStart\r
         mov         qword ptr [rcx], rax\r
@@ -169,9 +174,9 @@ AsmGetAddressMap   PROC
         mov         qword ptr [rcx+18h], LongModeStart - RendezvousFunnelProcStart\r
         mov         qword ptr [rcx+20h], LONG_JUMP - RendezvousFunnelProcStart\r
         mov         qword ptr [rcx+28h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart\r
-        \r
+\r
         ret\r
-        \r
+\r
 AsmGetAddressMap   ENDP\r
 \r
 END\r