ARM Packages: Replaced the macro GetCorePositionFromMpId() by the ArmPlatformGetCorePosition()

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
Acked-by: Ryan Harkin <ryan.harkin@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>



git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14346 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
oliviermartin 2013-05-10 12:46:11 +00:00
parent d05ca26cb8
commit 2d45f194d9
10 changed files with 73 additions and 50 deletions

View File

@ -120,16 +120,6 @@
.long (_Data) ; \ .long (_Data) ; \
1: 1:
// Convert the (ClusterId,CoreId) into a Core Position
// We assume there are 4 cores per cluster
// Note: 0xFFFF is the magic value for ARM_CORE_MASK | ARM_CLUSTER_MASK
#define GetCorePositionFromMpId(Pos, MpId, Tmp) \
ldr Tmp, =0xFFFF \
and MpId, Tmp \
lsr Pos, MpId, #6 ; \
and Tmp, MpId, #3 ; \
add Pos, Pos, Tmp
// Reserve a region at the top of the Primary Core stack // Reserve a region at the top of the Primary Core stack
// for Global variables for the XIP phase // for Global variables for the XIP phase
#define SetPrimaryStack(StackTop, GlobalSize, Tmp) \ #define SetPrimaryStack(StackTop, GlobalSize, Tmp) \
@ -211,16 +201,6 @@ _InitializePrimaryStackEnd:
#define LoadConstantToReg(Data, Reg) \ #define LoadConstantToReg(Data, Reg) \
ldr Reg, =Data ldr Reg, =Data
// Convert the (ClusterId,CoreId) into a Core Position
// We assume there are 4 cores per cluster
// Note: 0xFFFF is the magic value for ARM_CORE_MASK | ARM_CLUSTER_MASK
#define GetCorePositionFromMpId(Pos, MpId, Tmp) \
ldr Tmp, =0xFFFF ; \
and MpId, Tmp ; \
lsr Pos, MpId, #6 ; \
and Tmp, MpId, #3 ; \
add Pos, Pos, Tmp
#define SetPrimaryStack(StackTop, GlobalSize, Tmp) \ #define SetPrimaryStack(StackTop, GlobalSize, Tmp) \
and Tmp, GlobalSize, #7 ; \ and Tmp, GlobalSize, #7 ; \
rsbne Tmp, Tmp, #8 ; \ rsbne Tmp, Tmp, #8 ; \
@ -313,8 +293,6 @@ _InitializePrimaryStackEnd:
// conditional load testing eq flag // conditional load testing eq flag
#define LoadConstantToRegIfEq(Data, Reg) LoadConstantToRegIfEqMacro Data, Reg #define LoadConstantToRegIfEq(Data, Reg) LoadConstantToRegIfEqMacro Data, Reg
#define GetCorePositionFromMpId(Pos, MpId, Tmp) GetCorePositionFromMpId Pos, MpId, Tmp
#define SetPrimaryStack(StackTop,GlobalSize,Tmp) SetPrimaryStack StackTop, GlobalSize, Tmp #define SetPrimaryStack(StackTop,GlobalSize,Tmp) SetPrimaryStack StackTop, GlobalSize, Tmp
// Initialize the Global Variable with '0' // Initialize the Global Variable with '0'

View File

@ -80,17 +80,6 @@
ldr $Reg, =($Data) ldr $Reg, =($Data)
MEND MEND
MACRO
GetCorePositionFromMpId $Pos, $MpId, $Tmp
;Note: The ARM macro does not support the pre-processing. 0xFF and (0xFF << 8) are the values of
; ARM_CORE_MASK and ARM_CLUSTER_MASK
mov $Tmp, #(0xFF :OR: (0xFF << 8))
and $MpId, $Tmp
lsr $Pos, $MpId, #6
and $Tmp, $MpId, #3
add $Pos, $Pos, $Tmp
MEND
; The reserved place must be 8-bytes aligned for pushing 64-bit variable on the stack ; The reserved place must be 8-bytes aligned for pushing 64-bit variable on the stack
; Note: Global Size will be modified ; Note: Global Size will be modified
MACRO MACRO

View File

@ -12,12 +12,14 @@
# #
#include <AsmMacroIoLib.h> #include <AsmMacroIoLib.h>
#include <Library/ArmLib.h>
.text .text
.align 2 .align 2
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore) GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId) GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)
GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
@ -46,4 +48,12 @@ ASM_PFX(ArmPlatformIsPrimaryCore):
movne r0, #0 movne r0, #0
bx lr bx lr
//UINTN
//ArmPlatformGetCorePosition (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformGetCorePosition):
and r0, r0, #ARM_CORE_MASK
bx lr
ASM_FUNCTION_REMOVE_IF_UNREFERENCED ASM_FUNCTION_REMOVE_IF_UNREFERENCED

View File

@ -12,6 +12,7 @@
// //
#include <AsmMacroIoLib.h> #include <AsmMacroIoLib.h>
#include <Library/ArmLib.h>
#include <AutoGen.h> #include <AutoGen.h>
@ -19,6 +20,7 @@
EXPORT ArmPlatformIsPrimaryCore EXPORT ArmPlatformIsPrimaryCore
EXPORT ArmPlatformGetPrimaryCoreMpId EXPORT ArmPlatformGetPrimaryCoreMpId
EXPORT ArmPlatformGetCorePosition
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask
@ -51,4 +53,13 @@ ArmPlatformIsPrimaryCore FUNCTION
bx lr bx lr
ENDFUNC ENDFUNC
//UINTN
//ArmPlatformGetCorePosition (
// IN UINTN MpId
// );
ArmPlatformGetCorePosition FUNCTION
and r0, r0, #ARM_CORE_MASK
bx lr
ENDFUNC
END END

View File

@ -13,6 +13,7 @@
#include <AsmMacroIoLib.h> #include <AsmMacroIoLib.h>
#include <Base.h> #include <Base.h>
#include <Library/ArmLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <AutoGen.h> #include <AutoGen.h>
@ -24,6 +25,7 @@
GCC_ASM_EXPORT(ArmGetCpuCountPerCluster) GCC_ASM_EXPORT(ArmGetCpuCountPerCluster)
GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore) GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId) GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)
GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
@ -96,4 +98,14 @@ ASM_PFX(ArmPlatformIsPrimaryCore):
movne r0, #0 movne r0, #0
bx lr bx lr
//UINTN
//ArmPlatformGetCorePosition (
// IN UINTN MpId
// );
ASM_PFX(ArmPlatformGetCorePosition):
and r1, r0, #ARM_CORE_MASK
and r0, r0, #ARM_CLUSTER_MASK
add r0, r1, r0, LSR #7
bx lr
ASM_FUNCTION_REMOVE_IF_UNREFERENCED ASM_FUNCTION_REMOVE_IF_UNREFERENCED

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2011-2012, ARM Limited. All rights reserved. // Copyright (c) 2011-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
@ -13,6 +13,7 @@
#include <AsmMacroIoLib.h> #include <AsmMacroIoLib.h>
#include <Base.h> #include <Base.h>
#include <Library/ArmLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <Chipset/ArmCortexA9.h> #include <Chipset/ArmCortexA9.h>
@ -24,9 +25,10 @@
EXPORT ArmGetCpuCountPerCluster EXPORT ArmGetCpuCountPerCluster
EXPORT ArmPlatformIsPrimaryCore EXPORT ArmPlatformIsPrimaryCore
EXPORT ArmPlatformGetPrimaryCoreMpId EXPORT ArmPlatformGetPrimaryCoreMpId
EXPORT ArmPlatformGetCorePosition
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore
IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask
AREA RTSMHelper, CODE, READONLY AREA RTSMHelper, CODE, READONLY
@ -103,4 +105,15 @@ ArmPlatformIsPrimaryCore FUNCTION
bx lr bx lr
ENDFUNC ENDFUNC
//UINTN
//ArmPlatformGetCorePosition (
// IN UINTN MpId
// );
ArmPlatformGetCorePosition FUNCTION
and r1, r0, #ARM_CORE_MASK
and r0, r0, #ARM_CLUSTER_MASK
add r0, r1, r0, LSR #7
bx lr
ENDFUNC
END END

View File

@ -20,6 +20,7 @@
.align 3 .align 3
GCC_ASM_IMPORT(CEntryPoint) GCC_ASM_IMPORT(CEntryPoint)
GCC_ASM_IMPORT(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore) GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmReadMpidr) GCC_ASM_IMPORT(ArmReadMpidr)
GCC_ASM_EXPORT(_ModuleEntryPoint) GCC_ASM_EXPORT(_ModuleEntryPoint)
@ -47,8 +48,10 @@ ASM_PFX(_ModuleEntryPoint):
_SetupSecondaryCoreStack: _SetupSecondaryCoreStack:
// r1 contains the base of the secondary stacks // r1 contains the base of the secondary stacks
// Get the Core Position (ClusterId * 4) + CoreId // Get the Core Position
GetCorePositionFromMpId(r0, r5, r2) mov r6, r1 // Save base of the secondary stacks
mov r0, r5
bl ASM_PFX(ArmPlatformGetCorePosition)
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1 add r0, r0, #1
@ -56,7 +59,7 @@ _SetupSecondaryCoreStack:
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2)
mul r0, r0, r2 mul r0, r0, r2
// SP = StackBase + StackOffset // SP = StackBase + StackOffset
add sp, r1, r0 add sp, r6, r0
_PrepareArguments: _PrepareArguments:
// The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector

View File

@ -19,6 +19,7 @@
INCLUDE AsmMacroIoLib.inc INCLUDE AsmMacroIoLib.inc
IMPORT CEntryPoint IMPORT CEntryPoint
IMPORT ArmPlatformGetCorePosition
IMPORT ArmPlatformIsPrimaryCore IMPORT ArmPlatformIsPrimaryCore
IMPORT ArmReadMpidr IMPORT ArmReadMpidr
EXPORT _ModuleEntryPoint EXPORT _ModuleEntryPoint
@ -49,8 +50,10 @@ _ModuleEntryPoint
_SetupSecondaryCoreStack _SetupSecondaryCoreStack
// r1 contains the base of the secondary stacks // r1 contains the base of the secondary stacks
// Get the Core Position (ClusterId * 4) + CoreId // Get the Core Position
GetCorePositionFromMpId(r0, r5, r2) mov r6, r1 // Save base of the secondary stacks
mov r0, r5
bl ArmPlatformGetCorePosition
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1 add r0, r0, #1
@ -58,7 +61,7 @@ _SetupSecondaryCoreStack
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2)
mul r0, r0, r2 mul r0, r0, r2
// SP = StackBase + StackOffset // SP = StackBase + StackOffset
add sp, r1, r0 add sp, r6, r0
_PrepareArguments _PrepareArguments
// The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector

View File

@ -20,6 +20,7 @@
GCC_ASM_IMPORT(CEntryPoint) GCC_ASM_IMPORT(CEntryPoint)
GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore) GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)
GCC_ASM_IMPORT(ArmPlatformGetCorePosition)
GCC_ASM_IMPORT(ArmPlatformSecBootAction) GCC_ASM_IMPORT(ArmPlatformSecBootAction)
GCC_ASM_IMPORT(ArmPlatformSecBootMemoryInit) GCC_ASM_IMPORT(ArmPlatformSecBootMemoryInit)
GCC_ASM_IMPORT(ArmDisableInterrupts) GCC_ASM_IMPORT(ArmDisableInterrupts)
@ -91,10 +92,11 @@ _SetupSecondaryCoreStack:
// Get the top of the primary stacks (and the base of the secondary stacks) // Get the top of the primary stacks (and the base of the secondary stacks)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecPrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecPrimaryStackSize), r2)
add r1, r1, r2 add r6, r1, r2
// Get the Core Position (ClusterId * 4) + CoreId // Get the Core Position
GetCorePositionFromMpId(r0, r9, r2) mov r0, r9
bl ASM_PFX(ArmPlatformGetCorePosition)
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1 add r0, r0, #1
@ -102,7 +104,7 @@ _SetupSecondaryCoreStack:
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecSecondaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecSecondaryStackSize), r2)
mul r0, r0, r2 mul r0, r0, r2
// SP = StackBase + StackOffset // SP = StackBase + StackOffset
add sp, r1, r0 add sp, r6, r0
_PrepareArguments: _PrepareArguments:
// Move sec startup address into a data register // Move sec startup address into a data register

View File

@ -19,6 +19,7 @@
IMPORT CEntryPoint IMPORT CEntryPoint
IMPORT ArmPlatformIsPrimaryCore IMPORT ArmPlatformIsPrimaryCore
IMPORT ArmPlatformGetCorePosition
IMPORT ArmPlatformSecBootAction IMPORT ArmPlatformSecBootAction
IMPORT ArmPlatformSecBootMemoryInit IMPORT ArmPlatformSecBootMemoryInit
IMPORT ArmDisableInterrupts IMPORT ArmDisableInterrupts
@ -93,10 +94,11 @@ _SetupSecondaryCoreStack
// Get the top of the primary stacks (and the base of the secondary stacks) // Get the top of the primary stacks (and the base of the secondary stacks)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1)
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecPrimaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecPrimaryStackSize), r2)
add r1, r1, r2 add r6, r1, r2
// Get the Core Position (ClusterId * 4) + CoreId // Get the Core Position
GetCorePositionFromMpId(r0, r9, r2) mov r0, r9
bl ArmPlatformGetCorePosition
// The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack
add r0, r0, #1 add r0, r0, #1
@ -104,7 +106,7 @@ _SetupSecondaryCoreStack
LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecSecondaryStackSize), r2) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecSecondaryStackSize), r2)
mul r0, r0, r2 mul r0, r0, r2
// SP = StackBase + StackOffset // SP = StackBase + StackOffset
add sp, r1, r0 add sp, r6, r0
_PrepareArguments _PrepareArguments
// Move sec startup address into a data register // Move sec startup address into a data register