/** @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 <Library/DebugLib.h> | |
#include <Library/PrePiLib.h> | |
#include <Library/PcdLib.h> | |
#include <Library/IoLib.h> | |
#include <Library/ArmLib.h> | |
#include <Library/PeCoffGetEntryPointLib.h> | |
#include <Library/DebugAgentLib.h> | |
#include <Ppi/GuidedSectionExtraction.h> | |
#include <Guid/LzmaDecompress.h> | |
#include <ArmEb/ArmEb.h> | |
#include "LzmaDecompress.h" | |
VOID | |
EFIAPI | |
_ModuleEntryPoint( | |
VOID | |
); | |
CHAR8 * | |
DeCygwinPathIfNeeded ( | |
IN CHAR8 *Name | |
); | |
RETURN_STATUS | |
EFIAPI | |
SerialPortInitialize ( | |
VOID | |
); | |
VOID | |
UartInit ( | |
VOID | |
) | |
{ | |
// SEC phase needs to run library constructors by hand. | |
// This assumes we are linked agains the SerialLib | |
// In non SEC modules the init call is in autogenerated code. | |
SerialPortInitialize (); | |
} | |
VOID | |
TimerInit ( | |
VOID | |
) | |
{ | |
// configure SP810 to use 1MHz clock and disable | |
MmioAndThenOr32 (EB_SP810_CTRL_BASE + SP810_SYS_CTRL_REG, ~SP810_SYS_CTRL_TIMER2_EN, SP810_SYS_CTRL_TIMER2_TIMCLK); | |
// Enable | |
MmioOr32 (EB_SP810_CTRL_BASE + SP810_SYS_CTRL_REG, SP810_SYS_CTRL_TIMER2_EN); | |
// configure timer 2 for one shot operation, 32 bits, no prescaler, and interrupt disabled | |
MmioOr32 (EB_SP804_TIMER2_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_ONESHOT | SP804_TIMER_CTRL_32BIT | SP804_PRESCALE_DIV_1); | |
// preload the timer count register | |
MmioWrite32 (EB_SP804_TIMER2_BASE + SP804_TIMER_LOAD_REG, 1); | |
// enable the timer | |
MmioOr32 (EB_SP804_TIMER2_BASE + SP804_TIMER_CONTROL_REG, SP804_TIMER_CTRL_ENABLE); | |
} | |
VOID | |
InitCache ( | |
IN UINT32 MemoryBase, | |
IN UINT32 MemoryLength | |
); | |
EFI_STATUS | |
EFIAPI | |
ExtractGuidedSectionLibConstructor ( | |
VOID | |
); | |
EFI_STATUS | |
EFIAPI | |
LzmaDecompressLibConstructor ( | |
VOID | |
); | |
VOID | |
CEntryPoint ( | |
IN VOID *MemoryBase, | |
IN UINTN MemorySize, | |
IN VOID *StackBase, | |
IN UINTN StackSize | |
) | |
{ | |
VOID *HobBase; | |
// HOB list is at bottom of stack area | |
// Stack grows from top-to-bottom towards HOB list | |
HobBase = (VOID *)StackBase; | |
CreateHobList (MemoryBase, MemorySize, HobBase, StackBase); | |
// Turn off remapping NOR to 0. We can will now see DRAM in low memory | |
MmioOr32 (0x10001000 ,BIT8); //EB_SP810_CTRL_BASE | |
// Enable program flow prediction, if supported. | |
ArmEnableBranchPrediction (); | |
// Initialize CPU cache | |
InitCache ((UINT32)MemoryBase, (UINT32)MemorySize); | |
// Add memory allocation hob for relocated FD | |
BuildMemoryAllocationHob (FixedPcdGet32(PcdEmbeddedFdBaseAddress), FixedPcdGet32(PcdEmbeddedFdSize), EfiBootServicesData); | |
// Add the FVs to the hob list | |
BuildFvHob (PcdGet32(PcdFlashFvMainBase), PcdGet32(PcdFlashFvMainSize)); | |
// Start talking | |
UartInit (); | |
InitializeDebugAgent (DEBUG_AGENT_INIT_PREMEM_SEC, NULL, NULL); | |
SaveAndSetDebugTimerInterrupt (TRUE); | |
DEBUG ((EFI_D_ERROR, "UART Enabled\n")); | |
// Start up a free running timer so that the timer lib will work | |
TimerInit (); | |
// SEC phase needs to run library constructors by hand. | |
ExtractGuidedSectionLibConstructor (); | |
LzmaDecompressLibConstructor (); | |
// Build HOBs to pass up our version of stuff the DXE Core needs to save space | |
BuildPeCoffLoaderHob (); | |
BuildExtractSectionHob ( | |
&gLzmaCustomDecompressGuid, | |
LzmaGuidedSectionGetInfo, | |
LzmaGuidedSectionExtraction | |
); | |
// Assume the FV that contains the SEC (our code) also contains a compressed FV. | |
DecompressFirstFv (); | |
// Load the DXE Core and transfer control to it | |
LoadDxeCoreFromFv (NULL, 0); | |
// DXE Core should always load and never return | |
ASSERT (FALSE); | |
} | |