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