From 2d45f194d98a1ff4f7d78b96a551d903969262b4 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Fri, 10 May 2013 12:46:11 +0000 Subject: [PATCH] ARM Packages: Replaced the macro GetCorePositionFromMpId() by the ArmPlatformGetCorePosition() Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin Acked-by: Ryan Harkin Reviewed-by: Leif Lindholm git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14346 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/Include/AsmMacroIoLib.h | 22 ------------------- ArmPkg/Include/AsmMacroIoLib.inc | 11 ---------- .../ArmVExpressLibCTA9x4/CTA9x4Helper.S | 10 +++++++++ .../ArmVExpressLibCTA9x4/CTA9x4Helper.asm | 11 ++++++++++ .../ArmVExpressLibRTSM/Arm/RTSMHelper.S | 12 ++++++++++ .../ArmVExpressLibRTSM/Arm/RTSMHelper.asm | 19 +++++++++++++--- .../PrePeiCore/Arm/PrePeiCoreEntryPoint.S | 9 +++++--- .../PrePeiCore/Arm/PrePeiCoreEntryPoint.asm | 9 +++++--- ArmPlatformPkg/Sec/Arm/SecEntryPoint.S | 10 +++++---- ArmPlatformPkg/Sec/Arm/SecEntryPoint.asm | 10 +++++---- 10 files changed, 73 insertions(+), 50 deletions(-) diff --git a/ArmPkg/Include/AsmMacroIoLib.h b/ArmPkg/Include/AsmMacroIoLib.h index c507329741..dac2e150cc 100644 --- a/ArmPkg/Include/AsmMacroIoLib.h +++ b/ArmPkg/Include/AsmMacroIoLib.h @@ -120,16 +120,6 @@ .long (_Data) ; \ 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 // for Global variables for the XIP phase #define SetPrimaryStack(StackTop, GlobalSize, Tmp) \ @@ -211,16 +201,6 @@ _InitializePrimaryStackEnd: #define LoadConstantToReg(Data, Reg) \ 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) \ and Tmp, GlobalSize, #7 ; \ rsbne Tmp, Tmp, #8 ; \ @@ -313,8 +293,6 @@ _InitializePrimaryStackEnd: // conditional load testing eq flag #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 // Initialize the Global Variable with '0' diff --git a/ArmPkg/Include/AsmMacroIoLib.inc b/ArmPkg/Include/AsmMacroIoLib.inc index 5796adcb12..54c32d4c34 100644 --- a/ArmPkg/Include/AsmMacroIoLib.inc +++ b/ArmPkg/Include/AsmMacroIoLib.inc @@ -80,17 +80,6 @@ ldr $Reg, =($Data) 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 ; Note: Global Size will be modified MACRO diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S index 3fbc701dad..fc7312b6f1 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S +++ b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S @@ -12,12 +12,14 @@ # #include +#include .text .align 2 GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore) GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId) +GCC_ASM_EXPORT(ArmPlatformGetCorePosition) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask) @@ -46,4 +48,12 @@ ASM_PFX(ArmPlatformIsPrimaryCore): movne r0, #0 bx lr +//UINTN +//ArmPlatformGetCorePosition ( +// IN UINTN MpId +// ); +ASM_PFX(ArmPlatformGetCorePosition): + and r0, r0, #ARM_CORE_MASK + bx lr + ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm index 246ea554d8..c2db346723 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm +++ b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm @@ -12,6 +12,7 @@ // #include +#include #include @@ -19,6 +20,7 @@ EXPORT ArmPlatformIsPrimaryCore EXPORT ArmPlatformGetPrimaryCoreMpId + EXPORT ArmPlatformGetCorePosition IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask @@ -51,4 +53,13 @@ ArmPlatformIsPrimaryCore FUNCTION bx lr ENDFUNC +//UINTN +//ArmPlatformGetCorePosition ( +// IN UINTN MpId +// ); +ArmPlatformGetCorePosition FUNCTION + and r0, r0, #ARM_CORE_MASK + bx lr + ENDFUNC + END diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.S b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.S index 847424fb4b..1c256af241 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.S +++ b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.S @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -24,6 +25,7 @@ GCC_ASM_EXPORT(ArmGetCpuCountPerCluster) GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore) GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId) +GCC_ASM_EXPORT(ArmPlatformGetCorePosition) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore) GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask) @@ -96,4 +98,14 @@ ASM_PFX(ArmPlatformIsPrimaryCore): movne r0, #0 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 diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.asm b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.asm index 167762c34e..02b9f0f4a7 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.asm +++ b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.asm @@ -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 // are licensed and made available under the terms and conditions of the BSD License @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -24,9 +25,10 @@ EXPORT ArmGetCpuCountPerCluster EXPORT ArmPlatformIsPrimaryCore EXPORT ArmPlatformGetPrimaryCoreMpId + EXPORT ArmPlatformGetCorePosition - IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore - IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask + IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCore + IMPORT _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask AREA RTSMHelper, CODE, READONLY @@ -103,4 +105,15 @@ ArmPlatformIsPrimaryCore FUNCTION bx lr 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 diff --git a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S index 1fb8570eb3..3b463eabee 100644 --- a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S +++ b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S @@ -20,6 +20,7 @@ .align 3 GCC_ASM_IMPORT(CEntryPoint) +GCC_ASM_IMPORT(ArmPlatformGetCorePosition) GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore) GCC_ASM_IMPORT(ArmReadMpidr) GCC_ASM_EXPORT(_ModuleEntryPoint) @@ -47,8 +48,10 @@ ASM_PFX(_ModuleEntryPoint): _SetupSecondaryCoreStack: // r1 contains the base of the secondary stacks - // Get the Core Position (ClusterId * 4) + CoreId - GetCorePositionFromMpId(r0, r5, r2) + // Get the Core Position + 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 add r0, r0, #1 @@ -56,7 +59,7 @@ _SetupSecondaryCoreStack: LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2) mul r0, r0, r2 // SP = StackBase + StackOffset - add sp, r1, r0 + add sp, r6, r0 _PrepareArguments: // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector diff --git a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.asm b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.asm index 3b756b492a..1510fb84d0 100644 --- a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.asm +++ b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.asm @@ -19,6 +19,7 @@ INCLUDE AsmMacroIoLib.inc IMPORT CEntryPoint + IMPORT ArmPlatformGetCorePosition IMPORT ArmPlatformIsPrimaryCore IMPORT ArmReadMpidr EXPORT _ModuleEntryPoint @@ -49,8 +50,10 @@ _ModuleEntryPoint _SetupSecondaryCoreStack // r1 contains the base of the secondary stacks - // Get the Core Position (ClusterId * 4) + CoreId - GetCorePositionFromMpId(r0, r5, r2) + // Get the Core Position + 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 add r0, r0, #1 @@ -58,7 +61,7 @@ _SetupSecondaryCoreStack LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2) mul r0, r0, r2 // SP = StackBase + StackOffset - add sp, r1, r0 + add sp, r6, r0 _PrepareArguments // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector diff --git a/ArmPlatformPkg/Sec/Arm/SecEntryPoint.S b/ArmPlatformPkg/Sec/Arm/SecEntryPoint.S index 07fb71fdcc..5096251a74 100644 --- a/ArmPlatformPkg/Sec/Arm/SecEntryPoint.S +++ b/ArmPlatformPkg/Sec/Arm/SecEntryPoint.S @@ -20,6 +20,7 @@ GCC_ASM_IMPORT(CEntryPoint) GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore) +GCC_ASM_IMPORT(ArmPlatformGetCorePosition) GCC_ASM_IMPORT(ArmPlatformSecBootAction) GCC_ASM_IMPORT(ArmPlatformSecBootMemoryInit) GCC_ASM_IMPORT(ArmDisableInterrupts) @@ -91,10 +92,11 @@ _SetupSecondaryCoreStack: // Get the top of the primary stacks (and the base of the secondary stacks) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecPrimaryStackSize), r2) - add r1, r1, r2 + add r6, r1, r2 - // Get the Core Position (ClusterId * 4) + CoreId - GetCorePositionFromMpId(r0, r9, r2) + // Get the Core Position + 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 add r0, r0, #1 @@ -102,7 +104,7 @@ _SetupSecondaryCoreStack: LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecSecondaryStackSize), r2) mul r0, r0, r2 // SP = StackBase + StackOffset - add sp, r1, r0 + add sp, r6, r0 _PrepareArguments: // Move sec startup address into a data register diff --git a/ArmPlatformPkg/Sec/Arm/SecEntryPoint.asm b/ArmPlatformPkg/Sec/Arm/SecEntryPoint.asm index f89aefd2d6..14f7e9c663 100644 --- a/ArmPlatformPkg/Sec/Arm/SecEntryPoint.asm +++ b/ArmPlatformPkg/Sec/Arm/SecEntryPoint.asm @@ -19,6 +19,7 @@ IMPORT CEntryPoint IMPORT ArmPlatformIsPrimaryCore + IMPORT ArmPlatformGetCorePosition IMPORT ArmPlatformSecBootAction IMPORT ArmPlatformSecBootMemoryInit IMPORT ArmDisableInterrupts @@ -93,10 +94,11 @@ _SetupSecondaryCoreStack // Get the top of the primary stacks (and the base of the secondary stacks) LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1) LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecPrimaryStackSize), r2) - add r1, r1, r2 + add r6, r1, r2 - // Get the Core Position (ClusterId * 4) + CoreId - GetCorePositionFromMpId(r0, r9, r2) + // Get the Core Position + 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 add r0, r0, #1 @@ -104,7 +106,7 @@ _SetupSecondaryCoreStack LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecSecondaryStackSize), r2) mul r0, r0, r2 // SP = StackBase + StackOffset - add sp, r1, r0 + add sp, r6, r0 _PrepareArguments // Move sec startup address into a data register -- 2.39.2