Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <[email protected]>
CC: Feng Tian <[email protected]>
CC: Jiewen Yao <[email protected]>
CC: Michael Kinney <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel