ArmPlatformPkg: Added Aarch64 support
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Harry Liebel <Harry.Liebel@arm.com> Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14489 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
committed by
oliviermartin
parent
93deac7e25
commit
1bc8326695
@@ -0,0 +1,65 @@
|
||||
//
|
||||
// Copyright (c) 2012-2013, 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 <AsmMacroIoLibV8.h>
|
||||
#include <Library/ArmLib.h>
|
||||
|
||||
.text
|
||||
.align 2
|
||||
|
||||
GCC_ASM_EXPORT(ArmPlatformPeiBootAction)
|
||||
GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
|
||||
GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)
|
||||
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
|
||||
|
||||
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
|
||||
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
|
||||
|
||||
ASM_PFX(ArmPlatformPeiBootAction):
|
||||
ret
|
||||
|
||||
//UINTN
|
||||
//ArmPlatformGetCorePosition (
|
||||
// IN UINTN MpId
|
||||
// );
|
||||
// With this function: CorePos = (ClusterId * 4) + CoreId
|
||||
ASM_PFX(ArmPlatformGetCorePosition):
|
||||
and x1, x0, #ARM_CORE_MASK
|
||||
and x0, x0, #ARM_CLUSTER_MASK
|
||||
add x0, x1, x0, LSR #6
|
||||
ret
|
||||
|
||||
//UINTN
|
||||
//ArmPlatformGetPrimaryCoreMpId (
|
||||
// VOID
|
||||
// );
|
||||
ASM_PFX(ArmPlatformGetPrimaryCoreMpId):
|
||||
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, x0)
|
||||
ldrh w0, [x0]
|
||||
ret
|
||||
|
||||
//UINTN
|
||||
//ArmPlatformIsPrimaryCore (
|
||||
// IN UINTN MpId
|
||||
// );
|
||||
ASM_PFX(ArmPlatformIsPrimaryCore):
|
||||
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, x1)
|
||||
ldrh w1, [x1]
|
||||
and x0, x0, x1
|
||||
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, x1)
|
||||
ldrh w1, [x1]
|
||||
cmp w0, w1
|
||||
mov x0, #1
|
||||
mov x1, #0
|
||||
csel x0, x0, x1, eq
|
||||
ret
|
@@ -37,6 +37,9 @@
|
||||
Arm/ArmPlatformHelper.S | GCC
|
||||
Arm/ArmPlatformHelper.asm | RVCT
|
||||
|
||||
[Sources.AArch64]
|
||||
AArch64/ArmPlatformHelper.S | GCC
|
||||
|
||||
[FixedPcd]
|
||||
gArmTokenSpaceGuid.PcdSystemMemoryBase
|
||||
gArmTokenSpaceGuid.PcdSystemMemorySize
|
||||
|
@@ -36,6 +36,9 @@
|
||||
Arm/ArmPlatformHelper.S | GCC
|
||||
Arm/ArmPlatformHelper.asm | RVCT
|
||||
|
||||
[Sources.AArch64]
|
||||
AArch64/ArmPlatformHelper.S | GCC
|
||||
|
||||
[FixedPcd]
|
||||
gArmTokenSpaceGuid.PcdSystemMemoryBase
|
||||
gArmTokenSpaceGuid.PcdSystemMemorySize
|
||||
|
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// Copyright (c) 2011 - 2013, 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 <Base.h>
|
||||
#include <AutoGen.h>
|
||||
|
||||
.text
|
||||
.align 3
|
||||
|
||||
GCC_ASM_EXPORT(ArmPlatformSecBootAction)
|
||||
GCC_ASM_EXPORT(ArmPlatformSecBootMemoryInit)
|
||||
GCC_ASM_EXPORT(ArmSecMpCoreSecondariesWrite)
|
||||
GCC_ASM_EXPORT(ArmSecMpCoreSecondariesRead)
|
||||
|
||||
/**
|
||||
Call at the beginning of the platform boot up
|
||||
|
||||
This function allows the firmware platform to do extra actions at the early
|
||||
stage of the platform power up.
|
||||
|
||||
Note: This function must be implemented in assembler as there is no stack set up yet
|
||||
|
||||
**/
|
||||
ASM_PFX(ArmPlatformSecBootAction):
|
||||
ret
|
||||
|
||||
/**
|
||||
Initialize the memory where the initial stacks will reside
|
||||
|
||||
This memory can contain the initial stacks (Secure and Secure Monitor stacks).
|
||||
In some platform, this region is already initialized and the implementation of this function can
|
||||
do nothing. This memory can also represent the Secure RAM.
|
||||
This function is called before the satck has been set up. Its implementation must ensure the stack
|
||||
pointer is not used (probably required to use assembly language)
|
||||
|
||||
**/
|
||||
ASM_PFX(ArmPlatformSecBootMemoryInit):
|
||||
// The SMC does not need to be initialized for RTSM
|
||||
ret
|
||||
|
||||
/* Write the flag register used to start Secondary cores */
|
||||
ASM_PFX(ArmSecMpCoreSecondariesWrite):
|
||||
// Write to the CPU Mailbox
|
||||
ret
|
||||
|
||||
|
||||
/* Read the flag register used to start Secondary cores */
|
||||
ASM_PFX(ArmSecMpCoreSecondariesRead):
|
||||
// Return the value from the CPU Mailbox
|
||||
mov x0, #0
|
||||
ret
|
@@ -36,6 +36,10 @@
|
||||
Arm/ArmPlatformLibNullBoot.asm | RVCT
|
||||
Arm/ArmPlatformLibNullBoot.S | GCC
|
||||
|
||||
[Sources.AARCH64]
|
||||
AArch64/ArmPlatformLibNullBoot.S | GCC
|
||||
|
||||
|
||||
[FixedPcd]
|
||||
gArmTokenSpaceGuid.PcdFvBaseAddress
|
||||
|
||||
|
@@ -0,0 +1,129 @@
|
||||
//
|
||||
// Copyright (c) 2012-2013, 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 <AsmMacroIoLib.h>
|
||||
#include <Base.h>
|
||||
#include <AutoGen.h>
|
||||
|
||||
.text
|
||||
.align 3
|
||||
|
||||
GCC_ASM_EXPORT(ArmPlatformStackSet)
|
||||
GCC_ASM_EXPORT(ArmPlatformStackSetPrimary)
|
||||
GCC_ASM_EXPORT(ArmPlatformStackSetSecondary)
|
||||
|
||||
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
|
||||
GCC_ASM_IMPORT(ArmPlatformGetCorePosition)
|
||||
GCC_ASM_IMPORT(ArmPlatformGetPrimaryCoreMpId)
|
||||
|
||||
GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount)
|
||||
|
||||
//VOID
|
||||
//ArmPlatformStackSet (
|
||||
// IN UINTN StackBase,
|
||||
// IN UINTN MpId,
|
||||
// IN UINTN PrimaryStackSize,
|
||||
// IN UINTN SecondaryStackSize
|
||||
// );
|
||||
ASM_PFX(ArmPlatformStackSet):
|
||||
// Save parameters
|
||||
mov x6, x3
|
||||
mov x5, x2
|
||||
mov x4, x1
|
||||
mov x3, x0
|
||||
|
||||
// Save the Link register
|
||||
mov x7, x30
|
||||
|
||||
// Identify Stack
|
||||
mov x0, x1
|
||||
bl ASM_PFX(ArmPlatformIsPrimaryCore)
|
||||
cmp x0, #1
|
||||
|
||||
// Restore parameters
|
||||
mov x0, x3
|
||||
mov x1, x4
|
||||
mov x2, x5
|
||||
mov x3, x6
|
||||
|
||||
// Restore the Link register
|
||||
mov x30, x7
|
||||
|
||||
// Should be ASM_PFX(ArmPlatformStackSetPrimary) but generate linker error 'unsupported ELF EM_AARCH64'
|
||||
b.eq ArmPlatformStackSetPrimaryL
|
||||
// Should be ASM_PFX(ArmPlatformStackSetSecondary) but generate linker error 'unsupported ELF EM_AARCH64'
|
||||
b.ne ArmPlatformStackSetSecondaryL
|
||||
|
||||
//VOID
|
||||
//ArmPlatformStackSetPrimary (
|
||||
// IN UINTN StackBase,
|
||||
// IN UINTN MpId,
|
||||
// IN UINTN PrimaryStackSize,
|
||||
// IN UINTN SecondaryStackSize
|
||||
// );
|
||||
ArmPlatformStackSetPrimaryL:
|
||||
ASM_PFX(ArmPlatformStackSetPrimary):
|
||||
// Save the Link register
|
||||
mov x4, x30
|
||||
|
||||
// Add stack of primary stack to StackBase
|
||||
add x0, x0, x2
|
||||
|
||||
// Compute SecondaryCoresCount * SecondaryCoreStackSize
|
||||
LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, x1)
|
||||
ldr w1, [x1]
|
||||
sub x1, x1, #1
|
||||
mul x3, x3, x1
|
||||
|
||||
// Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
|
||||
add sp, x0, x3
|
||||
|
||||
br x4
|
||||
|
||||
//VOID
|
||||
//ArmPlatformStackSetSecondary (
|
||||
// IN UINTN StackBase,
|
||||
// IN UINTN MpId,
|
||||
// IN UINTN PrimaryStackSize,
|
||||
// IN UINTN SecondaryStackSize
|
||||
// );
|
||||
ArmPlatformStackSetSecondaryL:
|
||||
ASM_PFX(ArmPlatformStackSetSecondary):
|
||||
// Save the Link register
|
||||
mov x4, x30
|
||||
mov sp, x0
|
||||
|
||||
// Get Core Position
|
||||
mov x0, x1
|
||||
bl ASM_PFX(ArmPlatformGetCorePosition)
|
||||
mov x5, x0
|
||||
|
||||
// Get Primary Core Position
|
||||
bl ASM_PFX(ArmPlatformGetPrimaryCoreMpId)
|
||||
bl ASM_PFX(ArmPlatformGetCorePosition)
|
||||
|
||||
// Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
|
||||
cmp x5, x0
|
||||
b.ls 1f
|
||||
// Decrement the position if after the primary core
|
||||
sub x5, x5, #1
|
||||
1:
|
||||
add x5, x5, #1
|
||||
|
||||
// Compute top of the secondary stack
|
||||
mul x3, x3, x5
|
||||
|
||||
// Set stack
|
||||
add sp, sp, x3
|
||||
|
||||
br x4
|
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// Copyright (c) 2012, ARM Limited. All rights reserved.
|
||||
// Copyright (c) 2012-2013, 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
|
||||
@@ -38,12 +38,12 @@ ASM_PFX(ArmPlatformStackSet):
|
||||
// Identify Stack
|
||||
// Mask for ClusterId|CoreId
|
||||
LoadConstantToReg (0xFFFF, r4)
|
||||
and r1, r1, r4
|
||||
and r1, r1, r4
|
||||
// Is it the Primary Core ?
|
||||
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r4)
|
||||
ldr r4, [r4]
|
||||
ldr r4, [r4]
|
||||
cmp r1, r4
|
||||
beq ASM_PFX(ArmPlatformStackSetPrimary)
|
||||
beq ASM_PFX(ArmPlatformStackSetPrimary)
|
||||
bne ASM_PFX(ArmPlatformStackSetSecondary)
|
||||
|
||||
//VOID
|
||||
@@ -54,19 +54,19 @@ ASM_PFX(ArmPlatformStackSet):
|
||||
// IN UINTN SecondaryStackSize
|
||||
// );
|
||||
ASM_PFX(ArmPlatformStackSetPrimary):
|
||||
mov r4, lr
|
||||
mov r4, lr
|
||||
|
||||
// Add stack of primary stack to StackBase
|
||||
add r0, r0, r2
|
||||
add r0, r0, r2
|
||||
|
||||
// Compute SecondaryCoresCount * SecondaryCoreStackSize
|
||||
LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1)
|
||||
ldr r1, [r1]
|
||||
sub r1, #1
|
||||
mul r3, r3, r1
|
||||
ldr r1, [r1]
|
||||
sub r1, #1
|
||||
mul r3, r3, r1
|
||||
|
||||
// Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
|
||||
add sp, r0, r3
|
||||
add sp, r0, r3
|
||||
|
||||
bx r4
|
||||
|
||||
@@ -78,29 +78,29 @@ ASM_PFX(ArmPlatformStackSetPrimary):
|
||||
// IN UINTN SecondaryStackSize
|
||||
// );
|
||||
ASM_PFX(ArmPlatformStackSetSecondary):
|
||||
mov r4, lr
|
||||
mov r4, lr
|
||||
mov sp, r0
|
||||
|
||||
// Get Core Position
|
||||
mov r0, r1
|
||||
mov r0, r1
|
||||
bl ASM_PFX(ArmPlatformGetCorePosition)
|
||||
mov r5, r0
|
||||
mov r5, r0
|
||||
|
||||
// Get Primary Core Position
|
||||
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0)
|
||||
ldr r0, [r0]
|
||||
ldr r0, [r0]
|
||||
bl ASM_PFX(ArmPlatformGetCorePosition)
|
||||
|
||||
// Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
|
||||
cmp r5, r0
|
||||
cmp r5, r0
|
||||
subhi r5, r5, #1
|
||||
add r5, r5, #1
|
||||
add r5, r5, #1
|
||||
|
||||
// Compute top of the secondary stack
|
||||
mul r3, r3, r5
|
||||
mul r3, r3, r5
|
||||
|
||||
// Set stack
|
||||
add sp, sp, r3
|
||||
add sp, sp, r3
|
||||
|
||||
bx r4
|
||||
|
||||
|
@@ -30,6 +30,9 @@
|
||||
Arm/ArmPlatformStackLib.asm | RVCT
|
||||
Arm/ArmPlatformStackLib.S | GCC
|
||||
|
||||
[Sources.AARCH64]
|
||||
AArch64/ArmPlatformStackLib.S | GCC
|
||||
|
||||
[FixedPcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdCoreCount
|
||||
|
||||
|
@@ -0,0 +1,24 @@
|
||||
/** @file
|
||||
* Main file supporting the Monitor World on ARM PLatforms
|
||||
*
|
||||
* Copyright (c) 2012-2013, 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.
|
||||
*
|
||||
**/
|
||||
|
||||
VOID
|
||||
ArmSecureMonitorWorldInitialize (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Do not touch the EL3 Exception Vector Table Register.
|
||||
// The default default DebugAgentLib could have already set its own vector
|
||||
// into EL3 to catch abort exceptions.
|
||||
}
|
@@ -19,13 +19,14 @@
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmTrustedMonitorLib
|
||||
|
||||
[Sources.common]
|
||||
ArmTrustedMonitorLibNull.c
|
||||
|
||||
[Sources.ARM]
|
||||
Arm/ArmTrustedMonitorLibNull.c
|
||||
Arm/MonitorTable.asm | RVCT
|
||||
Arm/MonitorTable.S | GCC
|
||||
|
||||
[Sources.AARCH64]
|
||||
AArch64/ArmTrustedMonitorLibNull.c
|
||||
|
||||
[Packages]
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
|
33
ArmPlatformPkg/Library/EblCmdLib/AArch64/EblCmdMmu.c
Normal file
33
ArmPlatformPkg/Library/EblCmdLib/AArch64/EblCmdMmu.c
Normal file
@@ -0,0 +1,33 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011 - 2013, 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/UefiLib.h>
|
||||
#include <Library/ArmLib.h>
|
||||
#include <Chipset/AArch64.h>
|
||||
#include <Library/CacheMaintenanceLib.h>
|
||||
#include <Library/EblCmdLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
EFI_STATUS
|
||||
EblDumpMmu (
|
||||
IN UINTN Argc,
|
||||
IN CHAR8 **Argv
|
||||
)
|
||||
{
|
||||
AsciiPrint ("\nNot supported on this platform.\n");
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
@@ -34,6 +34,9 @@
|
||||
[Sources.ARM]
|
||||
Arm/EblCmdMmu.c
|
||||
|
||||
[Sources.AARCH64]
|
||||
AArch64/EblCmdMmu.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
MdeModulePkg/MdeModulePkg.dec
|
||||
|
Reference in New Issue
Block a user