Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff....@intel.com>
CC: Feng Tian <feng.t...@intel.com>
CC: Jiewen Yao <jiewen....@intel.com>
CC: Michael Kinney <michael.d.kin...@intel.com>
---
 UefiCpuPkg/CpuMpPei/Ia32/MpEqu.inc    |  12 ++++
 UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm  | 117 ++++++++++++++++++++++++++++++++++
 UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm | 107 +++++++++++++++++++++++++++++++
 3 files changed, 236 insertions(+)

diff --git a/UefiCpuPkg/CpuMpPei/Ia32/MpEqu.inc 
b/UefiCpuPkg/CpuMpPei/Ia32/MpEqu.inc
index 2d30db4..1f02dad 100644
--- a/UefiCpuPkg/CpuMpPei/Ia32/MpEqu.inc
+++ b/UefiCpuPkg/CpuMpPei/Ia32/MpEqu.inc
@@ -21,4 +21,16 @@
 PROTECT_MODE_CS               equ        10h
 PROTECT_MODE_DS               equ        18h
 
+VacantFlag                    equ        00h
+NotVacantFlag                 equ        0ffh
+
+LockLocation                  equ        (RendezvousFunnelProcEnd - 
RendezvousFunnelProcStart)
+StackStartAddressLocation     equ        LockLocation + 04h
+StackSizeLocation             equ        LockLocation + 08h
+ApProcedureLocation           equ        LockLocation + 0Ch
+GdtrLocation                  equ        LockLocation + 10h
+IdtrLocation                  equ        LockLocation + 16h
+BufferStartLocation           equ        LockLocation + 1Ch
+PmodeOffsetLocation           equ        LockLocation + 20h
+NumApsExecutingLoction        equ        LockLocation + 24h
 
diff --git a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm 
b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm
index ca9c15a..c8bdc52 100644
--- a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm
+++ b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm
@@ -22,8 +22,125 @@
 .model  flat
 
 include  MpEqu.inc
+
 .code
 
+;-------------------------------------------------------------------------------------
+;RendezvousFunnelProc  procedure follows. All APs execute their procedure. This
+;procedure serializes all the AP processors through an Init sequence. It must 
be
+;noted that APs arrive here very raw...ie: real mode, no stack.
+;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
+;IS IN MACHINE CODE.
+;-------------------------------------------------------------------------------------
+RendezvousFunnelProc   PROC  PUBLIC
+RendezvousFunnelProcStart::
+; At this point CS = 0x(vv00) and ip= 0x0.
+; Save BIST information to ebp firstly
+    db 66h,  08bh, 0e8h                 ; mov        ebp, eax    ; save BIST 
information
+
+    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 33h,0c0h                         ; xor        ax,ax
+    db 8eh,0e0h                         ; mov        fs,ax
+    db 8eh,0e8h                         ; mov        gs,ax
+
+    db 0BEh                             ; opcode of mov si, mem16
+    dw BufferStartLocation              ; mov        si, BufferStartLocation
+    db 66h,  8Bh, 1Ch                   ; mov        ebx,dword ptr [si]
+
+    db 0BFh                             ; opcode of mov di, mem16
+    dw PmodeOffsetLocation              ; mov        di, PmodeOffsetLocation
+    db 66h,  8Bh, 05h                   ; mov        eax,dword ptr [di]
+    db 8Bh,  0F8h                       ; mov        di, ax
+    db 83h,  0EFh,06h                   ; sub        di, 06h
+    db 66h,  03h, 0C3h                  ; add        eax, ebx
+    db 66h,  89h, 05h                   ; mov        dword ptr [di],eax
+
+    db 0BEh                             ; opcode of mov si, mem16
+    dw GdtrLocation                     ; mov        si, GdtrLocation
+    db 66h                              ; db         66h
+    db 2Eh,  0Fh, 01h, 14h              ; lgdt       fword ptr cs:[si]
+
+    db 0BEh
+    dw IdtrLocation                     ; mov        si, IdtrLocation
+    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, 03h             ; or         eax, 000000003h     ;Set 
PE bit (bit #0) & MP
+    db 0Fh,  22h, 0C0h                  ; mov        cr0, eax
+
+    db 66h,  67h, 0EAh                  ; far jump
+    dd 0h                               ; 32-bit offset
+    dw PROTECT_MODE_CS                  ; 16-bit selector
+
+Flat32Start::                           ; protected mode entry point
+    mov        ax, PROTECT_MODE_DS
+    mov        ds, ax
+    mov        es, ax
+    mov        fs, ax
+    mov        gs, ax
+    mov        ss, ax
+
+    mov        esi, ebx
+    mov        edi, esi
+    add        edi, LockLocation
+    mov        eax, NotVacantFlag
+
+TestLock:
+    xchg       dword ptr [edi], eax
+    cmp        eax, NotVacantFlag
+    jz         TestLock
+
+    mov        edi, esi
+    add        edi, NumApsExecutingLoction
+    inc        dword ptr [edi]
+    mov        ebx, dword ptr [edi]
+
+ProgramStack:
+    mov        edi, esi
+    add        edi, StackSizeLocation
+    mov        eax, dword ptr [edi]
+    mov        edi, esi
+    add        edi, StackStartAddressLocation
+    add        eax, dword ptr [edi]
+    mov        esp, eax
+    mov        dword ptr [edi], eax
+
+Releaselock:
+    mov        eax, VacantFlag
+    mov        edi, esi
+    add        edi, LockLocation
+    xchg       dword ptr [edi], eax
+
+CProcedureInvoke:
+    push       ebp               ; push BIST data at top of AP stack
+    xor        ebp, ebp          ; clear ebp for call stack trace
+    push       ebp
+    mov        ebp, esp
+
+
+    push       ebx               ; Push NumApsExecuting
+    mov        eax, esi
+    add        eax, LockLocation
+    push       eax               ; push address of exchange info data buffer
+
+    mov        edi, esi
+    add        edi, ApProcedureLocation
+    mov        eax, dword ptr [edi]
+
+    call       eax               ; invoke C function
+
+    jmp        $                  ; never reach here
+
+RendezvousFunnelProc   ENDP
+RendezvousFunnelProcEnd::
+
 
 AsmInitializeGdt   PROC  near C  PUBLIC
   push         ebp
diff --git a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm 
b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm
index 180b637..379f13e 100644
--- a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm
+++ b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm
@@ -22,6 +22,113 @@
 
 SECTION .text
 
+;-------------------------------------------------------------------------------------
+;RendezvousFunnelProc  procedure follows. All APs execute their procedure. This
+;procedure serializes all the AP processors through an Init sequence. It must 
be
+;noted that APs arrive here very raw...ie: real mode, no stack.
+;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC
+;IS IN MACHINE CODE.
+;-------------------------------------------------------------------------------------
+global ASM_PFX(RendezvousFunnelProc)
+ASM_PFX(RendezvousFunnelProc):
+RendezvousFunnelProcStart:
+; At this point CS = 0x(vv00) and ip= 0x0.
+BITS 16
+    mov        ebp, eax                        ; save BIST information
+
+    mov        ax, cs
+    mov        ds, ax
+    mov        es, ax
+    mov        ss, ax
+    xor        ax, ax
+    mov        fs, ax
+    mov        gs, ax
+
+    mov        si,  BufferStartLocation
+    mov        ebx, [si]
+
+    mov        di,  PmodeOffsetLocation
+    mov        eax, [di]
+    mov        di,  ax
+    sub        di,  06h
+    add        eax, ebx
+    mov        [di],eax
+
+    mov        si, GdtrLocation
+o32 lgdt       [cs:si]
+
+    mov        si, IdtrLocation
+o32 lidt       [cs:si]
+
+    xor        ax,  ax
+    mov        ds,  ax
+
+    mov        eax, cr0                        ;Get control register 0
+    or         eax, 000000003h                 ;Set PE bit (bit #0) & MP
+    mov        cr0, eax
+
+    jmp        PROTECT_MODE_CS:strict dword 0  ; far jump to protected mode
+BITS 32
+Flat32Start:                                   ; protected mode entry point
+    mov        ax, PROTECT_MODE_DS
+    mov        ds, ax
+    mov        es, ax
+    mov        fs, ax
+    mov        gs, ax
+    mov        ss, ax
+
+    mov        esi, ebx
+    mov        edi, esi
+    add        edi, LockLocation
+    mov        eax, NotVacantFlag
+
+TestLock:
+    xchg       [edi], eax
+    cmp        eax, NotVacantFlag
+    jz         TestLock
+
+    mov        edi, esi
+    add        edi, NumApsExecutingLoction
+    inc        dword [edi]
+    mov        ebx, [edi]
+
+ProgramStack:
+    mov        edi, esi
+    add        edi, StackSizeLocation
+    mov        eax, [edi]
+    mov        edi, esi
+    add        edi, StackStartAddressLocation
+    add        eax, [edi]
+    mov        esp, eax
+    mov        [edi], eax
+
+Releaselock:
+    mov        eax, VacantFlag
+    mov        edi, esi
+    add        edi, LockLocation
+    xchg       [edi], eax
+
+CProcedureInvoke:
+    push       ebp               ; push BIST data at top of AP stack
+    xor        ebp, ebp          ; clear ebp for call stack trace
+    push       ebp
+    mov        ebp, esp
+
+
+    push       ebx               ; Push NumApsExecuting
+    mov        eax, esi
+    add        eax, LockLocation
+    push       eax               ; push address of exchange info data buffer
+
+    mov        edi, esi
+    add        edi, ApProcedureLocation
+    mov        eax, [edi]
+
+    call       eax               ; invoke C function
+
+    jmp        $                 ; never reach here
+RendezvousFunnelProcEnd:
+
 
 global ASM_PFX(AsmInitializeGdt)
 ASM_PFX(AsmInitializeGdt):
-- 
1.9.5.msysgit.0


------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to