From aac0fea79f7ea20d7b184fe13afeca8b6a0e575e Mon Sep 17 00:00:00 2001 From: andrewfish Date: Sat, 18 Jun 2011 23:36:36 +0000 Subject: InOsEmuPkg: Fix IA-32 SEC temp ram code. Now we crash early in DXE Core. Signed-off-by: andrewfish git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11852 6f19259b-4bc3-4df7-8a09-765794883524 --- InOsEmuPkg/Sec/Ia32/SwitchRam.S | 110 +++++++++++++++++++--------------------- InOsEmuPkg/Sec/Ia32/TempRam.c | 65 ++++++++++++++++++++++++ InOsEmuPkg/Sec/Sec.inf | 1 + 3 files changed, 117 insertions(+), 59 deletions(-) create mode 100644 InOsEmuPkg/Sec/Ia32/TempRam.c diff --git a/InOsEmuPkg/Sec/Ia32/SwitchRam.S b/InOsEmuPkg/Sec/Ia32/SwitchRam.S index abb8e7dac1..81e478be82 100644 --- a/InOsEmuPkg/Sec/Ia32/SwitchRam.S +++ b/InOsEmuPkg/Sec/Ia32/SwitchRam.S @@ -22,17 +22,6 @@ .text -// 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): //------------------------------------------------------------------------------ // VOID // EFIAPI @@ -41,63 +30,66 @@ ASM_PFX(SecTemporaryRamSupport): // UINT32 PermenentMemoryBase // )// //------------------------------------------------------------------------------ - - // - // Save three register: eax, ebx, ecx - // +ASM_GLOBAL ASM_PFX(SecSwitchStack) +ASM_PFX(SecSwitchStack): +# +# Save three register: eax, ebx, ecx +# push %eax push %ebx push %ecx push %edx - -#if 0 -// Port me to GAS syntax - // - // !!CAUTION!! this function addresss 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 +# +# !!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 - // - // Save this functions 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 registers 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 functions 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 +# + 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 - // - // Fixup callees ebp point for PeiDispatch - // - mov eax, dword ptr [ebp] - sub eax, ebx - add eax, ecx - mov dword ptr [ebp], eax // From now, Temporarys PPI callers stack is in permenent memory -#endif pop %edx pop %ecx pop %ebx pop %eax ret + diff --git a/InOsEmuPkg/Sec/Ia32/TempRam.c b/InOsEmuPkg/Sec/Ia32/TempRam.c new file mode 100644 index 0000000000..525fb95d48 --- /dev/null +++ b/InOsEmuPkg/Sec/Ia32/TempRam.c @@ -0,0 +1,65 @@ +/*++ @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 permenent memory. + // + CopyMem ( + (VOID*)(UINTN)PermanentMemoryBase, + (VOID*)(UINTN)TemporaryMemoryBase, + CopySize + ); + + // + // SecSwitchStack function must be invoked after the memory migration + // immediatly, also we need fixup the stack change caused by new call into + // permenent memory. + // + SecSwitchStack ((UINT32) TemporaryMemoryBase, (UINT32) PermanentMemoryBase); + + // + // We need *not* fix the return address because currently, + // The PeiCore is excuted in flash. + // + + // + // Simulate to invalid temporary memory, terminate temporary memory + // + //ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize); + + return EFI_SUCCESS; +} diff --git a/InOsEmuPkg/Sec/Sec.inf b/InOsEmuPkg/Sec/Sec.inf index 5d875b55b5..8b9d604eec 100644 --- a/InOsEmuPkg/Sec/Sec.inf +++ b/InOsEmuPkg/Sec/Sec.inf @@ -29,6 +29,7 @@ X64/SwitchRam.S [Sources.IA32] + Ia32/TempRam.c Ia32/SwitchRam.S [Packages] -- cgit v1.2.3