diff options
Diffstat (limited to 'OvmfPkg/Sec/SecMain.c')
-rw-r--r-- | OvmfPkg/Sec/SecMain.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c new file mode 100644 index 0000000000..1dafa05025 --- /dev/null +++ b/OvmfPkg/Sec/SecMain.c @@ -0,0 +1,171 @@ +/** @file + Main SEC phase code. Transitions to PEI. + + 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/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/PeiServicesLib.h> +#include <Ppi/TemporaryRamSupport.h> +#include <Library/PcdLib.h> + +#include "SecMain.h" + +EFI_STATUS +EFIAPI +TemporaryRamMigration ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ); + +STATIC TEMPORARY_RAM_SUPPORT_PPI mTempRamSupportPpi = { + (TEMPORARY_RAM_MIGRATION) TemporaryRamMigration +}; + +STATIC EFI_PEI_PPI_DESCRIPTOR mPrivateDispatchTable[] = { + { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiTemporaryRamSupportPpiGuid, + &mTempRamSupportPpi + }, +}; + + +VOID +InitializeIdtPtr ( + IN VOID* IdtPtr + ) +{ + IA32_DESCRIPTOR IdtDescriptor; + + IdtDescriptor.Base = (UINTN)IdtPtr; + IdtDescriptor.Limit = (UINT16) 0; + AsmWriteIdtr (&IdtDescriptor); +} + +VOID +EFIAPI +SecCoreStartupWithStack ( + IN VOID *BootFirmwareVolumePtr, + IN VOID *SecCoreEntryPoint, + IN VOID *PeiCoreEntryPoint, + IN VOID *TopOfCurrentStack + ) +{ + EFI_SEC_PEI_HAND_OFF *SecCoreData; + UINT8 *BottomOfTempRam; + UINT8 *TopOfTempRam; + UINTN SizeOfTempRam; + VOID *IdtPtr; + + DEBUG ((EFI_D_ERROR, + "SecCoreStartupWithStack(0x%x, 0x%x, 0x%x, 0x%x)\n", + (UINT32)(UINTN)BootFirmwareVolumePtr, + (UINT32)(UINTN)SecCoreEntryPoint, + (UINT32)(UINTN)PeiCoreEntryPoint, + (UINT32)(UINTN)TopOfCurrentStack)); + + + BottomOfTempRam = (UINT8*)(UINTN) INITIAL_TOP_OF_STACK; + SizeOfTempRam = (UINTN) SIZE_64KB; + TopOfTempRam = BottomOfTempRam + SizeOfTempRam; + + // + // |-------------| + // | SecCoreData | 4k + // |-------------| + // | Heap | 28k + // |-------------| + // | Stack | 32k + // |-------------| <---- INITIAL_TOP_OF_STACK + // + + // + // Bind this information into the SEC hand-off state + // + SecCoreData = (EFI_SEC_PEI_HAND_OFF*)((UINTN) TopOfTempRam - SIZE_4KB); + SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF); + + SecCoreData->BootFirmwareVolumeBase = (VOID*)(UINTN) PcdGet32 (PcdOvmfFlashFvRecoveryBase); + SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdOvmfFlashFvRecoverySize); + + SecCoreData->TemporaryRamBase = (VOID*) BottomOfTempRam; + SecCoreData->TemporaryRamSize = SizeOfTempRam; + + SecCoreData->PeiTemporaryRamSize = 28 * SIZE_1KB; + SecCoreData->PeiTemporaryRamBase = (VOID*)((UINTN)SecCoreData - SecCoreData->PeiTemporaryRamSize); + + SecCoreData->StackBase = SecCoreData->TemporaryRamBase; + SecCoreData->StackSize = (UINTN)SecCoreData->PeiTemporaryRamBase - (UINTN)SecCoreData->TemporaryRamBase; + + // + // Initialize the IDT Pointer, since IA32 & X64 architectures + // use it to store the PEI Services pointer. + // + IdtPtr = (VOID*)((UINT8*)SecCoreData + sizeof (*SecCoreData) + sizeof (UINTN)); + 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) + ); + + // + // If we get here, then the PEI Core returned. This is an error + // + ASSERT (FALSE); + CpuDeadLoop (); +} + +EFI_STATUS +EFIAPI +TemporaryRamMigration ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, + IN UINTN CopySize + ) +{ + DEBUG ((EFI_D_ERROR, "TemporaryRamMigration(0x%x, 0x%x, 0x%x)\n", (UINTN)TemporaryMemoryBase, (UINTN)PermanentMemoryBase, 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 ( + (UINTN) TemporaryMemoryBase, + (UINTN) PermanentMemoryBase, + CopySize + ); + + return EFI_SUCCESS; +} + |