From 8fc38a3f50915b6b11b48f830f6c7b091dbb35d8 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Thu, 22 Sep 2011 23:11:03 +0000 Subject: [PATCH] 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 --- ArmPkg/ArmPkg.dsc | 3 + ArmPlatformPkg/ArmPlatformPkg.dec | 10 +++ .../Include/Guid/ArmGlobalVariableHob.h | 48 ++++++++++++ .../Library/ArmPlatformGlobalVariableLib.h | 33 ++++++++ .../Include/Ppi/ArmGlobalVariable.h | 55 ++++++++++++++ .../Dxe/DxeArmPlatformGlobalVariableLib.c | 69 +++++++++++++++++ .../Dxe/DxeArmPlatformGlobalVariableLib.inf | 42 ++++++++++ .../Pei/PeiArmPlatformGlobalVariableLib.c | 70 +++++++++++++++++ .../Pei/PeiArmPlatformGlobalVariableLib.inf | 39 ++++++++++ .../PrePi/PrePiArmPlatformGlobalVariableLib.c | 76 +++++++++++++++++++ .../PrePiArmPlatformGlobalVariableLib.inf | 46 +++++++++++ .../Sec/SecArmPlatformGlobalVariableLib.c | 67 ++++++++++++++++ .../Sec/SecArmPlatformGlobalVariableLib.inf | 39 ++++++++++ .../PeiServicesTablePointer.c | 22 ++---- .../PeiServicesTablePointerLib.inf | 9 +-- .../PrePiHobListPointer.c | 19 ++--- .../PrePiHobListPointerLib.inf | 5 +- ArmPlatformPkg/PlatformPei/PlatformPeim.c | 41 +++++++++- ArmPlatformPkg/PlatformPei/PlatformPeim.inf | 6 ++ ArmPlatformPkg/PrePeiCore/MainMPCore.c | 2 - ArmPlatformPkg/PrePeiCore/MainUniCore.c | 2 - ArmPlatformPkg/PrePeiCore/PrePeiCore.c | 25 +++++- ArmPlatformPkg/PrePeiCore/PrePeiCore.h | 9 +++ .../PrePeiCore/PrePeiCoreMPCore.inf | 1 + .../PrePeiCore/PrePeiCoreUniCore.inf | 1 + ArmPlatformPkg/PrePi/PeiMPCore.inf | 4 +- ArmPlatformPkg/PrePi/PeiUniCore.inf | 4 +- ArmPlatformPkg/PrePi/PrePi.c | 36 +++++++++ ArmPlatformPkg/Sec/Sec.inf | 2 + BeagleBoardPkg/BeagleBoardPkg-next.dsc | 1 + 30 files changed, 738 insertions(+), 48 deletions(-) create mode 100644 ArmPlatformPkg/Include/Guid/ArmGlobalVariableHob.h create mode 100644 ArmPlatformPkg/Include/Library/ArmPlatformGlobalVariableLib.h create mode 100644 ArmPlatformPkg/Include/Ppi/ArmGlobalVariable.h create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.c create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.inf create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.c create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.inf create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.c create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.inf create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.c create mode 100644 ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.inf diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 0193621219..5eced599aa 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -124,3 +124,6 @@ ArmPkg/Drivers/PL390Gic/PL390GicSecLib.inf ArmPkg/Filesystem/SemihostFs/SemihostFs.inf + + ArmPkg/Application/LinuxLoader/LinuxAtagLoader.inf + ArmPkg/Application/LinuxLoader/LinuxFdtLoader.inf diff --git a/ArmPlatformPkg/ArmPlatformPkg.dec b/ArmPlatformPkg/ArmPlatformPkg.dec index c5e40105e6..bc5bb32f3b 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dec +++ b/ArmPlatformPkg/ArmPlatformPkg.dec @@ -37,6 +37,13 @@ # gVariableRuntimeDxeFileGuid = { 0xcbd2e4d5, 0x7068, 0x4ff5, { 0xb4, 0x62, 0x98, 0x22, 0xb4, 0xad, 0x8d, 0x60 } } + ## Include/Guid/ArmGlobalVariableHob.h + gArmGlobalVariableGuid = { 0xc3253c90, 0xa24f, 0x4599, { 0xa6, 0x64, 0x1f, 0x88, 0x13, 0x77, 0x8f, 0xc9} } + +[Ppis] + ## Include/Ppi/ArmGlobalVariable.h + gArmGlobalVariablePpiGuid = { 0xab1c1816, 0xd542, 0x4e6f, {0x9b, 0x1e, 0x8e, 0xcd, 0x92, 0x53, 0xe2, 0xe7} } + [PcdsFeatureFlag.common] # Set this PCD to TRUE to map NORFlash at 0x0. FALSE means the DRAM is mapped at 0x0. gArmPlatformTokenSpaceGuid.PcdNorFlashRemapping|FALSE|BOOLEAN|0x00000012 @@ -76,6 +83,9 @@ gArmPlatformTokenSpaceGuid.PcdPeiServicePtrGlobalOffset|0x0|UINT32|0x00000017 gArmPlatformTokenSpaceGuid.PcdHobListPtrGlobalOffset|0x0|UINT32|0x00000018 + # Size to reserve in the primary core stack for SEC Global Variables + gArmPlatformTokenSpaceGuid.PcdSecGlobalVariableSize|0x0|UINT32|0x00000031 + # # ARM Primecells # diff --git a/ArmPlatformPkg/Include/Guid/ArmGlobalVariableHob.h b/ArmPlatformPkg/Include/Guid/ArmGlobalVariableHob.h new file mode 100644 index 0000000000..7414b10050 --- /dev/null +++ b/ArmPlatformPkg/Include/Guid/ArmGlobalVariableHob.h @@ -0,0 +1,48 @@ +/** @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. +* +**/ + +#ifndef __ARM_GLOBAL_VARIABLE_GUID_H__ +#define __ARM_GLOBAL_VARIABLE_GUID_H__ + +#define ARM_HOB_GLOBAL_VARIABLE_GUID \ + { 0xc3253c90, 0xa24f, 0x4599, { 0xa6, 0x64, 0x1f, 0x88, 0x13, 0x77, 0x8f, 0xc9} }; + +extern EFI_GUID gArmGlobalVariableGuid; + +/// +/// Describes all memory ranges used during the HOB producer +/// phase that exist outside the HOB list. This HOB type +/// describes how memory is used, not the physical attributes of memory. +/// +typedef struct { + /// + /// The Guid HOB header. Header.HobType = EFI_HOB_TYPE_GUID_EXTENSION + /// and Header.Name = gArmGlobalVariableGuid + /// + EFI_HOB_GUID_TYPE Header; + + /// + /// The base address of memory allocated by this HOB. Type + /// EFI_PHYSICAL_ADDRESS is defined in AllocatePages() in the UEFI 2.0 + /// specification. + /// + EFI_PHYSICAL_ADDRESS GlobalVariableBase; + + /// + /// The length in bytes of memory allocated by this HOB. + /// + UINT32 GlobalVariableSize; +} ARM_HOB_GLOBAL_VARIABLE; + +#endif diff --git a/ArmPlatformPkg/Include/Library/ArmPlatformGlobalVariableLib.h b/ArmPlatformPkg/Include/Library/ArmPlatformGlobalVariableLib.h new file mode 100644 index 0000000000..c0264c24bd --- /dev/null +++ b/ArmPlatformPkg/Include/Library/ArmPlatformGlobalVariableLib.h @@ -0,0 +1,33 @@ +/** @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. +* +**/ + +#ifndef __ARM_PLATFORM_GLOBAL_VARIABLE_LIB_H_ +#define __ARM_PLATFORM_GLOBAL_VARIABLE_LIB_H_ + +VOID +ArmPlatformGetGlobalVariable ( + IN UINTN VariableOffset, + IN UINTN VariableSize, + OUT VOID* Variable + ); + +VOID +ArmPlatformSetGlobalVariable ( + IN UINTN VariableOffset, + IN UINTN VariableSize, + OUT VOID* Variable + ); + +#endif + diff --git a/ArmPlatformPkg/Include/Ppi/ArmGlobalVariable.h b/ArmPlatformPkg/Include/Ppi/ArmGlobalVariable.h new file mode 100644 index 0000000000..8a29b83465 --- /dev/null +++ b/ArmPlatformPkg/Include/Ppi/ArmGlobalVariable.h @@ -0,0 +1,55 @@ +/** @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. +* +**/ + +#ifndef __ARM_GLOBAL_VARIABLE_H__ +#define __ARM_GLOBAL_VARIABLE_H__ + +#define ARM_GLOBAL_VARIABLE_PPI_GUID \ + { 0xab1c1816, 0xd542, 0x4e6f, {0x9b, 0x1e, 0x8e, 0xcd, 0x92, 0x53, 0xe2, 0xe7} } + + +/** + This service of the EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into + permanent memory. + + @param PeiServices Pointer to the PEI Services Table. + @param TemporaryMemoryBase Source Address in temporary memory from which the SEC or PEIM will copy the + Temporary RAM contents. + @param PermanentMemoryBase Destination Address in permanent memory into which the SEC or PEIM will copy the + Temporary RAM contents. + @param CopySize Amount of memory to migrate from temporary to permanent memory. + + @retval EFI_SUCCESS The data was successfully returned. + @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when + TemporaryMemoryBase > PermanentMemoryBase. + +**/ +typedef +EFI_STATUS +(EFIAPI * ARM_GLOBAL_VARIABLE_GET_MEMORY) ( + OUT EFI_PHYSICAL_ADDRESS *GlobalVariableBase +); + +/// +/// This service abstracts the ability to migrate contents of the platform early memory store. +/// Note: The name EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI is different from the current PI 1.2 spec. +/// This PPI was optional. +/// +typedef struct { + ARM_GLOBAL_VARIABLE_GET_MEMORY GetGlobalVariableMemory; +} ARM_GLOBAL_VARIABLE_PPI; + +extern EFI_GUID gArmGlobalVariablePpiGuid; + +#endif diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.c b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.c new file mode 100644 index 0000000000..aebc912935 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.c @@ -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 +#include +#include +#include +#include +#include + +#include + +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); +} + diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.inf b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.inf new file mode 100644 index 0000000000..a1e9dcf80a --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Dxe/DxeArmPlatformGlobalVariableLib.inf @@ -0,0 +1,42 @@ +#/** @file +# Timer library implementation +# +# +# Copyright (c) 2011, ARM Ltd. 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. +# +#**/ + +[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 + diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.c b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.c new file mode 100644 index 0000000000..57ea0f416f --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.c @@ -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 +#include +#include +#include +#include + +//TODO: RemoveMe +//#include + +// 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)); +} + diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.inf b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.inf new file mode 100644 index 0000000000..a86a119f42 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.inf @@ -0,0 +1,39 @@ +#/** @file +# Timer library implementation +# +# +# Copyright (c) 2011, ARM Ltd. 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. +# +#**/ + +[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 + diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.c b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.c new file mode 100644 index 0000000000..3d050bd150 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.c @@ -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 +#include +#include +#include +#include + +#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); + } +} + diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.inf b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.inf new file mode 100644 index 0000000000..dfe8f2e4b9 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.inf @@ -0,0 +1,46 @@ +#/** @file +# Timer library implementation +# +# +# Copyright (c) 2011, ARM Ltd. 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. +# +#**/ + +[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 + diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.c b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.c new file mode 100644 index 0000000000..6cdc209cbc --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.c @@ -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 +#include +#include +#include +#include + +//TODO: RemoveMe +//#include + +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)); +} + diff --git a/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.inf b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.inf new file mode 100644 index 0000000000..2c351b2b85 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Sec/SecArmPlatformGlobalVariableLib.inf @@ -0,0 +1,39 @@ +#/** @file +# Timer library implementation +# +# +# Copyright (c) 2011, ARM Ltd. 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. +# +#**/ + +[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 + diff --git a/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c b/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c index 0e6755d3aa..cb0041f90d 100644 --- a/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c +++ b/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c @@ -16,6 +16,7 @@ **/ #include +#include #include #include #include @@ -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; } diff --git a/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf b/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf index 5c0811b837..1e8b5e131e 100644 --- a/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf +++ b/ArmPlatformPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf @@ -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 - + diff --git a/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointer.c b/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointer.c index a18a02a9bb..8ec0808b32 100755 --- a/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointer.c +++ b/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointer.c @@ -13,6 +13,7 @@ **/ #include +#include #include #include #include @@ -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; } diff --git a/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf b/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf index c1fa999da5..dece6ff070 100755 --- a/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf +++ b/ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf @@ -29,10 +29,7 @@ EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] + ArmPlatformGlobalVariableLib [FixedPcd.common] gArmPlatformTokenSpaceGuid.PcdHobListPtrGlobalOffset - gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackBase - gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackSize - gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize - \ No newline at end of file diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.c b/ArmPlatformPkg/PlatformPei/PlatformPeim.c index 5921e35bd8..8392ecf6c2 100755 --- a/ArmPlatformPkg/PlatformPei/PlatformPeim.c +++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.c @@ -17,15 +17,22 @@ // // The protocols, PPI and GUID defintions for this module // +#include #include #include +#include // // The Library classes this module consumes // +#include +#include +#include +#include #include +#include #include -#include -#include + +#include 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); diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf index 201c98cd5d..e8d3439217 100755 --- a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf +++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf @@ -47,6 +47,10 @@ [Ppis] gEfiPeiMasterBootModePpiGuid # PPI ALWAYS_PRODUCED gEfiPeiBootInRecoveryModePpiGuid # PPI SOMETIMES_PRODUCED + gArmGlobalVariablePpiGuid + +[Guids] + gArmGlobalVariableGuid [FixedPcd] gArmTokenSpaceGuid.PcdFdBaseAddress @@ -58,6 +62,8 @@ gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize + gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize + [Depex] TRUE diff --git a/ArmPlatformPkg/PrePeiCore/MainMPCore.c b/ArmPlatformPkg/PrePeiCore/MainMPCore.c index 5402161b62..74f4b8e77a 100644 --- a/ArmPlatformPkg/PrePeiCore/MainMPCore.c +++ b/ArmPlatformPkg/PrePeiCore/MainMPCore.c @@ -18,8 +18,6 @@ #include "PrePeiCore.h" -extern EFI_PEI_PPI_DESCRIPTOR *gSecPpiTable; - /* * This is the main function for secondary cores. They loop around until a non Null value is written to * SYS_FLAGS register.The SYS_FLAGS register is platform specific. diff --git a/ArmPlatformPkg/PrePeiCore/MainUniCore.c b/ArmPlatformPkg/PrePeiCore/MainUniCore.c index 9db6fdfbd5..7b32e40114 100644 --- a/ArmPlatformPkg/PrePeiCore/MainUniCore.c +++ b/ArmPlatformPkg/PrePeiCore/MainUniCore.c @@ -16,8 +16,6 @@ #include "PrePeiCore.h" -extern EFI_PEI_PPI_DESCRIPTOR *gSecPpiTable; - VOID EFIAPI SecondaryMain ( diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c index c557efebce..a61d0b8857 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c @@ -13,24 +13,30 @@ * **/ -#include #include -#include #include #include #include #include + +#include #include #include "PrePeiCore.h" EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport}; +ARM_GLOBAL_VARIABLE_PPI mGlobalVariablePpi = { PrePeiCoreGetGlobalVariableMemory }; -EFI_PEI_PPI_DESCRIPTOR gSecPpiTable[] = { +EFI_PEI_PPI_DESCRIPTOR gCommonPpiTable[] = { { - EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, + EFI_PEI_PPI_DESCRIPTOR_PPI, &gEfiTemporaryRamSupportPpiGuid, &mSecTemporaryRamSupportPpi + }, + { + EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, + &gArmGlobalVariablePpiGuid, + &mGlobalVariablePpi } }; @@ -97,6 +103,17 @@ SecTemporaryRamSupport ( SecSwitchStack((UINTN)(PermanentMemoryBase - TemporaryMemoryBase)); +EFI_STATUS +PrePeiCoreGetGlobalVariableMemory ( + OUT EFI_PHYSICAL_ADDRESS *GlobalVariableBase + ) +{ + ASSERT (GlobalVariableBase != NULL); + + *GlobalVariableBase = (UINTN)PcdGet32 (PcdCPUCoresStackBase) + + (UINTN)PcdGet32 (PcdCPUCorePrimaryStackSize) - + (UINTN)PcdGet32 (PcdPeiGlobalVariableSize); + return EFI_SUCCESS; } diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCore.h b/ArmPlatformPkg/PrePeiCore/PrePeiCore.h index 05198b8290..08c5ebd031 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCore.h +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCore.h @@ -15,7 +15,11 @@ #ifndef __PREPEICORE_H_ #define __PREPEICORE_H_ +#include +#include +#include #include +#include #include #include @@ -31,6 +35,11 @@ SecTemporaryRamSupport ( IN UINTN CopySize ); +EFI_STATUS +PrePeiCoreGetGlobalVariableMemory ( + OUT EFI_PHYSICAL_ADDRESS *GlobalVariableBase + ); + VOID SecSwitchStack ( INTN StackDelta diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf b/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf index cd3c3461f8..d019e60369 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf @@ -50,6 +50,7 @@ [Ppis] gEfiTemporaryRamSupportPpiGuid + gArmGlobalVariablePpiGuid [FeaturePcd] gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf index 57318744b4..90582d8922 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf @@ -48,6 +48,7 @@ [Ppis] gEfiTemporaryRamSupportPpiGuid + gArmGlobalVariablePpiGuid [FeaturePcd] gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores diff --git a/ArmPlatformPkg/PrePi/PeiMPCore.inf b/ArmPlatformPkg/PrePi/PeiMPCore.inf index 3b2d723c39..9d580e6cf4 100755 --- a/ArmPlatformPkg/PrePi/PeiMPCore.inf +++ b/ArmPlatformPkg/PrePi/PeiMPCore.inf @@ -56,6 +56,9 @@ PlatformPeiLib MemoryInitPeiLib +[Guids] + gArmGlobalVariableGuid + [FeaturePcd] gEmbeddedTokenSpaceGuid.PcdCacheEnable gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob @@ -75,7 +78,6 @@ gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize - gArmPlatformTokenSpaceGuid.PcdHobListPtrGlobalOffset gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase diff --git a/ArmPlatformPkg/PrePi/PeiUniCore.inf b/ArmPlatformPkg/PrePi/PeiUniCore.inf index 6c13738293..515748aafa 100755 --- a/ArmPlatformPkg/PrePi/PeiUniCore.inf +++ b/ArmPlatformPkg/PrePi/PeiUniCore.inf @@ -54,6 +54,9 @@ PlatformPeiLib MemoryInitPeiLib +[Guids] + gArmGlobalVariableGuid + [FeaturePcd] gEmbeddedTokenSpaceGuid.PcdCacheEnable gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob @@ -72,7 +75,6 @@ gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize - gArmPlatformTokenSpaceGuid.PcdHobListPtrGlobalOffset gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemorySize diff --git a/ArmPlatformPkg/PrePi/PrePi.c b/ArmPlatformPkg/PrePi/PrePi.c index 2ca9c3b8fd..9fd1a27085 100755 --- a/ArmPlatformPkg/PrePi/PrePi.c +++ b/ArmPlatformPkg/PrePi/PrePi.c @@ -26,10 +26,17 @@ #include #include +#include #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 ()); diff --git a/ArmPlatformPkg/Sec/Sec.inf b/ArmPlatformPkg/Sec/Sec.inf index 281306f890..343a7ac4fd 100644 --- a/ArmPlatformPkg/Sec/Sec.inf +++ b/ArmPlatformPkg/Sec/Sec.inf @@ -66,3 +66,5 @@ gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase + + gArmPlatformTokenSpaceGuid.PcdSecGlobalVariableSize diff --git a/BeagleBoardPkg/BeagleBoardPkg-next.dsc b/BeagleBoardPkg/BeagleBoardPkg-next.dsc index fd9cb5b9a6..d28615d72b 100755 --- a/BeagleBoardPkg/BeagleBoardPkg-next.dsc +++ b/BeagleBoardPkg/BeagleBoardPkg-next.dsc @@ -124,6 +124,7 @@ [LibraryClasses.common.SEC] ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf + ArmPlatformGlobalVariableLib|ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf ReportStatusCodeLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf -- 2.39.2