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/CpuMpPei.h        | 23 +++++++++++++++++++++++
 UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm  | 16 ++++++++++++++++
 UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm | 16 ++++++++++++++++
 UefiCpuPkg/CpuMpPei/X64/MpFuncs.asm   | 11 +++++++++++
 UefiCpuPkg/CpuMpPei/X64/MpFuncs.nasm  | 11 +++++++++++
 5 files changed, 77 insertions(+)

diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
index 146422c..7c96084 100644
--- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h
+++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h
@@ -23,6 +23,16 @@
 #include <Library/PeimEntryPoint.h>
 #include <Library/UefiCpuLib.h>
 
+//
+// AP reset code information
+//
+typedef struct {
+  UINT8             *RendezvousFunnelAddress;
+  UINTN             PModeEntryOffset;
+  UINTN             LModeEntryOffset;
+  UINTN             RendezvousFunnelSize;
+} MP_ASSEMBLY_ADDRESS_MAP;
+
 #pragma pack(1)
 
 typedef union {
@@ -62,6 +72,19 @@ typedef struct {
 } MP_CPU_EXCHANGE_INFO;
 
 #pragma pack()
+
+/**
+  Assembly code to get starting address and size of the rendezvous entry for 
APs.
+  Information for fixing a jump instruction in the code is also returned.
+
+  @param AddressMap  Output buffer for address map information.
+**/
+VOID
+EFIAPI
+AsmGetAddressMap (
+  OUT MP_ASSEMBLY_ADDRESS_MAP    *AddressMap
+  );
+
 /**
   Assembly code to load GDT table and update segment accordingly.
 
diff --git a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm 
b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm
index 4dc7191..9861472 100644
--- a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm
+++ b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.asm
@@ -144,6 +144,22 @@ CProcedureInvoke:
 RendezvousFunnelProc   ENDP
 RendezvousFunnelProcEnd::
 
+;-------------------------------------------------------------------------------------
+;  AsmGetAddressMap (&AddressMap);
+;-------------------------------------------------------------------------------------
+AsmGetAddressMap   PROC  near C  PUBLIC
+    pushad
+    mov        ebp,esp
+
+    mov        ebx, dword ptr [ebp+24h]
+    mov        dword ptr [ebx], RendezvousFunnelProcStart
+    mov        dword ptr [ebx +  4h], Flat32Start - RendezvousFunnelProcStart
+    mov        dword ptr [ebx +  8h], 0
+    mov        dword ptr [ebx + 0ch], RendezvousFunnelProcEnd - 
RendezvousFunnelProcStart
+
+    popad
+    ret
+AsmGetAddressMap   ENDP
 
 AsmInitializeGdt   PROC  near C  PUBLIC
   push         ebp
diff --git a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm 
b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm
index 4a1aa71..a3c4ae9 100644
--- a/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm
+++ b/UefiCpuPkg/CpuMpPei/Ia32/MpFuncs.nasm
@@ -132,6 +132,22 @@ CProcedureInvoke:
     jmp        $                 ; never reach here
 RendezvousFunnelProcEnd:
 
+;-------------------------------------------------------------------------------------
+;  AsmGetAddressMap (&AddressMap);
+;-------------------------------------------------------------------------------------
+global ASM_PFX(AsmGetAddressMap)
+ASM_PFX(AsmGetAddressMap):
+    pushad
+    mov        ebp,esp
+
+    mov        ebx,  [ebp + 24h]
+    mov        dword [ebx], RendezvousFunnelProcStart
+    mov        dword [ebx +  4h], Flat32Start - RendezvousFunnelProcStart
+    mov        dword [ebx +  8h], 0
+    mov        dword [ebx + 0ch], RendezvousFunnelProcEnd - 
RendezvousFunnelProcStart
+
+    popad
+    ret
 
 global ASM_PFX(AsmInitializeGdt)
 ASM_PFX(AsmInitializeGdt):
diff --git a/UefiCpuPkg/CpuMpPei/X64/MpFuncs.asm 
b/UefiCpuPkg/CpuMpPei/X64/MpFuncs.asm
index 425bc20..9e85fac 100644
--- a/UefiCpuPkg/CpuMpPei/X64/MpFuncs.asm
+++ b/UefiCpuPkg/CpuMpPei/X64/MpFuncs.asm
@@ -181,6 +181,17 @@ CProcedureInvoke:
 RendezvousFunnelProc   ENDP
 RendezvousFunnelProcEnd::
 
+;-------------------------------------------------------------------------------------
+;  AsmGetAddressMap (&AddressMap);
+;-------------------------------------------------------------------------------------
+AsmGetAddressMap   PROC
+    mov        rax, offset RendezvousFunnelProcStart
+    mov        qword ptr [rcx], rax
+    mov        qword ptr [rcx +  8h], Flat32Start - RendezvousFunnelProcStart
+    mov        qword ptr [rcx + 10h], LongModeStart - RendezvousFunnelProcStart
+    mov        qword ptr [rcx + 18h], RendezvousFunnelProcEnd - 
RendezvousFunnelProcStart
+    ret
+AsmGetAddressMap   ENDP
 
 AsmInitializeGdt   PROC
     push       rbp
diff --git a/UefiCpuPkg/CpuMpPei/X64/MpFuncs.nasm 
b/UefiCpuPkg/CpuMpPei/X64/MpFuncs.nasm
index 3ddf26c..09c2fbc 100644
--- a/UefiCpuPkg/CpuMpPei/X64/MpFuncs.nasm
+++ b/UefiCpuPkg/CpuMpPei/X64/MpFuncs.nasm
@@ -175,6 +175,17 @@ CProcedureInvoke:
 
 RendezvousFunnelProcEnd:
 
+;-------------------------------------------------------------------------------------
+;  AsmGetAddressMap (&AddressMap);
+;-------------------------------------------------------------------------------------
+global ASM_PFX(AsmGetAddressMap)
+ASM_PFX(AsmGetAddressMap):
+    mov        rax, ASM_PFX(RendezvousFunnelProc)
+    mov        qword [rcx], rax
+    mov        qword [rcx +  8h], Flat32Start - RendezvousFunnelProcStart
+    mov        qword [rcx + 10h], LongModeStart - RendezvousFunnelProcStart
+    mov        qword [rcx + 18h], RendezvousFunnelProcEnd - 
RendezvousFunnelProcStart
+    ret
 
 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