mirror of https://github.com/acidanthera/audk.git
165 lines
4.2 KiB
C
165 lines
4.2 KiB
C
/** @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);
|
|
}
|
|
|