From: Jordan Justen <jordan.l.justen@intel.com>
To: Ray Ni <ray.ni@intel.com>, edk2-devel@lists.01.org
Subject: Re: [PATCH] EmulatorPkg/Sec: Don't install TemporaryRamSupport PPI
Date: Sat, 02 Mar 2019 13:45:17 -0800 [thread overview]
Message-ID: <155156311737.17885.4362726503400495940@jljusten-skl> (raw)
In-Reply-To: <20190302121111.70992-1-ray.ni@intel.com>
On 2019-03-02 04:11:11, Ray Ni wrote:
> TemporaryRamSupport PPI is called by PeiCore to migrate temporary
> memory from permanent memory. But the implementation assumes
> ebp/rbp contains the original esp/rsp value when migrating which
> is not always true the compiler optimization is turned on.
> A real boot failure is seen using GCC5.
> In fact, below commit in year 2013 enhanced PeiCore to migrate
> the memory without calling TemporaryRamSupport PPI.
> SHA-1: 0f9ebb321638e9142ab3bdcc19000c49bb83b9ba
> * Add support for PI1.2.1 TempRam Done PPI.
>
> So this patch removes TemporaryRamSupport PPI implementation from
> EmulatorPkg/Sec module to fix the boot failure when using GCC5.
I don't think we should just hide the known bug with the
TemporaryRamSupport PPI implementation in the PEI Core.
I would agree that we should make this change after addressing that.
-Jordan
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ray Ni <ray.ni@intel.com>
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> Cc: Andrew Fish <afish@apple.com>
> ---
> EmulatorPkg/Sec/Ia32/SwitchRam.S | 95 ------------------------------
> EmulatorPkg/Sec/Ia32/SwitchRam.asm | 94 -----------------------------
> EmulatorPkg/Sec/Ia32/TempRam.c | 65 --------------------
> EmulatorPkg/Sec/Sec.c | 61 +------------------
> EmulatorPkg/Sec/Sec.h | 14 +----
> EmulatorPkg/Sec/Sec.inf | 15 +----
> EmulatorPkg/Sec/X64/SwitchRam.S | 72 ----------------------
> EmulatorPkg/Sec/X64/SwitchRam.asm | 76 ------------------------
> 8 files changed, 5 insertions(+), 487 deletions(-)
> delete mode 100644 EmulatorPkg/Sec/Ia32/SwitchRam.S
> delete mode 100644 EmulatorPkg/Sec/Ia32/SwitchRam.asm
> delete mode 100644 EmulatorPkg/Sec/Ia32/TempRam.c
> delete mode 100644 EmulatorPkg/Sec/X64/SwitchRam.S
> delete mode 100644 EmulatorPkg/Sec/X64/SwitchRam.asm
>
> diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.S b/EmulatorPkg/Sec/Ia32/SwitchRam.S
> deleted file mode 100644
> index 39304daef1..0000000000
> --- a/EmulatorPkg/Sec/Ia32/SwitchRam.S
> +++ /dev/null
> @@ -1,95 +0,0 @@
> -#------------------------------------------------------------------------------
> -#
> -# Copyright (c) 2007, 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.
> -#
> -# Module Name:
> -#
> -# Stack.asm
> -#
> -# Abstract:
> -#
> -# Switch the stack from temporary memory to permenent memory.
> -#
> -#------------------------------------------------------------------------------
> -
> - .text
> -
> -
> -//------------------------------------------------------------------------------
> -// VOID
> -// EFIAPI
> -// SecSwitchStack (
> -// UINT32 TemporaryMemoryBase,
> -// UINT32 PermenentMemoryBase
> -// )//
> -//------------------------------------------------------------------------------
> -ASM_GLOBAL ASM_PFX(SecSwitchStack)
> -ASM_PFX(SecSwitchStack):
> -#
> -# Save three register: eax, ebx, ecx
> -#
> - push %eax
> - push %ebx
> - push %ecx
> - push %edx
> -
> -#
> -# !!CAUTION!! this function address's is pushed into stack after
> -# migration of whole temporary memory, so need save it to permenent
> -# memory at first!
> -#
> -
> - movl 20(%esp), %ebx # Save the first parameter
> - movl 24(%esp), %ecx # Save the second parameter
> -
> -#
> -# Save this function's return address into permenent memory at first.
> -# Then, Fixup the esp point to permenent memory
> -#
> -
> - movl %esp, %eax
> - subl %ebx, %eax
> - addl %ecx, %eax
> - movl (%esp), %edx # copy pushed register's value to permenent memory
> - movl %edx, (%eax)
> - movl 4(%esp), %edx
> - movl %edx, 4(%eax)
> - movl 8(%esp), %edx
> - movl %edx, 8(%eax)
> - movl 12(%esp), %edx
> - movl %edx, 12(%eax)
> - movl 16(%esp), %edx
> - movl %edx, 16(%eax)
> - movl %eax, %esp # From now, esp is pointed to permenent memory
> -
> -#
> -# Fixup the ebp point to permenent memory
> -#
> -#ifndef __APPLE__
> - movl %ebp, %eax
> - subl %ebx, %eax
> - addl %ecx, %eax
> - movl %eax, %ebp # From now, ebp is pointed to permenent memory
> -
> -#
> -# Fixup callee's ebp point for PeiDispatch
> -#
> - movl (%ebp), %eax
> - subl %ebx, %eax
> - addl %ecx, %eax
> - movl %eax, (%ebp) # From now, Temporary's PPI caller's stack is in permenent memory
> -#endif
> -
> - pop %edx
> - pop %ecx
> - pop %ebx
> - pop %eax
> - ret
> -
> diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.asm b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> deleted file mode 100644
> index 731ee0ffdb..0000000000
> --- a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> +++ /dev/null
> @@ -1,94 +0,0 @@
> -;------------------------------------------------------------------------------
> -;
> -; Copyright (c) 2007 - 2012, 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.
> -;
> -; Module Name:
> -;
> -; Stack.asm
> -;
> -; Abstract:
> -;
> -; Switch the stack from temporary memory to permenent memory.
> -;
> -;------------------------------------------------------------------------------
> -
> - .586p
> - .model flat,C
> - .code
> -
> -;------------------------------------------------------------------------------
> -; VOID
> -; EFIAPI
> -; SecSwitchStack (
> -; UINT32 TemporaryMemoryBase,
> -; UINT32 PermenentMemoryBase
> -; );
> -;------------------------------------------------------------------------------
> -SecSwitchStack PROC
> - ;
> - ; Save three register: eax, ebx, ecx
> - ;
> - push eax
> - push ebx
> - push ecx
> - push edx
> -
> - ;
> - ; !!CAUTION!! this function address's is pushed into stack after
> - ; migration of whole temporary memory, so need save it to permenent
> - ; memory at first!
> - ;
> -
> - mov ebx, [esp + 20] ; Save the first parameter
> - mov ecx, [esp + 24] ; Save the second parameter
> -
> - ;
> - ; Save this function's return address into permenent memory at first.
> - ; Then, Fixup the esp point to permenent memory
> - ;
> - mov eax, esp
> - sub eax, ebx
> - add eax, ecx
> - mov edx, dword ptr [esp] ; copy pushed register's value to permenent memory
> - mov dword ptr [eax], edx
> - mov edx, dword ptr [esp + 4]
> - mov dword ptr [eax + 4], edx
> - mov edx, dword ptr [esp + 8]
> - mov dword ptr [eax + 8], edx
> - mov edx, dword ptr [esp + 12]
> - mov dword ptr [eax + 12], edx
> - mov edx, dword ptr [esp + 16] ; Update this function's return address into permenent memory
> - mov dword ptr [eax + 16], edx
> - mov esp, eax ; From now, esp is pointed to permenent memory
> -
> - ;
> - ; Fixup the ebp point to permenent memory
> - ;
> - mov eax, ebp
> - sub eax, ebx
> - add eax, ecx
> - mov ebp, eax ; From now, ebp is pointed to permenent memory
> -
> - ;
> - ; Fixup callee's ebp point for PeiDispatch
> - ;
> - mov eax, dword ptr [ebp]
> - sub eax, ebx
> - add eax, ecx
> - mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in permenent memory
> -
> - pop edx
> - pop ecx
> - pop ebx
> - pop eax
> - ret
> -SecSwitchStack ENDP
> -
> - END
> diff --git a/EmulatorPkg/Sec/Ia32/TempRam.c b/EmulatorPkg/Sec/Ia32/TempRam.c
> deleted file mode 100644
> index 591354970b..0000000000
> --- a/EmulatorPkg/Sec/Ia32/TempRam.c
> +++ /dev/null
> @@ -1,65 +0,0 @@
> -/*++ @file
> - Temp RAM PPI
> -
> -Copyright (c) 2011, Apple Inc. 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 <PiPei.h>
> -#include <Library/DebugLib.h>
> -#include <Library/BaseMemoryLib.h>
> -
> -#include <Ppi/TemporaryRamSupport.h>
> -
> -VOID
> -EFIAPI
> -SecSwitchStack (
> - UINT32 TemporaryMemoryBase,
> - UINT32 PermenentMemoryBase
> - );
> -
> -
> -EFI_STATUS
> -EFIAPI
> -SecTemporaryRamSupport (
> - IN CONST EFI_PEI_SERVICES **PeiServices,
> - IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
> - IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
> - IN UINTN CopySize
> - )
> -{
> - //
> - // Migrate the whole temporary memory to permanent memory.
> - //
> - CopyMem (
> - (VOID*)(UINTN)PermanentMemoryBase,
> - (VOID*)(UINTN)TemporaryMemoryBase,
> - CopySize
> - );
> -
> - //
> - // SecSwitchStack function must be invoked after the memory migration
> - // immediately, also we need fixup the stack change caused by new call into
> - // permanent memory.
> - //
> - SecSwitchStack ((UINT32) TemporaryMemoryBase, (UINT32) PermanentMemoryBase);
> -
> - //
> - // We need *not* fix the return address because currently,
> - // The PeiCore is executed in flash.
> - //
> -
> - //
> - // Simulate to invalid temporary memory, terminate temporary memory
> - //
> - //ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);
> -
> - return EFI_SUCCESS;
> -}
> diff --git a/EmulatorPkg/Sec/Sec.c b/EmulatorPkg/Sec/Sec.c
> index 4132e9d9b7..84bd54f6c6 100644
> --- a/EmulatorPkg/Sec/Sec.c
> +++ b/EmulatorPkg/Sec/Sec.c
> @@ -4,6 +4,7 @@
> The OS application will call the SEC with the PEI Entry Point API.
>
> Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +Copyright (c) 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
> @@ -17,22 +18,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> #include "Sec.h"
>
>
> -
> -EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
> - SecTemporaryRamSupport
> -};
> -
> -
> -EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
> - {
> - EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> - &gEfiTemporaryRamSupportPpiGuid,
> - &mSecTemporaryRamSupportPpi
> - }
> -};
> -
> -
> -
> /**
> The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
> SEC that sits on top of an OS application. So the entry and exit of this module
> @@ -77,54 +62,12 @@ _ModuleEntryPoint (
> EFI_PEI_FILE_HANDLE FileHandle;
> VOID *PeCoffImage;
> EFI_PEI_CORE_ENTRY_POINT EntryPoint;
> - EFI_PEI_PPI_DESCRIPTOR *Ppi;
> - EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
> - UINTN SecReseveredMemorySize;
> - UINTN Index;
>
> EMU_MAGIC_PAGE()->PpiList = PpiList;
> ProcessLibraryConstructorList ();
>
> DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
>
> - //
> - // Add Our PPIs to the list
> - //
> - SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
> - for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
> - SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
> -
> - if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> - // Since we are appending, need to clear out privious list terminator.
> - Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> - break;
> - }
> - }
> -
> - // Keep everything on a good alignment
> - SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
> -
> -#if 0
> - // Tell the PEI Core to not use our buffer in temp RAM
> - SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
> - SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
> - SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
> -#else
> - {
> - //
> - // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
> - // or I don't understand temp RAM correctly?
> - //
> - EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
> -
> - SecPpiList = &PpiArray[0];
> - ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
> - }
> -#endif
> - // Copy existing list, and append our entries.
> - CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
> - CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
> -
> // Find PEI Core and transfer control
> VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
> FileHandle = NULL;
> @@ -138,7 +81,7 @@ _ModuleEntryPoint (
> ASSERT_EFI_ERROR (Status);
>
> // Transfer control to PEI Core
> - EntryPoint (SecCoreData, SecPpiList);
> + EntryPoint (SecCoreData, PpiList);
>
> // PEI Core never returns
> ASSERT (FALSE);
> diff --git a/EmulatorPkg/Sec/Sec.h b/EmulatorPkg/Sec/Sec.h
> index c5781201eb..8f60de4405 100644
> --- a/EmulatorPkg/Sec/Sec.h
> +++ b/EmulatorPkg/Sec/Sec.h
> @@ -4,6 +4,7 @@
> The OS application will call the SEC with the PEI Entry Point API.
>
> Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +Copyright (c) 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
> @@ -25,9 +26,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> #include <Library/PeCoffGetEntryPointLib.h>
> #include <Library/BaseMemoryLib.h>
>
> -#include <Ppi/TemporaryRamSupport.h>
> -
> -
> //
> // I think this shold be defined in a MdePkg include file?
> //
> @@ -37,15 +35,5 @@ ProcessLibraryConstructorList (
> VOID
> );
>
> -EFI_STATUS
> -EFIAPI
> -SecTemporaryRamSupport (
> - IN CONST EFI_PEI_SERVICES **PeiServices,
> - IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
> - IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
> - IN UINTN CopySize
> - );
> -
> -
> #endif
>
> diff --git a/EmulatorPkg/Sec/Sec.inf b/EmulatorPkg/Sec/Sec.inf
> index d253fd724e..8691c86dde 100644
> --- a/EmulatorPkg/Sec/Sec.inf
> +++ b/EmulatorPkg/Sec/Sec.inf
> @@ -3,7 +3,7 @@
> #
> # Main executable file of Unix Emulator that loads PEI core after initialization finished.
> # Portions copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -# Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2012 - 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
> @@ -25,15 +25,7 @@ [Defines]
>
> [Sources]
> Sec.c
> -
> -[Sources.X64]
> - X64/SwitchRam.asm
> - X64/SwitchRam.S
> -
> -[Sources.IA32]
> - Ia32/TempRam.c
> - Ia32/SwitchRam.asm
> - Ia32/SwitchRam.S
> + Sec.h
>
> [Packages]
> MdePkg/MdePkg.dec
> @@ -46,8 +38,5 @@ [LibraryClasses]
> PpiListLib
> BaseMemoryLib
>
> -[Ppis]
> - gEfiTemporaryRamSupportPpiGuid
> -
> [Pcd]
> gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
> diff --git a/EmulatorPkg/Sec/X64/SwitchRam.S b/EmulatorPkg/Sec/X64/SwitchRam.S
> deleted file mode 100644
> index 9ed1f911e7..0000000000
> --- a/EmulatorPkg/Sec/X64/SwitchRam.S
> +++ /dev/null
> @@ -1,72 +0,0 @@
> -#------------------------------------------------------------------------------
> -#
> -# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> -# Portitions copyright (c) 2011, Apple Inc. All rights reserved.
> -# 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.
> -#
> -#------------------------------------------------------------------------------
> -
> -
> -
> -// EFI_STATUS
> -// EFIAPI
> -// SecTemporaryRamSupport (
> -// IN CONST EFI_PEI_SERVICES **PeiServices, // %rcx
> -// IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // %rdx
> -// IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // %r8
> -// IN UINTN CopySize // %r9
> -// )
> -//
> -ASM_GLOBAL ASM_PFX(SecTemporaryRamSupport)
> -ASM_PFX(SecTemporaryRamSupport):
> - // Adjust callers %rbp to account for stack move
> - subq %rdx, %rbp // Calc offset of %rbp in Temp Memory
> - addq %r8, %rbp // add in permanent base to offset
> -
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rdx // Save TemporaryMemoryBase
> - pushq %r8 // Save PermanentMemoryBase
> - pushq %r9 // Save CopySize
> -
> - //
> - // Copy all of temp RAM to permanent memory, including stack
> - //
> - // CopyMem (PermanentMemoryBase, TemporaryMemoryBase, CopySize);
> - // %rcx, %rdx, %r8
> - movq %r8, %rcx // Shift arguments
> - movq %r9, %r8
> - subq $0x28, %rsp // Allocate register spill area & 16-byte align stack
> - call ASM_PFX(CopyMem)
> - // Temp mem stack now copied to permanent location. %esp still in temp memory
> - addq $0x28, %rsp
> -
> - popq %r9 // CopySize (old stack)
> - popq %r8 // PermanentMemoryBase (old stack)
> - popq %rdx // TemporaryMemoryBase (old stack)
> -
> - movq %rsp, %rcx // Move to new stack
> - subq %rdx, %rcx // Calc offset of stack in Temp Memory
> - addq %r8, %rcx // Calc PermanentMemoryBase address
> - movq %rcx, %rsp // Update stack
> - // Stack now points to permanent memory
> -
> - // ZeroMem (TemporaryMemoryBase /* rcx */, CopySize /* rdx */);
> - movq %rdx, %rcx
> - movq %r9, %rdx
> - subq $0x28, %rsp // Allocate register spill area & 16-byte align stack
> - call ASM_PFX(ZeroMem)
> - addq $0x28, %rsp
> -
> - // This data comes off the NEW stack
> - popq %rbp
> - ret
> -
> -
> diff --git a/EmulatorPkg/Sec/X64/SwitchRam.asm b/EmulatorPkg/Sec/X64/SwitchRam.asm
> deleted file mode 100644
> index d1a7b943fd..0000000000
> --- a/EmulatorPkg/Sec/X64/SwitchRam.asm
> +++ /dev/null
> @@ -1,76 +0,0 @@
> -;------------------------------------------------------------------------------
> -;
> -; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> -; Portitions copyright (c) 2011, Apple Inc. All rights reserved.
> -; 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.
> -;
> -;------------------------------------------------------------------------------
> -
> -EXTERN CopyMem:PROC
> -EXTERN ZeroMem:PROC
> -
> - .code
> -
> -;------------------------------------------------------------------------------
> -; EFI_STATUS
> -; EFIAPI
> -; SecTemporaryRamSupport (
> -; IN CONST EFI_PEI_SERVICES **PeiServices, // %rcx
> -; IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // %rdx
> -; IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // %r8
> -; IN UINTN CopySize // %r9
> -; )
> -;------------------------------------------------------------------------------
> -SecTemporaryRamSupport PROC
> - ; Adjust callers %rbp to account for stack move
> - sub rbp, rdx ; Calc offset of %rbp in Temp Memory
> - add rbp, r8 ; add in permanent base to offset
> -
> - push rbp ; stack frame is for the debugger
> - mov rbp, rsp
> -
> - push rdx ; Save TemporaryMemoryBase
> - push r8 ; Save PermanentMemoryBase
> - push r9 ; Save CopySize
> -
> - ;
> - ; Copy all of temp RAM to permanent memory, including stack
> - ;
> - ; CopyMem (PermanentMemoryBase, TemporaryMemoryBase, CopySize);
> - ; %rcx, %rdx, %r8
> - mov rcx, r8 ; Shift arguments
> - mov r8, r9
> - sub rsp, 028h ; Allocate register spill area & 16-byte align stack
> - call CopyMem
> - ; Temp mem stack now copied to permanent location. %esp still in temp memory
> - add rsp, 028h
> -
> - pop r9 ; CopySize (old stack)
> - pop r8 ; PermanentMemoryBase (old stack)
> - pop rdx ; TemporaryMemoryBase (old stack)
> -
> - mov rcx, rsp ; Move to new stack
> - sub rcx, rdx ; Calc offset of stack in Temp Memory
> - add rcx, r8 ; Calc PermanentMemoryBase address
> - mov rsp, rcx ; Update stack
> - ; Stack now points to permanent memory
> -
> - ; ZeroMem (TemporaryMemoryBase /* rcx */, CopySize /* rdx */);
> - mov rcx, rdx
> - mov rdx, r9
> - sub rsp, 028h ; Allocate register spill area & 16-byte align stack
> - call ZeroMem
> - add rsp, 028h
> -
> - ; This data comes off the NEW stack
> - pop rbp
> - ret
> -SecTemporaryRamSupport ENDP
> -
> - END
> --
> 2.20.1.windows.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
next prev parent reply other threads:[~2019-03-02 21:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-02 12:11 [PATCH] EmulatorPkg/Sec: Don't install TemporaryRamSupport PPI Ray Ni
2019-03-02 21:45 ` Jordan Justen [this message]
2019-03-05 2:37 ` Ni, Ray
2019-03-05 21:48 ` Jordan Justen
2019-03-06 2:23 ` Ni, Ray
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=155156311737.17885.4362726503400495940@jljusten-skl \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox