From bb89ec1a7ec2f8d35033df9e47b3604925da3bd3 Mon Sep 17 00:00:00 2001 From: jljusten Date: Tue, 28 Jun 2011 16:47:23 +0000 Subject: InOsEmuPkg: Rename package to EmulatorPkg & Sec to Host * Rename InOsEmuPkg to EmulatorPkg * Rename Unix/Sec to Unix/Host Signed-off-by: jljusten Reviewed-by: andrewfish Reviewed-by: geekboy15a git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11918 6f19259b-4bc3-4df7-8a09-765794883524 --- EmulatorPkg/Sec/X64/SwitchRam.S | 72 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 EmulatorPkg/Sec/X64/SwitchRam.S (limited to 'EmulatorPkg/Sec/X64') diff --git a/EmulatorPkg/Sec/X64/SwitchRam.S b/EmulatorPkg/Sec/X64/SwitchRam.S new file mode 100644 index 0000000000..a7219bf21f --- /dev/null +++ b/EmulatorPkg/Sec/X64/SwitchRam.S @@ -0,0 +1,72 @@ +#------------------------------------------------------------------------------ +# +# 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 + + -- cgit v1.2.3