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:
oliviermartin
2011-09-22 23:11:03 +00:00
parent 5b1928ffd6
commit 8fc38a3f50
30 changed files with 739 additions and 49 deletions

View File

@@ -17,15 +17,22 @@
//
// The protocols, PPI and GUID defintions for this module
//
#include <Ppi/ArmGlobalVariable.h>
#include <Ppi/MasterBootMode.h>
#include <Ppi/BootInRecoveryMode.h>
#include <Ppi/GuidedSectionExtraction.h>
//
// The Library classes this module consumes
//
#include <Library/PeimEntryPoint.h>
#include <Library/PcdLib.h>
#include <Library/DebugLib.h>
#include <Library/ArmPlatformLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/PeimEntryPoint.h>
#include <Library/PeiServicesLib.h>
#include <Library/PcdLib.h>
#include <Guid/ArmGlobalVariableHob.h>
EFI_STATUS
EFIAPI
@@ -55,6 +62,24 @@ EFI_PEI_PPI_DESCRIPTOR mPpiListRecoveryBootMode = {
NULL
};
VOID
EFIAPI
BuildGlobalVariableHob (
IN EFI_PHYSICAL_ADDRESS GlobalVariableBase,
IN UINT32 GlobalVariableSize
)
{
EFI_STATUS Status;
ARM_HOB_GLOBAL_VARIABLE *Hob;
Status = PeiServicesCreateHob (EFI_HOB_TYPE_GUID_EXTENSION, sizeof (ARM_HOB_GLOBAL_VARIABLE), (VOID**)&Hob);
if (!EFI_ERROR(Status)) {
CopyGuid (&(Hob->Header.Name), &gArmGlobalVariableGuid);
Hob->GlobalVariableBase = GlobalVariableBase;
Hob->GlobalVariableSize = GlobalVariableSize;
}
}
/*++
Routine Description:
@@ -80,11 +105,23 @@ InitializePlatformPeim (
{
EFI_STATUS Status;
UINTN BootMode;
ARM_GLOBAL_VARIABLE_PPI *ArmGlobalVariablePpi;
EFI_PHYSICAL_ADDRESS GlobalVariableBase;
DEBUG ((EFI_D_ERROR, "Platform PEIM Loaded\n"));
PlatformPeim ();
Status = PeiServicesLocatePpi (&gArmGlobalVariablePpiGuid, 0, NULL, (VOID**)&ArmGlobalVariablePpi);
if (!EFI_ERROR(Status)) {
Status = ArmGlobalVariablePpi->GetGlobalVariableMemory (&GlobalVariableBase);
if (!EFI_ERROR(Status)) {
// Declare the Global Variable HOB
BuildGlobalVariableHob (GlobalVariableBase, FixedPcdGet32 (PcdPeiGlobalVariableSize));
}
}
BootMode = ArmPlatformGetBootMode ();
Status = (**PeiServices).SetBootMode (PeiServices, (UINT8) BootMode);
ASSERT_EFI_ERROR (Status);