summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-18 23:36:36 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-18 23:36:36 +0000
commitaac0fea79f7ea20d7b184fe13afeca8b6a0e575e (patch)
tree9911db24456dc610a3313af97321d85d236e1b97
parente7523e0619981d5e49c370cfe7a18d442d32a465 (diff)
downloadedk2-platforms-aac0fea79f7ea20d7b184fe13afeca8b6a0e575e.tar.xz
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
-rw-r--r--InOsEmuPkg/Sec/Ia32/SwitchRam.S110
-rw-r--r--InOsEmuPkg/Sec/Ia32/TempRam.c65
-rw-r--r--InOsEmuPkg/Sec/Sec.inf1
3 files changed, 117 insertions, 59 deletions
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.<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 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]