diff options
-rw-r--r-- | OvmfPkg/Sec/FindPeiCore.c | 103 | ||||
-rw-r--r-- | OvmfPkg/Sec/Ia32/SecEntry.S | 19 | ||||
-rw-r--r-- | OvmfPkg/Sec/Ia32/SecEntry.asm | 15 | ||||
-rw-r--r-- | OvmfPkg/Sec/SecMain.c | 52 | ||||
-rw-r--r-- | OvmfPkg/Sec/SecMain.h | 7 | ||||
-rw-r--r-- | OvmfPkg/Sec/SecMain.inf | 6 | ||||
-rw-r--r-- | OvmfPkg/Sec/X64/SecEntry.S | 24 | ||||
-rw-r--r-- | OvmfPkg/Sec/X64/SecEntry.asm | 21 |
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
|