From 8018cb158ccd3b466692533532edcd534d4704ff Mon Sep 17 00:00:00 2001 From: Jeff Fan Date: Wed, 15 Jul 2015 03:37:25 +0000 Subject: [PATCH] UefiCpuPkg/CpuMpPei: Get AP reset code size and far jump information Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan Reviewed-by: Feng Tian Reviewed-by: Jiewen Yao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17994 6f19259b-4bc3-4df7-8a09-765794883524 --- 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 146422c2b5..7c96084ca2 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h @@ -23,6 +23,16 @@ #include #include +// +// 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 4dc7191b80..9861472509 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 4a1aa71b8d..a3c4ae9e58 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 425bc202fd..9e85fac435 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 3ddf26c29d..09c2fbc15e 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): -- 2.39.2