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

@@ -0,0 +1,69 @@
/** @file
*
* Copyright (c) 2011, ARM Limited. All rights reserved.
*
* 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 <PiDxe.h>
#include <Library/ArmPlatformGlobalVariableLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/HobLib.h>
#include <Library/PcdLib.h>
#include <Guid/ArmGlobalVariableHob.h>
UINTN mGlobalVariableBase = 0;
RETURN_STATUS
EFIAPI
ArmPlatformGlobalVariableConstructor (
VOID
)
{
ARM_HOB_GLOBAL_VARIABLE *Hob;
Hob = GetFirstGuidHob (&gArmGlobalVariableGuid);
ASSERT (Hob != NULL);
mGlobalVariableBase = Hob->GlobalVariableBase;
return EFI_SUCCESS;
}
VOID
ArmPlatformGetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
if (mGlobalVariableBase == 0) {
ArmPlatformGlobalVariableConstructor ();
}
CopyMem (Variable, (VOID*)(mGlobalVariableBase + VariableOffset), VariableSize);
}
VOID
ArmPlatformSetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
if (mGlobalVariableBase == 0) {
ArmPlatformGlobalVariableConstructor ();
}
CopyMem ((VOID*)(mGlobalVariableBase + VariableOffset), Variable, VariableSize);
}

View File

@@ -0,0 +1,42 @@
#/** @file
# Timer library implementation
#
#
# Copyright (c) 2011, ARM Ltd. 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.
#
#**/
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = DxeArmPlatformGlobalVariableLib
FILE_GUID = 53fa3cc3-23b7-4ec2-9bfa-30257d7e1135
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
CONSTRUCTOR = ArmPlatformGlobalVariableConstructor
[Sources.common]
DxeArmPlatformGlobalVariableLib.c
[Packages]
MdePkg/MdePkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
[LibraryClasses]
BaseLib
HobLib
[Guids]
gArmGlobalVariableGuid
[FixedPcd]
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize

View File

@@ -0,0 +1,70 @@
/** @file
*
* Copyright (c) 2011, ARM Limited. All rights reserved.
*
* 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 <Uefi.h>
#include <Library/ArmPlatformGlobalVariableLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/PcdLib.h>
//TODO: RemoveMe
//#include <Library/DebugLib.h>
// Declared by ArmPlatformPkg/PrePi Module
extern UINTN mGlobalVariableBase;
VOID
ArmPlatformGetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
UINTN GlobalVariableBase;
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize) + VariableOffset;
if (VariableSize == 4) {
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
} else if (VariableSize == 8) {
*(UINT32*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
} else {
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
}
//DEBUG((EFI_D_ERROR,"++ GET Offset[%d] = 0x%x\n",VariableOffset,*(UINTN*)Variable));
}
VOID
ArmPlatformSetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
UINTN GlobalVariableBase;
GlobalVariableBase = PcdGet32 (PcdCPUCoresStackBase) + PcdGet32 (PcdCPUCorePrimaryStackSize) - PcdGet32 (PcdPeiGlobalVariableSize) + VariableOffset;
if (VariableSize == 4) {
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
} else if (VariableSize == 8) {
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
} else {
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
}
//DEBUG((EFI_D_ERROR,"++ SET Offset[%d] = 0x%x\n",VariableOffset,*(UINTN*)Variable));
}

View File

@@ -0,0 +1,39 @@
#/** @file
# Timer library implementation
#
#
# Copyright (c) 2011, ARM Ltd. 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.
#
#**/
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = PeiArmPlatformGlobalVariableLib
FILE_GUID = 3e03daf2-b7b4-45f7-80b2-12aba043391f
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
[Sources.common]
PeiArmPlatformGlobalVariableLib.c
[Packages]
MdePkg/MdePkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
[LibraryClasses]
BaseLib
PcdLib
[FixedPcd]
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize

View File

@@ -0,0 +1,76 @@
/** @file
*
* Copyright (c) 2011, ARM Limited. All rights reserved.
*
* 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 <Uefi.h>
#include <Library/ArmPlatformGlobalVariableLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/PcdLib.h>
#define IS_XIP() ((PcdGet32 (PcdFdBaseAddress) > (PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize))) || \
((PcdGet32 (PcdFdBaseAddress) + PcdGet32 (PcdFdSize)) < PcdGet32 (PcdSystemMemoryBase)))
// Declared by ArmPlatformPkg/PrePi Module
extern UINTN mGlobalVariableBase;
VOID
ArmPlatformGetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
UINTN GlobalVariableBase;
if (IS_XIP()) {
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - PcdGet32 (PcdPeiGlobalVariableSize);
} else {
GlobalVariableBase = mGlobalVariableBase;
}
if (VariableSize == 4) {
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
} else if (VariableSize == 8) {
*(UINT32*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
} else {
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
}
}
VOID
ArmPlatformSetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
UINTN GlobalVariableBase;
if (IS_XIP()) {
// In Case of XIP, we expect the Primary Stack at the top of the System Memory
GlobalVariableBase = PcdGet32 (PcdSystemMemoryBase) + PcdGet32 (PcdSystemMemorySize) - PcdGet32 (PcdPeiGlobalVariableSize);
} else {
GlobalVariableBase = mGlobalVariableBase;
}
if (VariableSize == 4) {
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
} else if (VariableSize == 8) {
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
} else {
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
}
}

View File

@@ -0,0 +1,46 @@
#/** @file
# Timer library implementation
#
#
# Copyright (c) 2011, ARM Ltd. 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.
#
#**/
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = PrePiArmPlatformGlobalVariableLib
FILE_GUID = 44d59470-e5e6-4811-af00-33bb573a804b
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
[Sources.common]
PrePiArmPlatformGlobalVariableLib.c
[Packages]
MdePkg/MdePkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
ArmPkg/ArmPkg.dec
[LibraryClasses]
BaseLib
PcdLib
[FixedPcd]
gArmTokenSpaceGuid.PcdFdBaseAddress
gArmTokenSpaceGuid.PcdFdSize
gArmTokenSpaceGuid.PcdSystemMemoryBase
gArmTokenSpaceGuid.PcdSystemMemorySize
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize

View File

@@ -0,0 +1,67 @@
/** @file
*
* Copyright (c) 2011, ARM Limited. All rights reserved.
*
* 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 <Uefi.h>
#include <Library/ArmPlatformGlobalVariableLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/PcdLib.h>
//TODO: RemoveMe
//#include <Library/DebugLib.h>
VOID
ArmPlatformGetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
UINTN GlobalVariableBase;
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize) + VariableOffset;
if (VariableSize == 4) {
*(UINT32*)Variable = ReadUnaligned32 ((CONST UINT32*)(GlobalVariableBase + VariableOffset));
} else if (VariableSize == 8) {
*(UINT32*)Variable = ReadUnaligned64 ((CONST UINT64*)(GlobalVariableBase + VariableOffset));
} else {
CopyMem (Variable, (VOID*)(GlobalVariableBase + VariableOffset), VariableSize);
}
//DEBUG((EFI_D_ERROR,"++ GET Offset[%d] = 0x%x\n",VariableOffset,*(UINTN*)Variable));
}
VOID
ArmPlatformSetGlobalVariable (
IN UINTN VariableOffset,
IN UINTN VariableSize,
OUT VOID* Variable
)
{
UINTN GlobalVariableBase;
GlobalVariableBase = PcdGet32 (PcdCPUCoresSecStackBase) + PcdGet32 (PcdCPUCoreSecPrimaryStackSize) - PcdGet32 (PcdSecGlobalVariableSize) + VariableOffset;
if (VariableSize == 4) {
WriteUnaligned32 ((UINT32*)(GlobalVariableBase + VariableOffset), *(UINT32*)Variable);
} else if (VariableSize == 8) {
WriteUnaligned64 ((UINT64*)(GlobalVariableBase + VariableOffset), *(UINT64*)Variable);
} else {
CopyMem ((VOID*)(GlobalVariableBase + VariableOffset), Variable, VariableSize);
}
//DEBUG((EFI_D_ERROR,"++ SET Offset[%d] = 0x%x\n",VariableOffset,*(UINTN*)Variable));
}

View File

@@ -0,0 +1,39 @@
#/** @file
# Timer library implementation
#
#
# Copyright (c) 2011, ARM Ltd. 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.
#
#**/
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = SecArmPlatformGlobalVariableLib
FILE_GUID = e01f4944-df86-488b-b89b-79e7a53a3a5d
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = ArmPlatformGlobalVariableLib
[Sources.common]
SecArmPlatformGlobalVariableLib.c
[Packages]
MdePkg/MdePkg.dec
ArmPlatformPkg/ArmPlatformPkg.dec
[LibraryClasses]
BaseLib
PcdLib
[FixedPcd]
gArmPlatformTokenSpaceGuid.PcdCPUCoresSecStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCoreSecPrimaryStackSize
gArmPlatformTokenSpaceGuid.PcdSecGlobalVariableSize

View File

@@ -16,6 +16,7 @@
**/
#include <PiPei.h>
#include <Library/ArmPlatformGlobalVariableLib.h>
#include <Library/PeiServicesTablePointerLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
@@ -33,17 +34,12 @@
VOID
EFIAPI
SetPeiServicesTablePointer (
IN CONST EFI_PEI_SERVICES ** PeiServicesTablePointer
IN CONST EFI_PEI_SERVICES **PeiServicesTablePointer
)
{
UINTN *PeiPtrLoc;
ASSERT (PeiServicesTablePointer != NULL);
PeiPtrLoc = (UINTN *)(UINTN)(PcdGet32 (PcdCPUCoresNonSecStackBase) +
(PcdGet32 (PcdCPUCoresNonSecStackSize) / 2) -
PcdGet32 (PcdPeiGlobalVariableSize) +
PcdGet32 (PcdPeiServicePtrGlobalOffset));
*PeiPtrLoc = (UINTN)PeiServicesTablePointer;
ArmPlatformSetGlobalVariable (PcdGet32 (PcdPeiServicePtrGlobalOffset), sizeof(EFI_PEI_SERVICES **), &PeiServicesTablePointer);
}
/**
@@ -58,19 +54,17 @@ SetPeiServicesTablePointer (
@return The pointer to PeiServices.
**/
CONST EFI_PEI_SERVICES **
CONST EFI_PEI_SERVICES**
EFIAPI
GetPeiServicesTablePointer (
VOID
)
{
UINTN *PeiPtrLoc;
EFI_PEI_SERVICES **PeiServicesTablePointer;
PeiPtrLoc = (UINTN *)(UINTN)(PcdGet32 (PcdCPUCoresNonSecStackBase) +
(PcdGet32 (PcdCPUCoresNonSecStackSize) / 2) -
PcdGet32 (PcdPeiGlobalVariableSize) +
PcdGet32 (PcdPeiServicePtrGlobalOffset));
return (CONST EFI_PEI_SERVICES **)*PeiPtrLoc;
ArmPlatformGetGlobalVariable (PcdGet32 (PcdPeiServicePtrGlobalOffset), sizeof(EFI_PEI_SERVICES **), &PeiServicesTablePointer);
return (CONST EFI_PEI_SERVICES**)PeiServicesTablePointer;
}

View File

@@ -21,7 +21,7 @@
INF_VERSION = 0x00010005
BASE_NAME = PeiServicesTablePointerLib
FILE_GUID = 1c747f6b-0a58-49ae-8ea3-0327a4fa10e3
MODULE_TYPE = PEIM
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = PeiServicesTablePointerLib|PEIM PEI_CORE SEC
@@ -37,11 +37,8 @@
ArmPlatformPkg/ArmPlatformPkg.dec
[LibraryClasses]
DebugLib
ArmPlatformGlobalVariableLib
[Pcd]
gArmPlatformTokenSpaceGuid.PcdPeiServicePtrGlobalOffset
gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackSize
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize

View File

@@ -13,6 +13,7 @@
**/
#include <PiPei.h>
#include <Library/ArmPlatformGlobalVariableLib.h>
#include <Library/PrePiHobListPointerLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
@@ -31,10 +32,11 @@ PrePeiGetHobList (
VOID
)
{
return (VOID *)*(UINTN*)(PcdGet32 (PcdCPUCoresNonSecStackBase) +
PcdGet32 (PcdCPUCoresNonSecStackSize) -
PcdGet32 (PcdPeiGlobalVariableSize) +
PcdGet32 (PcdHobListPtrGlobalOffset));
VOID* HobList;
ArmPlatformGetGlobalVariable (PcdGet32 (PcdHobListPtrGlobalOffset), sizeof(VOID*), &HobList);
return HobList;
}
@@ -51,14 +53,7 @@ PrePeiSetHobList (
IN VOID *HobList
)
{
UINTN* HobListPtr;
HobListPtr = (UINTN*)(PcdGet32 (PcdCPUCoresNonSecStackBase) +
PcdGet32 (PcdCPUCoresNonSecStackSize) -
PcdGet32 (PcdPeiGlobalVariableSize) +
PcdGet32 (PcdHobListPtrGlobalOffset));
*HobListPtr = (UINTN)HobList;
ArmPlatformSetGlobalVariable (PcdGet32 (PcdHobListPtrGlobalOffset), sizeof(VOID*), &HobList);
return EFI_SUCCESS;
}

View File

@@ -29,10 +29,7 @@
EmbeddedPkg/EmbeddedPkg.dec
[LibraryClasses]
ArmPlatformGlobalVariableLib
[FixedPcd.common]
gArmPlatformTokenSpaceGuid.PcdHobListPtrGlobalOffset
gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackSize
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize