UefiCpuPkg/MpInitLib: Add MP_ASSEMBLY_ADDRESS_MAP

In MpInitLibInitialize(), invoke AsmGetAddress() to get get assembly functions'
entry addresses and the sizes from returned MP_ASSEMBLY_ADDRESS_MAP structure.

v5:
  1. Add more detailed comments for structure MP_ASSEMBLY_ADDRESS_MAP.

v4:
  1. Add AsmRelocateApLoop information return in AsmGetAddress().

v3:
  1. Rename AsmRellocateApLoop to AsmRelocateApLoop.

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
index 49f5503..8f6f0bf 100644
--- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
@@ -204,6 +204,8 @@
     mov        dword [ebx], RendezvousFunnelProcStart

     mov        dword [ebx +  4h], Flat32Start - RendezvousFunnelProcStart

     mov        dword [ebx +  8h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart

+    mov        dword [ebx + 0Ch], AsmRelocateApLoopStart

+    mov        dword [ebx + 10h], AsmRelocateApLoopEnd - AsmRelocateApLoopStart

 

     popad

     ret

diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 12bd04e..3ac79b6 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -34,7 +34,12 @@
   VOID

   )

 {

-  return EFI_UNSUPPORTED;

+  MP_ASSEMBLY_ADDRESS_MAP  AddressMap;

+  UINTN                    ApResetVectorSize;

+

+  AsmGetAddressMap (&AddressMap);

+  ApResetVectorSize = AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO);

+  return EFI_SUCCESS;

 }

 

 /**

diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index 39ec5de..2be1351 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -35,6 +35,18 @@
 #include <Library/MtrrLib.h>

 #include <Library/HobLib.h>

 

+//

+// AP reset code information including code address and size,

+// this structure will be shared be C code and assembly code.

+// It is natural aligned by design.

+//

+typedef struct {

+  UINT8             *RendezvousFunnelAddress;

+  UINTN             ModeEntryOffset;

+  UINTN             RendezvousFunnelSize;

+  UINT8             *RelocateApLoopFuncAddress;

+  UINTN             RelocateApLoopFuncSize;

+} MP_ASSEMBLY_ADDRESS_MAP;

 

 #pragma pack(1)

 

@@ -81,5 +93,18 @@
   IN UINTN                   ApTargetCState,

   IN UINTN                   PmCodeSegment

   );

+

+/**

+  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[out] AddressMap  Output buffer for address map information.

+**/

+VOID

+EFIAPI

+AsmGetAddressMap (

+  OUT MP_ASSEMBLY_ADDRESS_MAP    *AddressMap

+  );

+

 #endif

 

diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
index d5d7efe..090e9fa 100644
--- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
@@ -239,6 +239,9 @@
     mov        qword [rcx], rax

     mov        qword [rcx +  8h], LongModeStart - RendezvousFunnelProcStart

     mov        qword [rcx + 10h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart

+    mov        rax, ASM_PFX(AsmRelocateApLoop)

+    mov        qword [rcx + 18h], rax

+    mov        qword [rcx + 20h], AsmRelocateApLoopEnd - AsmRelocateApLoopStart

     ret

 

 ;-------------------------------------------------------------------------------------