Contributed-under: TianoCore Contribution Agreement 1.1
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/Ia32/TemporaryRamMigration.S   | 72 +++++++++++++++++
 .../Ia32/TemporaryRamMigration.nasm           | 78 +++++++++++++++++++
 MdeModulePkg/Core/Pei/PeiMain.inf             |  3 +-
 3 files changed, 152 insertions(+), 1 deletion(-)
 create mode 100644 
MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.S
 create mode 100644 
MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.nasm

diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.S 
b/MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.S
new file mode 100644
index 0000000000..363cadca2a
--- /dev/null
+++ b/MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.S
@@ -0,0 +1,72 @@
+#------------------------------------------------------------------------------
+#
+#  Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
+#
+#  This program and the accompanying materials are licensed and made
+#  available under the terms and conditions of the BSD License which
+#  accompanies this distribution. The full text of the license may be
+#  found at http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
+#  BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
+#  EXPRESS OR IMPLIED.
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# PeiTemporaryRamMigration (
+#   IN  PEI_CORE_TEMPORARY_RAM_TRANSITION  *TempRamTransitionData
+#   );
+#
+# @param[in]  Stack Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION
+#
+# @return     None  This routine does not return
+#------------------------------------------------------------------------------
+ASM_GLOBAL ASM_PFX(PeiTemporaryRamMigration)
+ASM_PFX(PeiTemporaryRamMigration):
+
+    #
+    # We never return from this call
+    #
+    add     $4, %esp
+
+    #
+    #   (eax) Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION
+    #
+    mov     (%esp), %eax
+
+    #
+    # We'll store the new location of TempRamTransitionData after
+    # migration in ebx. By the IA32 calling convention we should
+    # normally save ebx, 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 ebx for us.
+    #
+    mov     (%esp), %ebx
+    add     0x10(%eax), %ebx
+    sub     0x08(%eax), %ebx
+
+    #
+    # Setup parameters and call TemporaryRamSupport->TemporaryRamMigration
+    #   32-bit PeiServices
+    #   64-bit TemporaryMemoryBase
+    #   64-bit PermanentMemoryBase
+    #   32-bit CopySize
+    #
+    pushl   0x18(%eax) # CopySize
+    pushl   0x14(%eax) # PermanentMemoryBase Upper 32-bit
+    pushl   0x10(%eax) # PermanentMemoryBase Lower 32-bit
+    pushl   0x0c(%eax) # TemporaryMemoryBase Upper 32-bit
+    pushl   0x08(%eax) # TemporaryMemoryBase Lower 32-bit
+    pushl   0x04(%eax) # PeiServices
+    calll   *(%eax)
+    sub     0x18, %esp
+
+    #
+    # Setup parameters and call PeiTemporaryRamMigrated
+    #   32-bit Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION
+    #
+    push    %ebx
+    call    ASM_PFX(PeiTemporaryRamMigrated)
diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.nasm 
b/MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.nasm
new file mode 100644
index 0000000000..e200a3631f
--- /dev/null
+++ b/MdeModulePkg/Core/Pei/Dispatcher/Ia32/TemporaryRamMigration.nasm
@@ -0,0 +1,78 @@
+;------------------------------------------------------------------------------
+;
+;  Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
+;
+;  This program and the accompanying materials are licensed and made
+;  available under the terms and conditions of the BSD License which
+;  accompanies this distribution. The full text of the license may be
+;  found at http://opensource.org/licenses/bsd-license.php
+;
+;  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
+;  BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
+;  EXPRESS OR IMPLIED.
+;
+;------------------------------------------------------------------------------
+
+#include <Base.h>
+
+    SECTION .text
+
+extern ASM_PFX(PeiTemporaryRamMigrated)
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; PeiTemporaryRamMigration (
+;   IN  PEI_CORE_TEMPORARY_RAM_TRANSITION  *TempRamTransitionData
+;   );
+;
+; @param[in]  Stack 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     esp, 4
+
+    ;
+    ;   (eax) Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION
+    ;
+    mov     eax, [esp]
+
+    ;
+    ; We'll store the new location of TempRamTransitionData after
+    ; migration in ebx. By the IA32 calling convention we should
+    ; normally save ebx, 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 ebx for us.
+    ;
+    mov     ebx, [esp]
+    add     ebx, [eax + 0x10]
+    sub     ebx, [eax + 0x08]
+
+    ;
+    ; Setup parameters and call TemporaryRamSupport->TemporaryRamMigration
+    ;   32-bit PeiServices
+    ;   64-bit TemporaryMemoryBase
+    ;   64-bit PermanentMemoryBase
+    ;   32-bit CopySize
+    ;
+    push    DWORD [eax + 0x18] ; CopySize
+    push    DWORD [eax + 0x14] ; PermanentMemoryBase Upper 32-bit
+    push    DWORD [eax + 0x10] ; PermanentMemoryBase Lower 32-bit
+    push    DWORD [eax + 0x0c] ; TemporaryMemoryBase Upper 32-bit
+    push    DWORD [eax + 0x08] ; TemporaryMemoryBase Lower 32-bit
+    push    DWORD [eax + 0x04] ; PeiServices
+    call    DWORD [eax + 0x00]
+    sub     esp, 0x18
+
+    ;
+    ; Setup parameters and call PeiTemporaryRamMigrated
+    ;   32-bit Pointer to PEI_CORE_TEMPORARY_RAM_TRANSITION
+    ;
+    push    ebx
+    call    ASM_PFX(PeiTemporaryRamMigrated)
diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf 
b/MdeModulePkg/Core/Pei/PeiMain.inf
index 1646f73385..505544d4e8 100644
--- a/MdeModulePkg/Core/Pei/PeiMain.inf
+++ b/MdeModulePkg/Core/Pei/PeiMain.inf
@@ -53,7 +53,8 @@
   PeiMain.h
 
 [Sources.Ia32]
-  Dispatcher/TemporaryRamMigration.c
+  Dispatcher/Ia32/TemporaryRamMigration.nasm
+  Dispatcher/Ia32/TemporaryRamMigration.S
 
 [Sources.X64]
   Dispatcher/X64/TemporaryRamMigration.nasm
-- 
2.20.0.rc1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to