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
This commit is contained in:
jljusten 2009-12-16 23:29:17 +00:00
parent 7a55c43b07
commit 0913fadc1a
8 changed files with 173 additions and 74 deletions

103
OvmfPkg/Sec/FindPeiCore.c Normal file
View File

@ -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;
}
}
}
}
}

View File

@ -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
# 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
#
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)

View File

@ -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

View File

@ -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,13 +78,11 @@ 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;
@ -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 ();

View File

@ -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_

View File

@ -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

View File

@ -1,5 +1,4 @@
# TITLE SecEntry.asm
#------------------------------------------------------------------------------
#*
#* Copyright 2006 - 2009, Intel Corporation
@ -23,16 +22,15 @@
#EXTERN ASM_PFX(SecCoreStartupWithStack)
#
# 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
#
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 %rsp, %rdx
subq $0x20, %rsp
call ASM_PFX(SecCoreStartupWithStack)

View File

@ -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