summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--OvmfPkg/Sec/FindPeiCore.c103
-rw-r--r--OvmfPkg/Sec/Ia32/SecEntry.S19
-rw-r--r--OvmfPkg/Sec/Ia32/SecEntry.asm15
-rw-r--r--OvmfPkg/Sec/SecMain.c52
-rw-r--r--OvmfPkg/Sec/SecMain.h7
-rw-r--r--OvmfPkg/Sec/SecMain.inf6
-rw-r--r--OvmfPkg/Sec/X64/SecEntry.S24
-rw-r--r--OvmfPkg/Sec/X64/SecEntry.asm21
8 files changed, 173 insertions, 74 deletions
diff --git a/OvmfPkg/Sec/FindPeiCore.c b/OvmfPkg/Sec/FindPeiCore.c
new file mode 100644
index 0000000000..7d13ebb4bc
--- /dev/null
+++ b/OvmfPkg/Sec/FindPeiCore.c
@@ -0,0 +1,103 @@
+/** @file
+ Locate the entry point for the PEI Core
+
+ Copyright (c) 2008 - 2009, 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.
+
+**/
+
+#include <PiPei.h>
+#include <Library/BaseLib.h>
+#include <Library/PeCoffGetEntryPointLib.h>
+
+#include "SecMain.h"
+
+
+VOID
+EFIAPI
+FindPeiCoreEntryPoint (
+ IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
+ OUT VOID **PeiCoreEntryPoint
+ )
+{
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS CurrentAddress;
+ EFI_PHYSICAL_ADDRESS EndOfFirmwareVolume;
+ EFI_FFS_FILE_HEADER *File;
+ UINT32 Size;
+ EFI_PHYSICAL_ADDRESS EndOfFile;
+ EFI_COMMON_SECTION_HEADER *Section;
+ EFI_PHYSICAL_ADDRESS EndOfSection;
+
+ *PeiCoreEntryPoint = NULL;
+
+ CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;
+ EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;
+
+ //
+ // Loop through the FFS files in the Boot Firmware Volume
+ //
+ for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {
+
+ CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;
+ if (CurrentAddress > EndOfFirmwareVolume) {
+ return;
+ }
+
+ File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;
+ Size = *(UINT32*) File->Size & 0xffffff;
+ if (Size < (sizeof (*File) + sizeof (*Section))) {
+ return;
+ }
+
+ EndOfFile = CurrentAddress + Size;
+ if (EndOfFile > EndOfFirmwareVolume) {
+ return;
+ }
+
+ //
+ // Look for PEI Core files
+ //
+ if (File->Type != EFI_FV_FILETYPE_PEI_CORE) {
+ continue;
+ }
+
+ //
+ // Loop through the FFS file sections within the PEI Core FFS file
+ //
+ EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN) (File + 1);
+ for (;;) {
+ CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;
+ Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;
+
+ Size = *(UINT32*) Section->Size & 0xffffff;
+ if (Size < sizeof (*Section)) {
+ return;
+ }
+
+ EndOfSection = CurrentAddress + Size;
+ if (EndOfSection > EndOfFile) {
+ return;
+ }
+
+ //
+ // Look for executable sections
+ //
+ if (Section->Type == EFI_SECTION_PE32) {
+ Status = PeCoffLoaderGetEntryPoint ((VOID*) (Section + 1), PeiCoreEntryPoint);
+ if (!EFI_ERROR (Status)) {
+ return;
+ }
+ }
+ }
+
+ }
+}
+
diff --git a/OvmfPkg/Sec/Ia32/SecEntry.S b/OvmfPkg/Sec/Ia32/SecEntry.S
index 50ba5aa99e..4240f3377f 100644
--- a/OvmfPkg/Sec/Ia32/SecEntry.S
+++ b/OvmfPkg/Sec/Ia32/SecEntry.S
@@ -1,8 +1,4 @@
-#
-# ConvertAsm.py: Automatically generated from SecEntry.asm
-#
# TITLE SecEntry.asm
-
#------------------------------------------------------------------------------
#*
#* Copyright 2006 - 2009, Intel Corporation
@@ -26,16 +22,15 @@
#EXTERN ASM_PFX(SecCoreStartupWithStack)
#
-# SecCore Entry Point
-#
-# Processor is in flat protected mode
+# SecCore Entry Point
#
-# @param ESI Pointer to SEC Core Entry Point (this function)
-# @param EDI Pointer to PEI Core Entry Point
-# @param EBP Pointer to the start of the Boot Firmware Volume
+# Processor is in flat protected mode
#
-# @return None
+# @param[in] EAX Initial value of the EAX register (BIST: Built-in Self Test)
+# @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
+# @param[in] EBP Pointer to the start of the Boot Firmware Volume
#
+# @return None This routine does not return
#
ASM_GLOBAL ASM_PFX(_ModuleEntryPoint)
ASM_PFX(_ModuleEntryPoint):
@@ -52,8 +47,6 @@ ASM_PFX(_ModuleEntryPoint):
# Call into C code
#
pushl %eax
- pushl %edi
- pushl %esi
pushl %ebp
call ASM_PFX(SecCoreStartupWithStack)
diff --git a/OvmfPkg/Sec/Ia32/SecEntry.asm b/OvmfPkg/Sec/Ia32/SecEntry.asm
index 48b97a40f9..eae2801d18 100644
--- a/OvmfPkg/Sec/Ia32/SecEntry.asm
+++ b/OvmfPkg/Sec/Ia32/SecEntry.asm
@@ -25,16 +25,15 @@
EXTERN SecCoreStartupWithStack:PROC
;
-; SecCore Entry Point
+; SecCore Entry Point
;
-; Processor is in flat protected mode
+; Processor is in flat protected mode
;
-; @param ESI Pointer to SEC Core Entry Point (this function)
-; @param EDI Pointer to PEI Core Entry Point
-; @param EBP Pointer to the start of the Boot Firmware Volume
-;
-; @return None
+; @param[in] EAX Initial value of the EAX register (BIST: Built-in Self Test)
+; @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
+; @param[in] EBP Pointer to the start of the Boot Firmware Volume
;
+; @return None This routine does not return
;
_ModuleEntryPoint PROC PUBLIC
@@ -50,8 +49,6 @@ _ModuleEntryPoint PROC PUBLIC
; Call into C code
;
push eax
- push edi
- push esi
push ebp
call SecCoreStartupWithStack
diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c
index 832c0e8a37..99d21f3d95 100644
--- a/OvmfPkg/Sec/SecMain.c
+++ b/OvmfPkg/Sec/SecMain.c
@@ -61,10 +61,8 @@ InitializeIdtPtr (
VOID
EFIAPI
SecCoreStartupWithStack (
- IN VOID *BootFirmwareVolumePtr,
- IN VOID *SecCoreEntryPoint,
- IN VOID *PeiCoreEntryPoint,
- IN VOID *TopOfCurrentStack
+ IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
+ IN VOID *TopOfCurrentStack
)
{
EFI_SEC_PEI_HAND_OFF *SecCoreData;
@@ -72,6 +70,7 @@ SecCoreStartupWithStack (
UINT8 *TopOfTempRam;
UINTN SizeOfTempRam;
VOID *IdtPtr;
+ VOID *PeiCoreEntryPoint;
//
// Initialize floating point operating environment
@@ -79,14 +78,12 @@ SecCoreStartupWithStack (
//
InitializeFloatingPointUnits ();
- DEBUG ((EFI_D_ERROR,
- "SecCoreStartupWithStack(0x%x, 0x%x, 0x%x, 0x%x)\n",
+ DEBUG ((EFI_D_INFO,
+ "SecCoreStartupWithStack(0x%x, 0x%x)\n",
(UINT32)(UINTN)BootFirmwareVolumePtr,
- (UINT32)(UINTN)SecCoreEntryPoint,
- (UINT32)(UINTN)PeiCoreEntryPoint,
- (UINT32)(UINTN)TopOfCurrentStack));
+ (UINT32)(UINTN)TopOfCurrentStack
+ ));
-
BottomOfTempRam = (UINT8*)(UINTN) INITIAL_TOP_OF_STACK;
SizeOfTempRam = (UINTN) SIZE_64KB;
TopOfTempRam = BottomOfTempRam + SizeOfTempRam;
@@ -127,20 +124,31 @@ SecCoreStartupWithStack (
IdtPtr = ALIGN_POINTER(IdtPtr, 16);
InitializeIdtPtr (IdtPtr);
- //
- // Transfer control to the PEI Core
- //
- PeiSwitchStacks (
- (SWITCH_STACK_ENTRY_POINT) (UINTN) PeiCoreEntryPoint,
- SecCoreData,
- (VOID *) (UINTN) ((EFI_PEI_PPI_DESCRIPTOR *) &mPrivateDispatchTable),
- NULL,
- TopOfCurrentStack,
- (VOID *)((UINTN)SecCoreData->StackBase + SecCoreData->StackSize)
- );
+ FindPeiCoreEntryPoint (BootFirmwareVolumePtr, &PeiCoreEntryPoint);
+
+ if (PeiCoreEntryPoint != NULL) {
+ DEBUG ((EFI_D_INFO,
+ "Calling PEI Core entry point at 0x%x\n",
+ PeiCoreEntryPoint
+ ));
+ //
+ // Transfer control to the PEI Core
+ //
+ PeiSwitchStacks (
+ (SWITCH_STACK_ENTRY_POINT) (UINTN) PeiCoreEntryPoint,
+ SecCoreData,
+ (VOID *) (UINTN) ((EFI_PEI_PPI_DESCRIPTOR *) &mPrivateDispatchTable),
+ NULL,
+ TopOfCurrentStack,
+ (VOID *)((UINTN)SecCoreData->StackBase + SecCoreData->StackSize)
+ );
+ }
//
- // If we get here, then the PEI Core returned. This is an error
+ // If we get here, then either we couldn't locate the PEI Core, or
+ // the PEI Core returned.
+ //
+ // Both of these errors are unrecoverable.
//
ASSERT (FALSE);
CpuDeadLoop ();
diff --git a/OvmfPkg/Sec/SecMain.h b/OvmfPkg/Sec/SecMain.h
index 50c5b295e9..4f5eaa8137 100644
--- a/OvmfPkg/Sec/SecMain.h
+++ b/OvmfPkg/Sec/SecMain.h
@@ -44,6 +44,13 @@ TemporaryRamMigration (
IN UINTN CopySize
);
+VOID
+EFIAPI
+FindPeiCoreEntryPoint (
+ IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr,
+ OUT VOID **PeiCoreEntryPoint
+ );
+
#define INITIAL_TOP_OF_STACK BASE_128KB
#endif // _PLATFORM_SECMAIN_H_
diff --git a/OvmfPkg/Sec/SecMain.inf b/OvmfPkg/Sec/SecMain.inf
index de217b5691..7cc1533fdc 100644
--- a/OvmfPkg/Sec/SecMain.inf
+++ b/OvmfPkg/Sec/SecMain.inf
@@ -1,7 +1,7 @@
#/** @file
# SEC Driver
#
-# Copyright (c) 2008, Intel Corporation
+# Copyright (c) 2008 - 2009, 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
@@ -30,6 +30,7 @@
#
[Sources.common]
+ FindPeiCore.c
SecMain.c
[Sources.IA32]
@@ -49,8 +50,9 @@
[LibraryClasses]
BaseLib
- UefiCpuLib
PcdLib
+ PeCoffGetEntryPointLib
+ UefiCpuLib
[Ppis]
gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED
diff --git a/OvmfPkg/Sec/X64/SecEntry.S b/OvmfPkg/Sec/X64/SecEntry.S
index a1de5e674b..0700656ed7 100644
--- a/OvmfPkg/Sec/X64/SecEntry.S
+++ b/OvmfPkg/Sec/X64/SecEntry.S
@@ -1,5 +1,4 @@
# TITLE SecEntry.asm
-
#------------------------------------------------------------------------------
#*
#* Copyright 2006 - 2009, Intel Corporation
@@ -23,16 +22,15 @@
#EXTERN ASM_PFX(SecCoreStartupWithStack)
#
-# SecCore Entry Point
-#
-# Processor is in flat protected mode
+# SecCore Entry Point
#
-# @param ESI Pointer to SEC Core Entry Point (this function)
-# @param EDI Pointer to PEI Core Entry Point
-# @param EBP Pointer to the start of the Boot Firmware Volume
+# Processor is in flat protected mode
#
-# @return None
+# @param[in] RAX Initial value of the EAX register (BIST: Built-in Self Test)
+# @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
+# @param[in] RBP Pointer to the start of the Boot Firmware Volume
#
+# @return None This routine does not return
#
ASM_GLOBAL ASM_PFX(_ModuleEntryPoint)
ASM_PFX(_ModuleEntryPoint):
@@ -47,14 +45,10 @@ ASM_PFX(_ModuleEntryPoint):
#
# Setup parameters and call SecCoreStartupWithStack
# rcx: BootFirmwareVolumePtr
- # rdx: SecCoreEntryPoint
- # r8: PeiCoreEntryPoint
- # r9: TopOfCurrentStack
+ # rdx: TopOfCurrentStack
#
- movq %rbp, %rcx
- movq %rsi, %rdx
- movq %rdi, %r8
- movq %rsp, %r9
+ movq %rbp, %rcx
+ movq %rsp, %rdx
subq $0x20, %rsp
call ASM_PFX(SecCoreStartupWithStack)
diff --git a/OvmfPkg/Sec/X64/SecEntry.asm b/OvmfPkg/Sec/X64/SecEntry.asm
index fb38548be3..d037cbea12 100644
--- a/OvmfPkg/Sec/X64/SecEntry.asm
+++ b/OvmfPkg/Sec/X64/SecEntry.asm
@@ -23,16 +23,15 @@
EXTERN SecCoreStartupWithStack:PROC
;
-; SecCore Entry Point
+; SecCore Entry Point
;
-; Processor is in flat protected mode
+; Processor is in flat protected mode
;
-; @param ESI Pointer to SEC Core Entry Point (this function)
-; @param EDI Pointer to PEI Core Entry Point
-; @param EBP Pointer to the start of the Boot Firmware Volume
-;
-; @return None
+; @param[in] RAX Initial value of the EAX register (BIST: Built-in Self Test)
+; @param[in] DI 'BP': boot-strap processor, or 'AP': application processor
+; @param[in] RBP Pointer to the start of the Boot Firmware Volume
;
+; @return None This routine does not return
;
_ModuleEntryPoint PROC PUBLIC
@@ -46,14 +45,10 @@ _ModuleEntryPoint PROC PUBLIC
;
; Setup parameters and call SecCoreStartupWithStack
; rcx: BootFirmwareVolumePtr
- ; rdx: SecCoreEntryPoint
- ; r8: PeiCoreEntryPoint
- ; r9: TopOfCurrentStack
+ ; rdx: TopOfCurrentStack
;
mov rcx, rbp
- mov rdx, rsi
- mov r8, rdi
- mov r9, rsp
+ mov rdx, rsp
sub rsp, 20h
call SecCoreStartupWithStack