ArmPlatformPkg: Introduce ArmPlatformGlobalVariableLib
This library hides where the 'XIP' Global Variable are located in the memory. It is expected the Sec/PrePi modules define the Global Variable area through the GlobalVariable HOB. The ArmPlatformGlobalVariableLib library allows access to global variables by their offsets in this region. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12420 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -26,10 +26,17 @@
|
||||
|
||||
#include <Ppi/GuidedSectionExtraction.h>
|
||||
#include <Guid/LzmaDecompress.h>
|
||||
#include <Guid/ArmGlobalVariableHob.h>
|
||||
|
||||
#include "PrePi.h"
|
||||
#include "LzmaDecompress.h"
|
||||
|
||||
#define IS_XIP() ((FixedPcdGet32 (PcdFdBaseAddress) > (FixedPcdGet32 (PcdSystemMemoryBase) + FixedPcdGet32 (PcdSystemMemorySize))) || \
|
||||
((FixedPcdGet32 (PcdFdBaseAddress) + FixedPcdGet32 (PcdFdSize)) < FixedPcdGet32 (PcdSystemMemoryBase)))
|
||||
|
||||
// Not used when PrePi in run in XIP mode
|
||||
UINTN mGlobalVariableBase = 0;
|
||||
|
||||
VOID
|
||||
PrePiCommonExceptionEntry (
|
||||
IN UINT32 Entry,
|
||||
@@ -48,6 +55,23 @@ LzmaDecompressLibConstructor (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
BuildGlobalVariableHob (
|
||||
IN EFI_PHYSICAL_ADDRESS GlobalVariableBase,
|
||||
IN UINT32 GlobalVariableSize
|
||||
)
|
||||
{
|
||||
ARM_HOB_GLOBAL_VARIABLE *Hob;
|
||||
|
||||
Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, sizeof (ARM_HOB_GLOBAL_VARIABLE));
|
||||
ASSERT(Hob != NULL);
|
||||
|
||||
CopyGuid (&(Hob->Header.Name), &gArmGlobalVariableGuid);
|
||||
Hob->GlobalVariableBase = GlobalVariableBase;
|
||||
Hob->GlobalVariableSize = GlobalVariableSize;
|
||||
}
|
||||
|
||||
VOID
|
||||
PrePiMain (
|
||||
IN UINTN UefiMemoryBase,
|
||||
@@ -62,6 +86,11 @@ PrePiMain (
|
||||
UINTN CharCount;
|
||||
UINTN StacksSize;
|
||||
|
||||
// If ensure the FD is either part of the System Memory or totally outside of the System Memory (XIP)
|
||||
ASSERT (IS_XIP() ||
|
||||
((FixedPcdGet32 (PcdFdBaseAddress) >= FixedPcdGet32 (PcdSystemMemoryBase)) &&
|
||||
((FixedPcdGet32 (PcdFdBaseAddress) + FixedPcdGet32 (PcdFdSize)) <= (FixedPcdGet32 (PcdSystemMemoryBase) + FixedPcdGet32 (PcdSystemMemorySize)))));
|
||||
|
||||
// Enable program flow prediction, if supported.
|
||||
ArmEnableBranchPrediction ();
|
||||
|
||||
@@ -77,6 +106,10 @@ PrePiMain (
|
||||
// Initialize the Debug Agent for Source Level Debugging
|
||||
InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);
|
||||
SaveAndSetDebugTimerInterrupt (TRUE);
|
||||
|
||||
if (!IS_XIP()) {
|
||||
mGlobalVariableBase = GlobalVariableBase;
|
||||
}
|
||||
|
||||
// Declare the PI/UEFI memory region
|
||||
HobList = HobConstructor (
|
||||
@@ -95,6 +128,9 @@ PrePiMain (
|
||||
StacksSize = PcdGet32 (PcdCPUCorePrimaryStackSize) + (FixedPcdGet32(PcdClusterCount) * 4 * FixedPcdGet32(PcdCPUCoreSecondaryStackSize));
|
||||
BuildStackHob (StacksBase, StacksSize);
|
||||
|
||||
// Declare the Global Variable HOB
|
||||
BuildGlobalVariableHob (GlobalVariableBase, FixedPcdGet32 (PcdPeiGlobalVariableSize));
|
||||
|
||||
// Set the Boot Mode
|
||||
SetBootMode (ArmPlatformGetBootMode ());
|
||||
|
||||
|
Reference in New Issue
Block a user