diff options
author | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-18 23:36:36 +0000 |
---|---|---|
committer | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-18 23:36:36 +0000 |
commit | aac0fea79f7ea20d7b184fe13afeca8b6a0e575e (patch) | |
tree | 9911db24456dc610a3313af97321d85d236e1b97 | |
parent | e7523e0619981d5e49c370cfe7a18d442d32a465 (diff) | |
download | edk2-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.S | 110 | ||||
-rw-r--r-- | InOsEmuPkg/Sec/Ia32/TempRam.c | 65 | ||||
-rw-r--r-- | InOsEmuPkg/Sec/Sec.inf | 1 |
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]
|