From 1bc8326695a2181cb5934c3dfb01b0a26c4096a0 Mon Sep 17 00:00:00 2001 From: Harry Liebel Date: Thu, 18 Jul 2013 19:06:52 +0000 Subject: ArmPlatformPkg: Added Aarch64 support Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Harry Liebel Signed-off-by: Olivier Martin git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14489 6f19259b-4bc3-4df7-8a09-765794883524 --- .../AArch64/ArmPlatformStackLib.S | 129 +++++++++++++++++++++ .../ArmPlatformStackLib/Arm/ArmPlatformStackLib.S | 36 +++--- .../ArmPlatformStackLib/ArmPlatformStackLib.inf | 3 + 3 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 ArmPlatformPkg/Library/ArmPlatformStackLib/AArch64/ArmPlatformStackLib.S (limited to 'ArmPlatformPkg/Library/ArmPlatformStackLib') diff --git a/ArmPlatformPkg/Library/ArmPlatformStackLib/AArch64/ArmPlatformStackLib.S b/ArmPlatformPkg/Library/ArmPlatformStackLib/AArch64/ArmPlatformStackLib.S new file mode 100644 index 0000000000..337af9c6a9 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformStackLib/AArch64/ArmPlatformStackLib.S @@ -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 +#include +#include + +.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 diff --git a/ArmPlatformPkg/Library/ArmPlatformStackLib/Arm/ArmPlatformStackLib.S b/ArmPlatformPkg/Library/ArmPlatformStackLib/Arm/ArmPlatformStackLib.S index 94660c97fe..34fab31dd4 100644 --- a/ArmPlatformPkg/Library/ArmPlatformStackLib/Arm/ArmPlatformStackLib.S +++ b/ArmPlatformPkg/Library/ArmPlatformStackLib/Arm/ArmPlatformStackLib.S @@ -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 diff --git a/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf index e48a65801d..700bc89eac 100644 --- a/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf +++ b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf @@ -30,6 +30,9 @@ Arm/ArmPlatformStackLib.asm | RVCT Arm/ArmPlatformStackLib.S | GCC +[Sources.AARCH64] + AArch64/ArmPlatformStackLib.S | GCC + [FixedPcd] gArmPlatformTokenSpaceGuid.PcdCoreCount -- cgit v1.2.3