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:
Harry Liebel
2013-07-18 19:06:52 +00:00
committed by oliviermartin
parent 93deac7e25
commit 1bc8326695
34 changed files with 1288 additions and 44 deletions

View File

@@ -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

View File

@@ -37,6 +37,9 @@
Arm/ArmPlatformHelper.S | GCC
Arm/ArmPlatformHelper.asm | RVCT
[Sources.AArch64]
AArch64/ArmPlatformHelper.S | GCC
[FixedPcd]
gArmTokenSpaceGuid.PcdSystemMemoryBase
gArmTokenSpaceGuid.PcdSystemMemorySize

View File

@@ -36,6 +36,9 @@
Arm/ArmPlatformHelper.S | GCC
Arm/ArmPlatformHelper.asm | RVCT
[Sources.AArch64]
AArch64/ArmPlatformHelper.S | GCC
[FixedPcd]
gArmTokenSpaceGuid.PcdSystemMemoryBase
gArmTokenSpaceGuid.PcdSystemMemorySize

View File

@@ -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

View File

@@ -36,6 +36,10 @@
Arm/ArmPlatformLibNullBoot.asm | RVCT
Arm/ArmPlatformLibNullBoot.S | GCC
[Sources.AARCH64]
AArch64/ArmPlatformLibNullBoot.S | GCC
[FixedPcd]
gArmTokenSpaceGuid.PcdFvBaseAddress

View File

@@ -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

View File

@@ -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

View File

@@ -30,6 +30,9 @@
Arm/ArmPlatformStackLib.asm | RVCT
Arm/ArmPlatformStackLib.S | GCC
[Sources.AARCH64]
AArch64/ArmPlatformStackLib.S | GCC
[FixedPcd]
gArmPlatformTokenSpaceGuid.PcdCoreCount

View File

@@ -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.
}

View File

@@ -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

View 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;
}

View File

@@ -34,6 +34,9 @@
[Sources.ARM]
Arm/EblCmdMmu.c
[Sources.AARCH64]
AArch64/EblCmdMmu.c
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec