From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=jordan.l.justen@intel.com; receiver=edk2-devel@lists.01.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 25E3520886F21 for ; Sun, 17 Feb 2019 20:12:00 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Feb 2019 20:11:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,383,1544515200"; d="scan'208";a="321197969" Received: from mmdandap-mobl1.amr.corp.intel.com (HELO jljusten-skl.amr.corp.intel.com) ([10.254.8.66]) by fmsmga005.fm.intel.com with ESMTP; 17 Feb 2019 20:11:58 -0800 From: Jordan Justen To: edk2-devel@lists.01.org Cc: Jordan Justen , Andrew Fish , Ray Ni Date: Sun, 17 Feb 2019 20:11:34 -0800 Message-Id: <20190218041141.21363-4-jordan.l.justen@intel.com> X-Mailer: git-send-email 2.20.0.rc1 In-Reply-To: <20190218041141.21363-1-jordan.l.justen@intel.com> References: <20190218041141.21363-1-jordan.l.justen@intel.com> MIME-Version: 1.0 Subject: [PATCH 03/10] EmulatorPkg/Sec: Replace assembly temp-ram support with C code X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Feb 2019 04:12:00 -0000 Content-Transfer-Encoding: 8bit OvmfPkg uses similar code based on SetJump/LongJump. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jordan Justen Cc: Andrew Fish Cc: Ray Ni --- EmulatorPkg/Sec/Ia32/SwitchRam.S | 95 ------------------------------ EmulatorPkg/Sec/Ia32/SwitchRam.asm | 94 ----------------------------- EmulatorPkg/Sec/Ia32/TempRam.c | 65 -------------------- EmulatorPkg/Sec/Sec.c | 64 +++++++++++++++++++- EmulatorPkg/Sec/Sec.inf | 13 +--- EmulatorPkg/Sec/X64/SwitchRam.S | 72 ---------------------- EmulatorPkg/Sec/X64/SwitchRam.asm | 76 ------------------------ 7 files changed, 66 insertions(+), 413 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.
-# 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.
-; 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.
-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 -#include -#include - -#include - -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..bd61e5ac4a 100644 --- a/EmulatorPkg/Sec/Sec.c +++ b/EmulatorPkg/Sec/Sec.c @@ -4,6 +4,8 @@ The OS application will call the SEC with the PEI Entry Point API. Copyright (c) 2011, Apple Inc. All rights reserved.
+Copyright (c) 2018 - 2019, Intel Corporation. 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 @@ -17,9 +19,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "Sec.h" +EFI_STATUS +EFIAPI +TemporaryRamMigration ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ); EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = { - SecTemporaryRamSupport + TemporaryRamMigration }; @@ -31,6 +41,58 @@ EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = { } }; +EFI_STATUS +EFIAPI +TemporaryRamMigration ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ) +{ + BASE_LIBRARY_JUMP_BUFFER JumpBuffer; + INTN OldToNewStackDelta; + + DEBUG ((DEBUG_INFO, + "TemporaryRamMigration(0x%Lx, 0x%Lx, 0x%Lx)\n", + TemporaryMemoryBase, + PermanentMemoryBase, + (UINT64)CopySize + )); + + OldToNewStackDelta = (INTN)PermanentMemoryBase - (INTN)TemporaryMemoryBase; + + CopyMem ( + (VOID*)(UINTN) PermanentMemoryBase, + (VOID*)(UINTN) TemporaryMemoryBase, + CopySize + ); + + // + // Use SetJump()/LongJump() to switch to a new stack. + // + if (SetJump (&JumpBuffer) == 0) { +#if defined (MDE_CPU_IA32) + JumpBuffer.Esp = JumpBuffer.Esp + OldToNewStackDelta; + JumpBuffer.Ebp = JumpBuffer.Ebp + OldToNewStackDelta; +#endif +#if defined (MDE_CPU_X64) + JumpBuffer.Rsp = JumpBuffer.Rsp + OldToNewStackDelta; + JumpBuffer.Rbp = JumpBuffer.Rbp + OldToNewStackDelta; +#endif + LongJump (&JumpBuffer, (UINTN)-1); + } + + // + // Initialize Temporary RAM to a bad value to make sure it will not + // be used after migration. + // + SetMem32 ( + (VOID*)(UINTN)TemporaryMemoryBase, CopySize, + PcdGet32 (PcdInitValueInTempStack)); + + return EFI_SUCCESS; +} /** diff --git a/EmulatorPkg/Sec/Sec.inf b/EmulatorPkg/Sec/Sec.inf index d253fd724e..93c09d248a 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.
-# Copyright (c) 2012, Intel Corporation. All rights reserved.
+# Copyright (c) 2012 - 2019, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -26,17 +26,9 @@ [Sources] Sec.c -[Sources.X64] - X64/SwitchRam.asm - X64/SwitchRam.S - -[Sources.IA32] - Ia32/TempRam.c - Ia32/SwitchRam.asm - Ia32/SwitchRam.S - [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec EmulatorPkg/EmulatorPkg.dec [LibraryClasses] @@ -50,4 +42,5 @@ gEfiTemporaryRamSupportPpiGuid [Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdInitValueInTempStack 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.
-# 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.
-; 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.0.rc1