Some compilers may optimize register usage in ways that are incompatible with the TemporaryRamSupport PPI. Using assembly code to call the TemporaryRamMigration function prevents this issue.
Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> Cc: Jian J Wang <jian.j.w...@intel.com> Cc: Hao Wu <hao.a...@intel.com> Cc: Ray Ni <ray...@intel.com> Cc: Star Zeng <star.z...@intel.com> --- .../Dispatcher/X64/TemporaryRamMigration.nasm | 74 +++++++++++++++++++ MdeModulePkg/Core/Pei/PeiMain.inf | 3 + 2 files changed, 77 insertions(+) create mode 100644 MdeModulePkg/Core/Pei/Dispatcher/X64/TemporaryRamMigration.nasm diff --git a/MdeModulePkg/Core/Pei/Dispatcher/X64/TemporaryRamMigration.nasm b/MdeModulePkg/Core/Pei/Dispatcher/X64/TemporaryRamMigration.nasm new file mode 100644 index 0000000000..5de8acdf34 --- /dev/null +++ b/MdeModulePkg/Core/Pei/Dispatcher/X64/TemporaryRamMigration.nasm @@ -0,0 +1,74 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2018, Intel Corporation. All rights reserved.<BR> +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +;------------------------------------------------------------------------------ + +#include <Base.h> + + SECTION .text + +extern ASM_PFX(PeiTemporaryRamMigrated) + +;------------------------------------------------------------------------------ +; VOID +; EFIAPI +; PeiTemporaryRamMigration ( +; IN PEI_CORE_TEMPORARY_RAM_TRANSITION *TempRamTransitionData +; ); +; +; @param[in] RCX Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION +; +; @return None This routine does not return +;------------------------------------------------------------------------------ +global ASM_PFX(PeiTemporaryRamMigration) +ASM_PFX(PeiTemporaryRamMigration): + + ; + ; We never return from this call + ; + add rsp, 8 + + ; + ; (rax) Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION + ; + mov rax, rcx + + ; + ; We store the TempRamTransitionData pointer in rbx. By the X64 + ; calling convention we should normally save rbx, but we won't be + ; returning to the caller, so we don't need to save it. By the + ; same rule, the TemporaryRamMigration PPI call should preserve + ; rbx for us. + ; + mov rbx, rcx + + ; + ; Setup parameters and call TemporaryRamSupport->TemporaryRamMigration + ; (rcx) PeiServices + ; (rdx) TemporaryMemoryBase + ; (r8) PermanentMemoryBase + ; (r9) CopySize + ; + mov rcx, [rax + 0x08] + mov rdx, [rax + 0x10] + mov r8, [rax + 0x18] + mov r9, [rax + 0x20] + + ; + ; (rbx) Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION on stack + ; + ; Adjusted based on stack change made during + ; TemporaryRamSupport->TemporaryRamMigration call + ; + sub rbx, rsp + call [rax + 0x00] + add rbx, rsp + + ; + ; Setup parameters and call PeiTemporaryRamMigrated + ; (rcx) Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION + ; + mov rcx, rbx + call ASM_PFX(PeiTemporaryRamMigrated) diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf b/MdeModulePkg/Core/Pei/PeiMain.inf index 918c4a0df8..fb643a9dd5 100644 --- a/MdeModulePkg/Core/Pei/PeiMain.inf +++ b/MdeModulePkg/Core/Pei/PeiMain.inf @@ -59,6 +59,9 @@ [Sources.Ia32] Dispatcher/Ia32/TemporaryRamMigration.nasm +[Sources.X64] + Dispatcher/X64/TemporaryRamMigration.nasm + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec -- 2.20.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#38791): https://edk2.groups.io/g/devel/message/38791 Mute This Topic: https://groups.io/mt/31016933/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-