From 0913fadc1af9edf545d5dd4120e0a708dfb73af0 Mon Sep 17 00:00:00 2001 From: jljusten Date: Wed, 16 Dec 2009 23:29:17 +0000 Subject: OVMF SEC: Modify to match new interface of reset vector module Previously the interface to the SEC module was: ESI/RSI - SEC Core entry point EDI/RDI - PEI Core entry point EBP/RBP - Start of BFV Now it is: RAX/EAX Initial value of the EAX register (BIST: Built-in Self Test) DI 'BP': boot-strap processor, or 'AP': application processor RBP/EBP Address of Boot Firmware Volume (BFV) git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9572 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/Sec/FindPeiCore.c | 103 ++++++++++++++++++++++++++++++++++++++++++ OvmfPkg/Sec/Ia32/SecEntry.S | 19 +++----- OvmfPkg/Sec/Ia32/SecEntry.asm | 15 +++--- OvmfPkg/Sec/SecMain.c | 52 ++++++++++++--------- OvmfPkg/Sec/SecMain.h | 7 +++ OvmfPkg/Sec/SecMain.inf | 6 ++- OvmfPkg/Sec/X64/SecEntry.S | 24 ++++------ OvmfPkg/Sec/X64/SecEntry.asm | 21 ++++----- 8 files changed, 173 insertions(+), 74 deletions(-) create mode 100644 OvmfPkg/Sec/FindPeiCore.c (limited to 'OvmfPkg') 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 +#include +#include + +#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 -- cgit v1.2.3