ArmPlatformPkg/ArmPlatformStackLib: Do not directly use PcdArmPrimaryCore

To make the code platform independent we should not use PcdArmPrimaryCore
in libraries other than the platform specific libraries.
Some platforms allow to change the primary core with external registers.
These platforms do not use PcdArmPrimaryCore to identify the primary CPU.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14938 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Olivier Martin 2013-12-06 16:12:24 +00:00 committed by oliviermartin
parent 99267097f3
commit 8a25bd7c54
3 changed files with 54 additions and 26 deletions

View File

@ -22,10 +22,11 @@ GCC_ASM_EXPORT(ArmPlatformStackSet)
GCC_ASM_EXPORT(ArmPlatformStackSetPrimary) GCC_ASM_EXPORT(ArmPlatformStackSetPrimary)
GCC_ASM_EXPORT(ArmPlatformStackSetSecondary) GCC_ASM_EXPORT(ArmPlatformStackSetSecondary)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmPlatformGetCorePosition) GCC_ASM_IMPORT(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(ArmPlatformGetPrimaryCoreMpId)
GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount) GCC_ASM_IMPORT(gPcd_FixedAtBuild_PcdCoreCount)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
//VOID //VOID
//ArmPlatformStackSet ( //ArmPlatformStackSet (
@ -35,14 +36,29 @@ GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ASM_PFX(ArmPlatformStackSet): ASM_PFX(ArmPlatformStackSet):
// Save parameters
mov r6, r3
mov r5, r2
mov r4, r1
mov r3, r0
// Save the Link register
mov r7, lr
// Identify Stack // Identify Stack
// Mask for ClusterId|CoreId mov r0, r1
LoadConstantToReg (0xFFFF, r4) bl ASM_PFX(ArmPlatformIsPrimaryCore)
and r1, r1, r4 cmp r0, #1
// Is it the Primary Core ?
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r4) // Restore parameters
ldr r4, [r4] mov r0, r3
cmp r1, r4 mov r1, r4
mov r2, r5
mov r3, r6
// Restore the Link register
mov lr, r7
beq ASM_PFX(ArmPlatformStackSetPrimary) beq ASM_PFX(ArmPlatformStackSetPrimary)
bne ASM_PFX(ArmPlatformStackSetSecondary) bne ASM_PFX(ArmPlatformStackSetSecondary)
@ -87,8 +103,7 @@ ASM_PFX(ArmPlatformStackSetSecondary):
mov r5, r0 mov r5, r0
// Get Primary Core Position // Get Primary Core Position
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0) bl ASM_PFX(ArmPlatformGetPrimaryCoreMpId)
ldr r0, [r0]
bl ASM_PFX(ArmPlatformGetCorePosition) bl ASM_PFX(ArmPlatformGetCorePosition)
// Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1) // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)

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 // This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License // are licensed and made available under the terms and conditions of the BSD License
@ -21,10 +21,11 @@
EXPORT ArmPlatformStackSetPrimary EXPORT ArmPlatformStackSetPrimary
EXPORT ArmPlatformStackSetSecondary EXPORT ArmPlatformStackSetSecondary
IMPORT ArmPlatformIsPrimaryCore
IMPORT ArmPlatformGetCorePosition IMPORT ArmPlatformGetCorePosition
IMPORT ArmPlatformGetPrimaryCoreMpId
IMPORT _gPcd_FixedAtBuild_PcdCoreCount IMPORT _gPcd_FixedAtBuild_PcdCoreCount
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
PRESERVE8 PRESERVE8
AREA ArmPlatformStackLib, CODE, READONLY AREA ArmPlatformStackLib, CODE, READONLY
@ -37,14 +38,29 @@
// IN UINTN SecondaryStackSize // IN UINTN SecondaryStackSize
// ); // );
ArmPlatformStackSet FUNCTION ArmPlatformStackSet FUNCTION
// Save parameters
mov r6, r3
mov r5, r2
mov r4, r1
mov r3, r0
// Save the Link register
mov r7, lr
// Identify Stack // Identify Stack
// Mask for ClusterId|CoreId mov r0, r1
LoadConstantToReg (0xFFFF, r4) bl ArmPlatformIsPrimaryCore
and r1, r1, r4 cmp r0, #1
// Is it the Primary Core ?
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r4) // Restore parameters
ldr r4, [r4] mov r0, r3
cmp r1, r4 mov r1, r4
mov r2, r5
mov r3, r6
// Restore the Link register
mov lr, r7
beq ArmPlatformStackSetPrimary beq ArmPlatformStackSetPrimary
bne ArmPlatformStackSetSecondary bne ArmPlatformStackSetSecondary
ENDFUNC ENDFUNC
@ -91,8 +107,7 @@ ArmPlatformStackSetSecondary FUNCTION
mov r5, r0 mov r5, r0
// Get Primary Core Position // Get Primary Core Position
LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r0) bl ArmPlatformGetPrimaryCoreMpId
ldr r0, [r0]
bl ArmPlatformGetCorePosition bl ArmPlatformGetCorePosition
// Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1) // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)

View File

@ -33,10 +33,8 @@
[Sources.AARCH64] [Sources.AARCH64]
AArch64/ArmPlatformStackLib.S | GCC AArch64/ArmPlatformStackLib.S | GCC
[LibraryClasses]
ArmPlatformLib
[FixedPcd] [FixedPcd]
gArmPlatformTokenSpaceGuid.PcdCoreCount gArmPlatformTokenSpaceGuid.PcdCoreCount
gArmPlatformTokenSpaceGuid.PcdCoreCount
gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
gArmTokenSpaceGuid.PcdArmPrimaryCore