mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-07 19:45:07 +02:00
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:
parent
5b1928ffd6
commit
8fc38a3f50
@ -124,3 +124,6 @@
|
||||
ArmPkg/Drivers/PL390Gic/PL390GicSecLib.inf
|
||||
|
||||
ArmPkg/Filesystem/SemihostFs/SemihostFs.inf
|
||||
|
||||
ArmPkg/Application/LinuxLoader/LinuxAtagLoader.inf
|
||||
ArmPkg/Application/LinuxLoader/LinuxFdtLoader.inf
|
||||
|
@ -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
|
||||
#
|
||||
|
48
ArmPlatformPkg/Include/Guid/ArmGlobalVariableHob.h
Normal file
48
ArmPlatformPkg/Include/Guid/ArmGlobalVariableHob.h
Normal file
@ -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
|
@ -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
|
||||
|
55
ArmPlatformPkg/Include/Ppi/ArmGlobalVariable.h
Normal file
55
ArmPlatformPkg/Include/Ppi/ArmGlobalVariable.h
Normal file
@ -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
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -29,10 +29,7 @@
|
||||
EmbeddedPkg/EmbeddedPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
ArmPlatformGlobalVariableLib
|
||||
|
||||
[FixedPcd.common]
|
||||
gArmPlatformTokenSpaceGuid.PcdHobListPtrGlobalOffset
|
||||
gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackBase
|
||||
gArmPlatformTokenSpaceGuid.PcdCPUCoresNonSecStackSize
|
||||
gArmPlatformTokenSpaceGuid.PcdPeiGlobalVariableSize
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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.
|
||||
|
@ -16,8 +16,6 @@
|
||||
|
||||
#include "PrePeiCore.h"
|
||||
|
||||
extern EFI_PEI_PPI_DESCRIPTOR *gSecPpiTable;
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
SecondaryMain (
|
||||
|
@ -13,24 +13,30 @@
|
||||
*
|
||||
**/
|
||||
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugAgentLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/ArmLib.h>
|
||||
#include <Library/SerialPortLib.h>
|
||||
|
||||
#include <Ppi/ArmGlobalVariable.h>
|
||||
#include <Chipset/ArmV7.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,11 @@
|
||||
#ifndef __PREPEICORE_H_
|
||||
#define __PREPEICORE_H_
|
||||
|
||||
#include <Library/ArmLib.h>
|
||||
#include <Library/ArmPlatformLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
#include <PiPei.h>
|
||||
@ -31,6 +35,11 @@ SecTemporaryRamSupport (
|
||||
IN UINTN CopySize
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
PrePeiCoreGetGlobalVariableMemory (
|
||||
OUT EFI_PHYSICAL_ADDRESS *GlobalVariableBase
|
||||
);
|
||||
|
||||
VOID
|
||||
SecSwitchStack (
|
||||
INTN StackDelta
|
||||
|
@ -50,6 +50,7 @@
|
||||
|
||||
[Ppis]
|
||||
gEfiTemporaryRamSupportPpiGuid
|
||||
gArmGlobalVariablePpiGuid
|
||||
|
||||
[FeaturePcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores
|
||||
|
@ -48,6 +48,7 @@
|
||||
|
||||
[Ppis]
|
||||
gEfiTemporaryRamSupportPpiGuid
|
||||
gArmGlobalVariablePpiGuid
|
||||
|
||||
[FeaturePcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 ());
|
||||
|
||||
|
@ -66,3 +66,5 @@
|
||||
|
||||
gArmTokenSpaceGuid.PcdGicDistributorBase
|
||||
gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
|
||||
|
||||
gArmPlatformTokenSpaceGuid.PcdSecGlobalVariableSize
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user