From 17839a45b8748b88048774e2daefba4d0331678e Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Fri, 28 Sep 2012 11:01:36 +0000 Subject: ArmPlatformPkg/ArmPlatformStackLib: Introduced helper library to initialize stacks The new functions are: - ArmPlatformStackSet(IN UINTN StackBase, IN UINTN MpId, IN UINTN PrimaryStackSize, IN UINTN SecondaryStackSize); - ArmPlatformStackSetPrimary(IN UINTN StackBase, IN UINTN MpId, IN UINTN PrimaryStackSize, IN UINTN SecondaryStackSize); - ArmPlatformStackSetSecondary(IN UINTN StackBase, IN UINTN MpId, IN UINTN PrimaryStackSize, IN UINTN SecondaryStackSize); The stack topology can be changed by implementing a new ArmPlatformStackLib Signed-off-by: Olivier Martin git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13774 6f19259b-4bc3-4df7-8a09-765794883524 --- .../ArmPlatformStackLib/ArmPlatformStackLib.S | 106 +++++++++++++++++++ .../ArmPlatformStackLib/ArmPlatformStackLib.asm | 112 +++++++++++++++++++++ .../ArmPlatformStackLib/ArmPlatformStackLib.inf | 39 +++++++ 3 files changed, 257 insertions(+) create mode 100644 ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.S create mode 100644 ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.asm create mode 100644 ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf (limited to 'ArmPlatformPkg/Library') diff --git a/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.S b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.S new file mode 100644 index 0000000000..94660c97fe --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.S @@ -0,0 +1,106 @@ +// +// Copyright (c) 2012, 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(ArmPlatformGetCorePosition) + +GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount) +GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore) + +//VOID +//ArmPlatformStackSet ( +// IN UINTN StackBase, +// IN UINTN MpId, +// IN UINTN PrimaryStackSize, +// IN UINTN SecondaryStackSize +// ); +ASM_PFX(ArmPlatformStackSet): + // Identify Stack + // Mask for ClusterId|CoreId + LoadConstantToReg (0xFFFF, r4) + and r1, r1, r4 + // Is it the Primary Core ? + LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r4) + ldr r4, [r4] + cmp r1, r4 + beq ASM_PFX(ArmPlatformStackSetPrimary) + bne ASM_PFX(ArmPlatformStackSetSecondary) + +//VOID +//ArmPlatformStackSetPrimary ( +// IN UINTN StackBase, +// IN UINTN MpId, +// IN UINTN PrimaryStackSize, +// IN UINTN SecondaryStackSize +// ); +ASM_PFX(ArmPlatformStackSetPrimary): + mov r4, lr + + // Add stack of primary stack to StackBase + add r0, r0, r2 + + // Compute SecondaryCoresCount * SecondaryCoreStackSize + LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1) + ldr r1, [r1] + sub r1, #1 + mul r3, r3, r1 + + // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize)) + add sp, r0, r3 + + bx r4 + +//VOID +//ArmPlatformStackSetSecondary ( +// IN UINTN StackBase, +// IN UINTN MpId, +// IN UINTN PrimaryStackSize, +// IN UINTN SecondaryStackSize +// ); +ASM_PFX(ArmPlatformStackSetSecondary): + mov r4, lr + mov sp, r0 + + // Get Core Position + mov r0, r1 + bl ASM_PFX(ArmPlatformGetCorePosition) + mov r5, r0 + + // Get Primary Core Position + LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, 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 + subhi r5, r5, #1 + add r5, r5, #1 + + // Compute top of the secondary stack + mul r3, r3, r5 + + // Set stack + add sp, sp, r3 + + bx r4 + diff --git a/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.asm b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.asm new file mode 100644 index 0000000000..db92023922 --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.asm @@ -0,0 +1,112 @@ +// +// Copyright (c) 2012, 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 + + INCLUDE AsmMacroIoLib.inc + + EXPORT ArmPlatformStackSet + EXPORT ArmPlatformStackSetPrimary + EXPORT ArmPlatformStackSetSecondary + + IMPORT ArmPlatformGetCorePosition + + IMPORT _gPcd_FixedAtBuild_PcdCoreCount + IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore + + PRESERVE8 + AREA ArmPlatformStackLib, CODE, READONLY + +//VOID +//ArmPlatformStackSet ( +// IN UINTN StackBase, +// IN UINTN MpId, +// IN UINTN PrimaryStackSize, +// IN UINTN SecondaryStackSize +// ); +ArmPlatformStackSet FUNCTION + // Identify Stack + // Mask for ClusterId|CoreId + LoadConstantToReg (0xFFFF, r4) + and r1, r1, r4 + // Is it the Primary Core ? + LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r4) + ldr r4, [r4] + cmp r1, r4 + beq ArmPlatformStackSetPrimary + bne ArmPlatformStackSetSecondary + ENDFUNC + +//VOID +//ArmPlatformStackSetPrimary ( +// IN UINTN StackBase, +// IN UINTN MpId, +// IN UINTN PrimaryStackSize, +// IN UINTN SecondaryStackSize +// ); +ArmPlatformStackSetPrimary FUNCTION + mov r4, lr + + // Add stack of primary stack to StackBase + add r0, r0, r2 + + // Compute SecondaryCoresCount * SecondaryCoreStackSize + LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1) + ldr r1, [r1] + sub r1, #1 + mul r3, r3, r1 + + // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize)) + add sp, r0, r3 + + bx r4 + ENDFUNC + +//VOID +//ArmPlatformStackSetSecondary ( +// IN UINTN StackBase, +// IN UINTN MpId, +// IN UINTN PrimaryStackSize, +// IN UINTN SecondaryStackSize +// ); +ArmPlatformStackSetSecondary FUNCTION + mov r4, lr + mov sp, r0 + + // Get Core Position + mov r0, r1 + bl ArmPlatformGetCorePosition + mov r5, r0 + + // Get Primary Core Position + LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0) + ldr r0, [r0] + bl ArmPlatformGetCorePosition + + // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1) + cmp r5, r0 + subhi r5, r5, #1 + add r5, r5, #1 + + // Compute top of the secondary stack + mul r3, r3, r5 + + // Set stack + add sp, sp, r3 + + bx r4 + ENDFUNC + + END diff --git a/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf new file mode 100644 index 0000000000..a41dae2b4f --- /dev/null +++ b/ArmPlatformPkg/Library/ArmPlatformStackLib/ArmPlatformStackLib.inf @@ -0,0 +1,39 @@ +#/* @file +# +# Copyright (c) 2012, 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. +# +#*/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ArmPlatformStackLib + FILE_GUID = 5e2e44af-53c1-44c2-a801-9c149f3d6ba0 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmPlatformStackLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + +[Sources.common] + ArmPlatformStackLib.asm | RVCT + ArmPlatformStackLib.S | GCC + +[FixedPcd] + gArmPlatformTokenSpaceGuid.PcdCoreCount + + gArmPlatformTokenSpaceGuid.PcdCoreCount + + gArmTokenSpaceGuid.PcdArmPrimaryCoreMask + gArmTokenSpaceGuid.PcdArmPrimaryCore -- cgit v1.2.3