mirror of https://github.com/acidanthera/audk.git
120 lines
3.6 KiB
C
Executable File
120 lines
3.6 KiB
C
Executable File
/** @file
|
|
C Entry point for the SEC. First C code after the reset vector.
|
|
|
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
|
|
|
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 <Ppi/TemporaryRamSupport.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/IoLib.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <ArmEb/ArmEb.h>
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
SecTemporaryRamSupport (
|
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
|
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
|
IN UINTN CopySize
|
|
);
|
|
|
|
VOID
|
|
SecSwitchStack (
|
|
INTN StackDelta
|
|
);
|
|
|
|
TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport};
|
|
|
|
EFI_PEI_PPI_DESCRIPTOR gSecPpiTable[] = {
|
|
{
|
|
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
|
&gEfiTemporaryRamSupportPpiGuid,
|
|
&mSecTemporaryRamSupportPpi
|
|
}
|
|
};
|
|
|
|
|
|
VOID
|
|
EFIAPI
|
|
_ModuleEntryPoint(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
CEntryPoint (
|
|
IN UINTN TempRamBase,
|
|
IN UINTN TempRamSize,
|
|
IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint
|
|
)
|
|
{
|
|
EFI_SEC_PEI_HAND_OFF SecCoreData;
|
|
|
|
// Turn off remapping NOR to 0. We can will now see DRAM in low memory (although it is not yet initialized)
|
|
// note: this makes SEC platform-specific for the EB platform
|
|
MmioOr32 (0x10001000 ,BIT8); //EB_SP810_CTRL_BASE
|
|
|
|
//
|
|
// Bind this information into the SEC hand-off state
|
|
// Note: this must be in sync with the stuff in the asm file
|
|
// Note also: HOBs (pei temp ram) MUST be above stack
|
|
//
|
|
SecCoreData.DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);
|
|
SecCoreData.BootFirmwareVolumeBase = (VOID *)(UINTN)PcdGet32 (PcdEmbeddedFdBaseAddress);
|
|
SecCoreData.BootFirmwareVolumeSize = PcdGet32 (PcdEmbeddedFdSize);
|
|
SecCoreData.TemporaryRamBase = (VOID*)(UINTN)TempRamBase;
|
|
SecCoreData.TemporaryRamSize = TempRamSize;
|
|
SecCoreData.PeiTemporaryRamBase = (VOID *)(UINTN)(SecCoreData.TemporaryRamBase + (SecCoreData.TemporaryRamSize / 2));
|
|
SecCoreData.PeiTemporaryRamSize = SecCoreData.TemporaryRamSize / 2;
|
|
SecCoreData.StackBase = (VOID *)(UINTN)(SecCoreData.TemporaryRamBase);
|
|
SecCoreData.StackSize = SecCoreData.TemporaryRamSize - SecCoreData.PeiTemporaryRamSize;
|
|
|
|
// jump to pei core entry point
|
|
(PeiCoreEntryPoint)(&SecCoreData, (VOID *)&gSecPpiTable);
|
|
}
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
SecTemporaryRamSupport (
|
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
|
|
IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
|
|
IN UINTN CopySize
|
|
)
|
|
{
|
|
//
|
|
// Migrate the whole temporary memory to permenent memory.
|
|
//
|
|
CopyMem (
|
|
(VOID*)(UINTN)PermanentMemoryBase,
|
|
(VOID*)(UINTN)TemporaryMemoryBase,
|
|
CopySize
|
|
);
|
|
|
|
SecSwitchStack((UINTN)(PermanentMemoryBase - TemporaryMemoryBase));
|
|
|
|
//
|
|
// We need *not* fix the return address because currently,
|
|
// The PeiCore is excuted in flash.
|
|
//
|
|
|
|
//
|
|
// Simulate to invalid temporary memory, terminate temporary memory
|
|
//
|
|
//ZeroMem ((VOID*)(UINTN)TemporaryMemoryBase, CopySize);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|