]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
UefiCpuPkg/MpInitLib: split wake up buffer into two parts
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / Ia32 / MpFuncs.nasm
index 52363e6e08df686b76c3296e8c0f7f19449c6d52..bd79be0f5e764452562cabcf144642337c7b2170 100644 (file)
@@ -48,34 +48,35 @@ BITS 16
     mov        si,  BufferStartLocation\r
     mov        ebx, [si]\r
 \r
-    mov        si,  ModeOffsetLocation\r
-    mov        eax, [si]\r
-    mov        si,  CodeSegmentLocation\r
-    mov        edx, [si]\r
-    mov        di,  ax\r
-    sub        di,  02h\r
-    mov        [di], dx\r
-    sub        di,  04h\r
-    add        eax, ebx\r
-    mov        [di],eax\r
-\r
     mov        si,  DataSegmentLocation\r
     mov        edx, [si]\r
 \r
+    ;\r
+    ; Get start address of 32-bit code in low memory (<1MB)\r
+    ;\r
+    mov        edi, ModeTransitionMemoryLocation\r
+\r
     mov        si, GdtrLocation\r
 o32 lgdt       [cs:si]\r
 \r
     mov        si, IdtrLocation\r
 o32 lidt       [cs:si]\r
 \r
-    xor        ax,  ax\r
-    mov        ds,  ax\r
-\r
+    ;\r
+    ; Switch to protected mode\r
+    ;\r
     mov        eax, cr0                        ; Get control register 0\r
     or         eax, 000000003h                 ; Set PE bit (bit #0) & MP\r
     mov        cr0, eax\r
 \r
-    jmp        0:strict dword 0                ; far jump to protected mode\r
+    ; Switch to 32-bit code in executable memory (>1MB)\r
+o32 jmp far    [cs:di]\r
+\r
+;\r
+; Following code may be copied to memory with type of EfiBootServicesCode.\r
+; This is required at DXE phase if NX is enabled for EfiBootServicesCode of\r
+; memory.\r
+;\r
 BITS 32\r
 Flat32Start:                                   ; protected mode entry point\r
     mov        ds, dx\r
@@ -86,6 +87,12 @@ Flat32Start:                                   ; protected mode entry point
 \r
     mov        esi, ebx\r
 \r
+    ; Increment the number of APs executing here as early as possible\r
+    ; This is decremented in C code when AP is finished executing\r
+    mov        edi, esi\r
+    add        edi, NumApsExecutingLocation\r
+    lock inc   dword [edi]\r
+\r
     mov         edi, esi\r
     add         edi, EnableExecuteDisableLocation\r
     cmp         byte [edi], 0\r
@@ -130,7 +137,7 @@ TestLock:
     jz         TestLock\r
 \r
     mov        ecx, esi\r
-    add        ecx, NumApsExecutingLocation\r
+    add        ecx, ApIndexLocation\r
     inc        dword [ecx]\r
     mov        ebx, [ecx]\r
 \r
@@ -200,7 +207,7 @@ CProcedureInvoke:
     mov        eax, ASM_PFX(InitializeFloatingPointUnits)\r
     call       eax               ; Call assembly function to initialize FPU per UEFI spec\r
 \r
-    push       ebx               ; Push NumApsExecuting\r
+    push       ebx               ; Push ApIndex\r
     mov        eax, esi\r
     add        eax, LockLocation\r
     push       eax               ; push address of exchange info data buffer\r
@@ -260,6 +267,7 @@ ASM_PFX(AsmGetAddressMap):
     mov        dword [ebx +  8h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart\r
     mov        dword [ebx + 0Ch], AsmRelocateApLoopStart\r
     mov        dword [ebx + 10h], AsmRelocateApLoopEnd - AsmRelocateApLoopStart\r
+    mov        dword [ebx + 14h], Flat32Start - RendezvousFunnelProcStart\r
 \r
     popad\r
     ret\r