ArmPlatformPkg/ArmPlatformLib: Added support for ArmPlatformIsPrimaryCore()
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 10 May 2013 12:41:27 +0000 (12:41 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 10 May 2013 12:41:27 +0000 (12:41 +0000)
Checking if a core if the primary/boot core used to be done with the macro
IS_PRIMARY_CORE().
Some platforms exposes configuration registers to change the primary core.
Replacing the macro IS_PRIMARY_CORE() by ArmPlatformIsPrimaryCore() allows
some flexibility in the way to check the primary core.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
Acked-by: Ryan Harkin <ryan.harkin@linaro.org>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14344 6f19259b-4bc3-4df7-8a09-765794883524

59 files changed:
ArmPkg/Drivers/ArmCpuLib/ArmCortexA15Lib/ArmCortexA15Lib.c
ArmPkg/Drivers/ArmCpuLib/ArmCortexA15Lib/ArmCortexA15Lib.inf
ArmPkg/Drivers/ArmCpuLib/ArmCortexA9Lib/ArmCortexA9Lib.c
ArmPkg/Drivers/ArmCpuLib/ArmCortexA9Lib/ArmCortexA9Lib.inf
ArmPkg/Drivers/PL390Gic/PL390GicSec.c
ArmPkg/Drivers/PL390Gic/PL390GicSecLib.inf
ArmPkg/Include/AsmMacroIoLib.h
ArmPkg/Include/AsmMacroIoLib.inc
ArmPkg/Include/Library/ArmLib.h
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEb.c
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbHelper.S [new file with mode: 0644]
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbHelper.asm [new file with mode: 0644]
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbLib.inf
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbLibSec.inf
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbSecLibRTSM/ArmRealViewEbSec.c
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbSecLibRTSM/ArmRealViewEbSecLib.inf
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA15-A7/ArmVExpressLib.inf
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA15-A7/CTA15-A7.c
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA15-A7/CTA15-A7Helper.S
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA15-A7/CTA15-A7Helper.asm
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/ArmVExpressLib.inf
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/ArmVExpressLibSec.inf
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.c
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S [new file with mode: 0644]
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm [new file with mode: 0644]
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.S
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/Arm/RTSMHelper.asm
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/RTSM.c
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibCTA9x4/CTA9x4Sec.c
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/Arm/RTSMHelper.S [deleted file]
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/Arm/RTSMHelper.asm [deleted file]
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/ArmVExpressSecLib.inf
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/RTSMSec.c
ArmPlatformPkg/Include/Library/ArmPlatformLib.h
ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.S
ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.asm
ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.c
ArmPlatformPkg/Library/ArmPlatformSecLibNull/ArmPlatformLibNullSec.c
ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.c
ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf
ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S
ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.asm
ArmPlatformPkg/PrePeiCore/PrePeiCore.c
ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf
ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf
ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.S
ArmPlatformPkg/PrePi/Arm/ModuleEntryPoint.asm
ArmPlatformPkg/PrePi/PeiMPCore.inf
ArmPlatformPkg/PrePi/PeiUniCore.inf
ArmPlatformPkg/PrePi/PrePi.c
ArmPlatformPkg/Sec/Arm/Helper.S
ArmPlatformPkg/Sec/Arm/SecEntryPoint.S
ArmPlatformPkg/Sec/Arm/SecEntryPoint.asm
ArmPlatformPkg/Sec/Sec.c
ArmPlatformPkg/Sec/Sec.inf
ArmPlatformPkg/Sec/SecInternal.h
BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S [new file with mode: 0644]
BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm [new file with mode: 0644]
BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardLib.inf

index 95ab073..b155978 100644 (file)
@@ -55,7 +55,7 @@ ArmCpuSetupSmpNonSecure (
   )\r
 {\r
   /*// Make the SCU accessible in Non Secure world\r
-  if (IS_PRIMARY_CORE(MpId)) {\r
+  if (ArmPlatformIsPrimaryCore (MpId)) {\r
     ScuBase = ArmGetScuBaseAddress();\r
 \r
     // Allow NS access to SCU register\r
index bcf7f6b..3ddd4c5 100644 (file)
 [Sources.common]\r
   ArmCortexA15Lib.c\r
 \r
-[FeaturePcd]\r
-\r
 [FixedPcd]\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
-\r
   gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz\r
index 8d9530c..4fc6a08 100644 (file)
@@ -15,6 +15,7 @@
 #include <Base.h>\r
 #include <Library/ArmLib.h>\r
 #include <Library/ArmCpuLib.h>\r
+#include <Library/ArmPlatformLib.h>\r
 #include <Library/IoLib.h>\r
 #include <Library/PcdLib.h>\r
 \r
@@ -64,7 +65,7 @@ ArmCpuSetupSmpNonSecure (
   INTN          ScuBase;\r
 \r
   // Make the SCU accessible in Non Secure world\r
-  if (IS_PRIMARY_CORE(MpId)) {\r
+  if (ArmPlatformIsPrimaryCore (MpId)) {\r
     ScuBase = ArmGetScuBaseAddress();\r
 \r
     // Allow NS access to SCU register\r
index 866736f..a84501d 100644 (file)
@@ -1,5 +1,5 @@
 #/* @file\r
-#  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
+#  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 #  \r
 #  This program and the accompanying materials                          \r
 #  are licensed and made available under the terms and conditions of the BSD License         \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
   ArmPkg/ArmPkg.dec\r
+  ArmPlatformPkg/ArmPlatformPkg.dec\r
 \r
 [LibraryClasses]\r
   ArmLib\r
+  ArmPlatformLib\r
   IoLib\r
   PcdLib\r
 \r
@@ -33,8 +35,3 @@
   ArmCortexA9Helper.asm     | RVCT\r
   ArmCortexA9Helper.S       | GCC\r
 \r
-[FeaturePcd]\r
-\r
-[FixedPcd]\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
index 6244575..bae76e4 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 *\r
-*  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
+*  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 *  \r
 *  This program and the accompanying materials                          \r
 *  are licensed and made available under the terms and conditions of the BSD License         \r
@@ -14,6 +14,7 @@
 \r
 #include <Base.h>\r
 #include <Library/ArmLib.h>\r
+#include <Library/ArmPlatformLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/IoLib.h>\r
 #include <Library/ArmGicLib.h>\r
@@ -51,7 +52,7 @@ ArmGicSetupNonSecure (
   }\r
 \r
   // Only the primary core should set the Non Secure bit to the SPIs (Shared Peripheral Interrupt).\r
-  if (IS_PRIMARY_CORE(MpId)) {\r
+  if (ArmPlatformIsPrimaryCore (MpId)) {\r
     // Ensure all GIC interrupts are Non-Secure\r
     for (Index = 0; Index < (ArmGicGetMaxNumInterrupts (GicDistributorBase) / 32); Index++) {\r
       MmioWrite32 (GicDistributorBase + ARM_GIC_ICDISR + (Index * 4), 0xffffffff);\r
index 73faa39..205e503 100644 (file)
 \r
 [Packages]\r
   ArmPkg/ArmPkg.dec\r
+  ArmPlatformPkg/ArmPlatformPkg.dec\r
   MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
 \r
 [LibraryClasses]\r
   ArmLib\r
+  ArmPlatformLib\r
   DebugLib\r
   IoLib\r
   PcdLib\r
 \r
-[FixedPcd.common]\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
index c8692fc..c507329 100644 (file)
 \r
 // Convert the (ClusterId,CoreId) into a Core Position\r
 // We assume there are 4 cores per cluster\r
-#define GetCorePositionFromMpId(Pos, MpId, Tmp) \\r
-  lsr   Pos, MpId, #6 ;                        \\r
-  and   Tmp, MpId, #3 ;                        \\r
+// Note: 0xFFFF is the magic value for ARM_CORE_MASK | ARM_CLUSTER_MASK\r
+#define GetCorePositionFromMpId(Pos, MpId, Tmp)  \\r
+  ldr   Tmp, =0xFFFF                             \\r
+  and   MpId, Tmp                                \\r
+  lsr   Pos, MpId, #6 ;                          \\r
+  and   Tmp, MpId, #3 ;                          \\r
   add   Pos, Pos, Tmp\r
 \r
 // Reserve a region at the top of the Primary Core stack\r
@@ -207,10 +210,15 @@ _InitializePrimaryStackEnd:
 \r
 #define LoadConstantToReg(Data, Reg) \\r
   ldr  Reg, =Data\r
-  \r
-#define GetCorePositionFromMpId(Pos, MpId, Tmp) \\r
-  lsr   Pos, MpId, #6 ;                        \\r
-  and   Tmp, MpId, #3 ;                        \\r
+\r
+// Convert the (ClusterId,CoreId) into a Core Position\r
+// We assume there are 4 cores per cluster\r
+// Note: 0xFFFF is the magic value for ARM_CORE_MASK | ARM_CLUSTER_MASK\r
+#define GetCorePositionFromMpId(Pos, MpId, Tmp)    \\r
+  ldr   Tmp, =0xFFFF ;                             \\r
+  and   MpId, Tmp ;                                \\r
+  lsr   Pos, MpId, #6 ;                            \\r
+  and   Tmp, MpId, #3 ;                            \\r
   add   Pos, Pos, Tmp\r
 \r
 #define SetPrimaryStack(StackTop, GlobalSize, Tmp)  \\r
index 1ca99fd..5796adc 100644 (file)
   \r
   MACRO\r
   GetCorePositionFromMpId $Pos, $MpId, $Tmp\r
+  ;Note: The ARM macro does not support the pre-processing. 0xFF and (0xFF << 8) are the values of\r
+  ;      ARM_CORE_MASK and ARM_CLUSTER_MASK \r
+  mov   $Tmp, #(0xFF :OR: (0xFF << 8))\r
+  and   $MpId, $Tmp\r
   lsr   $Pos, $MpId, #6\r
   and   $Tmp, $MpId, #3\r
   add   $Pos, $Pos, $Tmp\r
index b12be14..75f7755 100644 (file)
@@ -112,7 +112,6 @@ typedef enum {
 //\r
 // ARM MP Core IDs\r
 //\r
-#define IS_PRIMARY_CORE(MpId) (((MpId) & PcdGet32(PcdArmPrimaryCoreMask)) == PcdGet32(PcdArmPrimaryCore))\r
 #define ARM_CORE_MASK         0xFF\r
 #define ARM_CLUSTER_MASK      (0xFF << 8)\r
 #define GET_CORE_ID(MpId)     ((MpId) & ARM_CORE_MASK)\r
index 77d48ac..8351b43 100644 (file)
@@ -74,7 +74,7 @@ ArmPlatformInitialize (
   IN  UINTN                     MpId\r
   )\r
 {\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbHelper.S b/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbHelper.S
new file mode 100644 (file)
index 0000000..847509f
--- /dev/null
@@ -0,0 +1,49 @@
+//\r
+//  Copyright (c) 2012, ARM Limited. All rights reserved.\r
+//\r
+//  This program and the accompanying materials\r
+//  are licensed and made available under the terms and conditions of the BSD License\r
+//  which accompanies this distribution.  The full text of the license may be found at\r
+//  http://opensource.org/licenses/bsd-license.php\r
+//\r
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+//\r
+//\r
+\r
+#include <AsmMacroIoLib.h>\r
+#include <Library/ArmLib.h>\r
+\r
+.text \r
+.align 3\r
+\r
+GCC_ASM_EXPORT(ArmPlatformGetCorePosition)\r
+GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)\r
+\r
+//UINTN\r
+//ArmPlatformGetCorePosition (\r
+//  IN UINTN MpId\r
+//  );\r
+ASM_PFX(ArmPlatformGetCorePosition):\r
+  and  r1, r0, #ARM_CORE_MASK\r
+  and  r0, r0, #ARM_CLUSTER_MASK\r
+  add  r0, r1, r0, LSR #7\r
+  bx   lr\r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ASM_PFX(ArmPlatformIsPrimaryCore):\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbHelper.asm b/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbHelper.asm
new file mode 100644 (file)
index 0000000..6d35182
--- /dev/null
@@ -0,0 +1,56 @@
+//\r
+//  Copyright (c) 2012, ARM Limited. All rights reserved.\r
+//\r
+//  This program and the accompanying materials\r
+//  are licensed and made available under the terms and conditions of the BSD License\r
+//  which accompanies this distribution.  The full text of the license may be found at\r
+//  http://opensource.org/licenses/bsd-license.php\r
+//\r
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+//\r
+//\r
+\r
+#include <AsmMacroIoLib.h>\r
+#include <Library/ArmLib.h>\r
+\r
+  INCLUDE AsmMacroIoLib.inc\r
+\r
+  EXPORT  ArmPlatformGetCorePosition\r
+  EXPORT  ArmPlatformIsPrimaryCore\r
+\r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCore\r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask\r
+  \r
+  PRESERVE8\r
+  AREA    ArmPlatformNullHelper, CODE, READONLY\r
+\r
+//UINTN\r
+//ArmPlatformGetCorePosition (\r
+//  IN UINTN MpId\r
+//  );\r
+ArmPlatformGetCorePosition FUNCTION\r
+  and  r1, r0, #ARM_CORE_MASK\r
+  and  r0, r0, #ARM_CLUSTER_MASK\r
+  add  r0, r1, r0, LSR #7\r
+  bx   lr\r
+  ENDFUNC\r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ArmPlatformIsPrimaryCore FUNCTION\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
+  ENDFUNC\r
+\r
+  END\r
+\r
index 6c45d35..a8fe3b4 100644 (file)
@@ -34,6 +34,8 @@
 [Sources.common]\r
   ArmRealViewEb.c\r
   ArmRealViewEbMem.c\r
+  ArmRealViewEbHelper.asm | RVCT\r
+  ArmRealViewEbHelper.S   | GCC\r
 \r
 [FeaturePcd]\r
   gEmbeddedTokenSpaceGuid.PcdCacheEnable\r
index 652211d..9be6a37 100644 (file)
@@ -32,6 +32,8 @@
 \r
 [Sources.common]\r
   ArmRealViewEb.c\r
+  ArmRealViewEbHelper.asm | RVCT\r
+  ArmRealViewEbHelper.S   | GCC\r
 \r
 [FeaturePcd]\r
   gEmbeddedTokenSpaceGuid.PcdCacheEnable\r
index 033c9d7..1d3233e 100644 (file)
@@ -14,6 +14,7 @@
 \r
 #include <Library/IoLib.h>\r
 #include <Library/ArmLib.h>\r
+#include <Library/ArmPlatformLib.h>\r
 #include <Library/ArmPlatformSecLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/PcdLib.h>\r
@@ -51,7 +52,7 @@ ArmPlatformSecInitialize (
   )\r
 {\r
   // If it is not the primary core then there is nothing to do\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
index b6971bc..d4e383a 100644 (file)
@@ -29,6 +29,7 @@
 [LibraryClasses]\r
   IoLib\r
   ArmLib\r
+  ArmPlatformLib\r
 \r
 [Sources.common]\r
   ArmRealViewEbSec.c\r
@@ -41,5 +42,3 @@
 [FixedPcd]\r
   gArmTokenSpaceGuid.PcdFvBaseAddress\r
 \r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
index 6ec75dc..373a8e9 100644 (file)
@@ -51,6 +51,3 @@
   gArmTokenSpaceGuid.PcdSystemMemoryBase\r
   gArmTokenSpaceGuid.PcdSystemMemorySize\r
   gArmTokenSpaceGuid.PcdFvBaseAddress\r
-\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
index 87f41c7..32ce23d 100644 (file)
@@ -140,7 +140,7 @@ ArmPlatformInitialize (
   IN  UINTN                     MpId\r
   )\r
 {\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
index 2863279..09cfc82 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2012, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2012-2013, ARM Limited. All rights reserved.\r
 //\r
 //  This program and the accompanying materials\r
 //  are licensed and made available under the terms and conditions of the BSD License\r
 //\r
 //\r
 \r
+#include <AsmMacroIoLib.h>\r
 #include <Library/ArmLib.h>\r
 \r
+#include <ArmPlatform.h>\r
+\r
 .text \r
 .align 3\r
 \r
 GCC_ASM_EXPORT(ArmPlatformGetCorePosition)\r
+GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
 \r
 //UINTN\r
 //ArmPlatformGetCorePosition (\r
@@ -28,3 +32,33 @@ ASM_PFX(ArmPlatformGetCorePosition):
   add  r0, r1, r0, LSR #7\r
   bx   lr\r
 \r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ASM_PFX(ArmPlatformIsPrimaryCore):\r
+  // Extract cpu_id and cluster_id from ARM_SCC_CFGREG48\r
+  // with cpu_id[0:3] and cluster_id[4:7]\r
+  LoadConstantToReg (ARM_CTA15A7_SCC_CFGREG48, r1)\r
+  ldr   r1, [r1]\r
+  lsr   r1, #24\r
+\r
+  // Shift the SCC value to get the cluster ID at the offset #8\r
+  lsl   r2, r1, #4\r
+  and   r2, r2, #0xF00\r
+\r
+  // Keep only the cpu ID from the original SCC\r
+  and   r1, r1, #0x0F\r
+  // Add the Cluster ID to the Cpu ID\r
+  orr   r1, r1, r2\r
+\r
+  // Keep the Cluster ID and Core ID from the MPID\r
+  LoadConstantToReg (ARM_CLUSTER_MASK | ARM_CORE_MASK, r2)\r
+  and   r0, r0, r2\r
+\r
+  // Compare mpid and boot cpu from ARM_SCC_CFGREG48\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
+\r
index 73b3d97..1b5474b 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2012, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2012-2013, ARM Limited. All rights reserved.\r
 //\r
 //  This program and the accompanying materials\r
 //  are licensed and made available under the terms and conditions of the BSD License\r
 //\r
 //\r
 \r
+#include <AsmMacroIoLib.h>\r
 #include <Library/ArmLib.h>\r
 \r
+#include <ArmPlatform.h>\r
+\r
   INCLUDE AsmMacroIoLib.inc\r
 \r
   EXPORT  ArmPlatformGetCorePosition\r
+  EXPORT  ArmPlatformIsPrimaryCore\r
 \r
   PRESERVE8\r
   AREA    CTA15A7Helper, CODE, READONLY\r
@@ -31,4 +35,35 @@ ArmPlatformGetCorePosition FUNCTION
   bx   lr\r
   ENDFUNC\r
 \r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ArmPlatformIsPrimaryCore FUNCTION\r
+  // Extract cpu_id and cluster_id from ARM_SCC_CFGREG48\r
+  // with cpu_id[0:3] and cluster_id[4:7]\r
+  LoadConstantToReg (ARM_CTA15A7_SCC_CFGREG48, r1)\r
+  ldr   r1, [r1]\r
+  lsr   r1, #24\r
+\r
+  // Shift the SCC value to get the cluster ID at the offset #8\r
+  lsl   r2, r1, #4\r
+  and   r2, r2, #0xF00\r
+\r
+  // Keep only the cpu ID from the original SCC\r
+  and   r1, r1, #0x0F\r
+  // Add the Cluster ID to the Cpu ID\r
+  orr   r1, r1, r2\r
+\r
+  // Keep the Cluster ID and Core ID from the MPID\r
+  LoadConstantToReg (ARM_CLUSTER_MASK | ARM_CORE_MASK, r2)\r
+  and   r0, r0, r2\r
+\r
+  // Compare mpid and boot cpu from ARM_SCC_CFGREG48\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
+  ENDFUNC\r
+\r
   END\r
index a255c40..5a44eb5 100644 (file)
@@ -39,6 +39,8 @@
 [Sources.common]\r
   CTA9x4.c\r
   CTA9x4Mem.c\r
+  CTA9x4Helper.S   | GCC\r
+  CTA9x4Helper.asm | RVCT\r
 \r
 [FeaturePcd]\r
   gEmbeddedTokenSpaceGuid.PcdCacheEnable\r
index 36784c0..4d9699d 100644 (file)
@@ -36,6 +36,8 @@
 \r
 [Sources.common]\r
   CTA9x4.c\r
+  CTA9x4Helper.S   | GCC\r
+  CTA9x4Helper.asm | RVCT\r
 \r
 [FeaturePcd]\r
   gEmbeddedTokenSpaceGuid.PcdCacheEnable\r
index 862a51a..55b6111 100644 (file)
@@ -136,7 +136,7 @@ ArmPlatformInitialize (
   IN  UINTN                     MpId\r
   )\r
 {\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.S
new file mode 100644 (file)
index 0000000..94167d5
--- /dev/null
@@ -0,0 +1,39 @@
+#\r
+#  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
+#  \r
+#  This program and the accompanying materials                          \r
+#  are licensed and made available under the terms and conditions of the BSD License         \r
+#  which accompanies this distribution.  The full text of the license may be found at        \r
+#  http://opensource.org/licenses/bsd-license.php\r
+#\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+#\r
+#\r
+\r
+#include <AsmMacroIoLib.h>\r
+\r
+.text\r
+.align 2\r
+\r
+GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)\r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ASM_PFX(ArmPlatformIsPrimaryCore):\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
+\r
+ASM_FUNCTION_REMOVE_IF_UNREFERENCED\r
diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4Helper.asm
new file mode 100644 (file)
index 0000000..429026e
--- /dev/null
@@ -0,0 +1,43 @@
+//\r
+//  Copyright (c) 2013, ARM Limited. All rights reserved.\r
+//  \r
+//  This program and the accompanying materials                          \r
+//  are licensed and made available under the terms and conditions of the BSD License         \r
+//  which accompanies this distribution.  The full text of the license may be found at        \r
+//  http://opensource.org/licenses/bsd-license.php                                            \r
+//\r
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+//\r
+//\r
+\r
+#include <AsmMacroIoLib.h>\r
+\r
+#include <AutoGen.h>\r
+\r
+  INCLUDE AsmMacroIoLib.inc\r
+\r
+  EXPORT  ArmPlatformIsPrimaryCore\r
+\r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCore\r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask\r
+\r
+  AREA CTA9x4Helper, CODE, READONLY\r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ArmPlatformIsPrimaryCore FUNCTION\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
+  ENDFUNC\r
+\r
+  END\r
index 949e7a3..2977591 100644 (file)
@@ -1,10 +1,10 @@
 #\r
-#  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+#  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 #  \r
 #  This program and the accompanying materials                          \r
 #  are licensed and made available under the terms and conditions of the BSD License         \r
 #  which accompanies this distribution.  The full text of the license may be found at        \r
-#  http:#opensource.org/licenses/bsd-license.php                                            \r
+#  http://opensource.org/licenses/bsd-license.php\r
 #\r
 #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
 #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
@@ -15,7 +15,6 @@
 #include <Base.h>\r
 #include <Library/PcdLib.h>\r
 #include <AutoGen.h>\r
-#.include AsmMacroIoLib.inc\r
 \r
 #include <Chipset/ArmCortexA9.h>\r
 \r
 .align 2\r
 \r
 GCC_ASM_EXPORT(ArmGetCpuCountPerCluster)\r
+GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)\r
 \r
 # IN None\r
 # OUT r0 = SCU Base Address\r
@@ -68,4 +71,19 @@ _Return:
   ldmfd SP!, {r1-r2}\r
   bx lr\r
 \r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ASM_PFX(ArmPlatformIsPrimaryCore):\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx   lr\r
+\r
 ASM_FUNCTION_REMOVE_IF_UNREFERENCED \r
index 7326237..7d00d11 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
 //  \r
 //  This program and the accompanying materials                          \r
 //  are licensed and made available under the terms and conditions of the BSD License         \r
   INCLUDE AsmMacroIoLib.inc\r
 \r
   EXPORT    ArmGetCpuCountPerCluster\r
-    \r
+  EXPORT    ArmPlatformIsPrimaryCore\r
+\r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCore\r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask\r
+\r
   AREA RTSMHelper, CODE, READONLY\r
 \r
 // IN None\r
 // OUT r0 = SCU Base Address\r
-ArmGetScuBaseAddress\r
+ArmGetScuBaseAddress FUNCTION\r
   // Read Configuration Base Address Register. ArmCBar cannot be called to get\r
   // the Configuration BAR as a stack is not necessary setup. The SCU is at the\r
   // offset 0x0000 from the Private Memory Region.\r
   mrc   p15, 4, r0, c15, c0, 0\r
   bx  lr\r
+  ENDFUNC\r
 \r
 // IN None\r
 // OUT r0 = number of cores present in the system\r
-ArmGetCpuCountPerCluster\r
+ArmGetCpuCountPerCluster FUNCTION\r
   stmfd SP!, {r1-r2}\r
 \r
   // Read CP15 MIDR\r
@@ -69,5 +74,22 @@ _Return
   add   r0, r0, #1\r
   ldmfd SP!, {r1-r2}\r
   bx lr\r
+  ENDFUNC\r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ArmPlatformIsPrimaryCore FUNCTION\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx   lr\r
+  ENDFUNC\r
 \r
   END\r
index f055608..5cafda8 100644 (file)
@@ -97,7 +97,7 @@ ArmPlatformInitialize (
   IN  UINTN                     MpId\r
   )\r
 {\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
index 228a0fb..a671f13 100644 (file)
@@ -36,7 +36,7 @@ ArmPlatformSecTrustzoneInit (
   )\r
 {\r
   // Nothing to do\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return;\r
   }\r
 \r
@@ -120,7 +120,7 @@ ArmPlatformSecInitialize (
   )\r
 {\r
   // If it is not the primary core then there is nothing to do\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/Arm/RTSMHelper.S b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/Arm/RTSMHelper.S
deleted file mode 100644 (file)
index f47a531..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#\r
-#  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
-#  \r
-#  This program and the accompanying materials                          \r
-#  are licensed and made available under the terms and conditions of the BSD License         \r
-#  which accompanies this distribution.  The full text of the license may be found at        \r
-#  http:#opensource.org/licenses/bsd-license.php                                            \r
-#\r
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-#\r
-#\r
-\r
-#include <AsmMacroIoLib.h>\r
-#include <Base.h>\r
-#include <Library/PcdLib.h>\r
-#include <AutoGen.h>\r
-#.include AsmMacroIoLib.inc\r
-\r
-#include <Chipset/ArmCortexA9.h>\r
-\r
-.text\r
-.align 2\r
-\r
-GCC_ASM_EXPORT(ArmGetCpuCountPerCluster)\r
-\r
-# IN None\r
-# OUT r0 = SCU Base Address\r
-ASM_PFX(ArmGetScuBaseAddress):\r
-  # Read Configuration Base Address Register. ArmCBar cannot be called to get\r
-  # the Configuration BAR as a stack is not necessary setup. The SCU is at the\r
-  # offset 0x0000 from the Private Memory Region.\r
-  mrc   p15, 4, r0, c15, c0, 0\r
-  bx  lr\r
-\r
-# IN None\r
-# OUT r0 = number of cores present in the system\r
-ASM_PFX(ArmGetCpuCountPerCluster):\r
-  stmfd SP!, {r1-r2}\r
-\r
-  # Read CP15 MIDR\r
-  mrc   p15, 0, r1, c0, c0, 0\r
-\r
-  # Check if the CPU is A15\r
-  mov   r1, r1, LSR #4\r
-  LoadConstantToReg (ARM_CPU_TYPE_MASK, r0)\r
-  and   r1, r1, r0\r
-\r
-  LoadConstantToReg (ARM_CPU_TYPE_A15, r0)\r
-  cmp   r1, r0\r
-  beq   _Read_cp15_reg\r
-\r
-_CPU_is_not_A15:\r
-  mov   r2, lr                           @ Save link register\r
-  bl    ArmGetScuBaseAddress             @ Read SCU Base Address\r
-  mov   lr, r2                           @ Restore link register val\r
-  ldr   r0, [r0, #A9_SCU_CONFIG_OFFSET]     @ Read SCU Config reg to get CPU count\r
-  b     _Return\r
-\r
-_Read_cp15_reg:\r
-  mrc   p15, 1, r0, c9, c0, 2            @ Read C9 register of CP15 to get CPU count\r
-  lsr   r0, #24\r
-\r
-_Return:\r
-  and   r0, r0, #3\r
-  # Add '1' to the number of CPU on the Cluster\r
-  add   r0, r0, #1\r
-  ldmfd SP!, {r1-r2}\r
-  bx lr\r
-\r
-ASM_FUNCTION_REMOVE_IF_UNREFERENCED \r
diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/Arm/RTSMHelper.asm b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressSecLibRTSM/Arm/RTSMHelper.asm
deleted file mode 100644 (file)
index 402db58..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-//\r
-//  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
-//  \r
-//  This program and the accompanying materials                          \r
-//  are licensed and made available under the terms and conditions of the BSD License         \r
-//  which accompanies this distribution.  The full text of the license may be found at        \r
-//  http://opensource.org/licenses/bsd-license.php                                            \r
-//\r
-//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-//\r
-//\r
-\r
-#include <AsmMacroIoLib.h>\r
-#include <Base.h>\r
-#include <Library/PcdLib.h>\r
-\r
-#include <Chipset/ArmCortexA9.h>\r
-\r
-#include <AutoGen.h>\r
-\r
-  INCLUDE AsmMacroIoLib.inc\r
-\r
-  EXPORT    ArmGetCpuCountPerCluster\r
-    \r
-  AREA RTSMHelper, CODE, READONLY\r
-\r
-// IN None\r
-// OUT r0 = SCU Base Address\r
-ArmGetScuBaseAddress\r
-  // Read Configuration Base Address Register. ArmCBar cannot be called to get\r
-  // the Configuration BAR as a stack is not necessary setup. The SCU is at the\r
-  // offset 0x0000 from the Private Memory Region.\r
-  mrc   p15, 4, r0, c15, c0, 0\r
-  bx  lr\r
-\r
-// IN None\r
-// OUT r0 = number of cores present in the system\r
-ArmGetCpuCountPerCluster\r
-  stmfd SP!, {r1-r2}\r
-\r
-  // Read CP15 MIDR\r
-  mrc   p15, 0, r1, c0, c0, 0\r
-\r
-  // Check if the CPU is A15\r
-  mov   r1, r1, LSR #4\r
-  mov   r0, #ARM_CPU_TYPE_MASK\r
-  and   r1, r1, r0\r
-\r
-  mov   r0, #ARM_CPU_TYPE_A15\r
-  cmp   r1, r0\r
-  beq   _Read_cp15_reg\r
-\r
-_CPU_is_not_A15\r
-  mov   r2, lr                              ; Save link register\r
-  bl    ArmGetScuBaseAddress                ; Read SCU Base Address\r
-  mov   lr, r2                              ; Restore link register val\r
-  ldr   r0, [r0, #A9_SCU_CONFIG_OFFSET]     ; Read SCU Config reg to get CPU count\r
-  b     _Return\r
-\r
-_Read_cp15_reg\r
-  mrc   p15, 1, r0, c9, c0, 2            ; Read C9 register of CP15 to get CPU count\r
-  lsr   r0, #24\r
-\r
-\r
-_Return\r
-  and   r0, r0, #3\r
-  // Add '1' to the number of CPU on the Cluster\r
-  add   r0, r0, #1\r
-  ldmfd SP!, {r1-r2}\r
-  bx lr\r
-\r
-  END\r
index ff84767..f1e29ff 100644 (file)
@@ -37,8 +37,6 @@
 [Sources.ARM]\r
   Arm/RTSMBoot.asm     | RVCT\r
   Arm/RTSMBoot.S       | GCC\r
-  Arm/RTSMHelper.asm   | RVCT\r
-  Arm/RTSMHelper.S     | GCC\r
 \r
 [FeaturePcd]\r
   gEmbeddedTokenSpaceGuid.PcdCacheEnable\r
index 92df56c..bce834e 100644 (file)
@@ -50,7 +50,7 @@ ArmPlatformSecInitialize (
   )\r
 {\r
   // If it is not the primary core then there is nothing to do\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
index 4ea1445..b58ddd5 100644 (file)
@@ -40,11 +40,35 @@ typedef struct {
   UINT64                       NumberOfBytes;\r
 } ARM_SYSTEM_MEMORY_REGION_DESCRIPTOR;\r
 \r
+/**\r
+  Return the core position from the value of its MpId register\r
+\r
+  This function returns the core position from the position 0 in the processor.\r
+  This function might be called from assembler before any stack is set.\r
+\r
+  @return   Return the core position\r
+\r
+**/\r
 UINTN\r
 ArmPlatformGetCorePosition (\r
   IN UINTN MpId\r
   );\r
 \r
+/**\r
+  Return a non-zero value if the callee is the primary core\r
+\r
+  This function returns a non-zero value if the callee is the primary core.\r
+  The primary core is the core responsible to initialize the hardware and run UEFI.\r
+  This function might be called from assembler before any stack is set.\r
+\r
+  @return   Return a non-zero value if the callee is the primary core.\r
+\r
+**/\r
+UINTN\r
+ArmPlatformIsPrimaryCore (\r
+  IN UINTN MpId\r
+  );\r
+\r
 /**\r
   Return the current Boot Mode\r
 \r
index 2863279..47bf9c8 100644 (file)
 //\r
 //\r
 \r
+#include <AsmMacroIoLib.h>\r
 #include <Library/ArmLib.h>\r
 \r
 .text \r
 .align 3\r
 \r
 GCC_ASM_EXPORT(ArmPlatformGetCorePosition)\r
+GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)\r
+GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)\r
 \r
 //UINTN\r
 //ArmPlatformGetCorePosition (\r
@@ -28,3 +33,18 @@ ASM_PFX(ArmPlatformGetCorePosition):
   add  r0, r1, r0, LSR #7\r
   bx   lr\r
 \r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ASM_PFX(ArmPlatformIsPrimaryCore):\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
index 6205621..6d35182 100644 (file)
   INCLUDE AsmMacroIoLib.inc\r
 \r
   EXPORT  ArmPlatformGetCorePosition\r
+  EXPORT  ArmPlatformIsPrimaryCore\r
 \r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCore\r
+  IMPORT  _gPcd_FixedAtBuild_PcdArmPrimaryCoreMask\r
+  \r
   PRESERVE8\r
   AREA    ArmPlatformNullHelper, CODE, READONLY\r
 \r
@@ -32,5 +36,21 @@ ArmPlatformGetCorePosition FUNCTION
   bx   lr\r
   ENDFUNC\r
 \r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ArmPlatformIsPrimaryCore FUNCTION\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1)\r
+  ldr   r1, [r1]\r
+  and   r0, r0, r1\r
+  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, r1)\r
+  ldr   r1, [r1]\r
+  cmp   r0, r1\r
+  moveq r0, #1\r
+  movne r0, #0\r
+  bx    lr\r
+  ENDFUNC\r
+\r
   END\r
 \r
index f3a7efc..b45c11b 100644 (file)
@@ -97,7 +97,7 @@ ArmPlatformInitialize (
   IN  UINTN                     MpId\r
   )\r
 {\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
index 1a83882..41f4f74 100644 (file)
@@ -29,7 +29,7 @@ ArmPlatformSecTrustzoneInit (
   )\r
 {\r
   // Secondary cores might have to set the Secure SGIs into the GICD_IGROUPR0\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return;\r
   }\r
 \r
@@ -49,7 +49,7 @@ ArmPlatformSecInitialize (
   )\r
 {\r
   // If it is not the primary core then there is nothing to do\r
-  if (!IS_PRIMARY_CORE(MpId)) {\r
+  if (!ArmPlatformIsPrimaryCore (MpId)) {\r
     return RETURN_SUCCESS;\r
   }\r
 \r
index 9e78d7e..f7c3ab2 100755 (executable)
@@ -16,6 +16,7 @@
 \r
 #include <Library/ArmLib.h>\r
 #include <Library/ArmGicLib.h>\r
+#include <Library/ArmPlatformLib.h>\r
 #include <Library/ArmPlatformSecLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/PcdLib.h>\r
@@ -70,7 +71,7 @@ ArmPlatformSecExtraAction (
     // Warning: This code assumes the DRAM has already been initialized by ArmPlatformSecLib\r
     //\r
 \r
-    if (IS_PRIMARY_CORE(MpId)) {\r
+    if (ArmPlatformIsPrimaryCore (MpId)) {\r
       UINTN*   StartAddress = (UINTN*)PcdGet32(PcdFvBaseAddress);\r
 \r
       // Patch the DRAM to make an infinite loop at the start address\r
@@ -96,7 +97,7 @@ ArmPlatformSecExtraAction (
     // Warning: This code assumes the DRAM has already been initialized by ArmPlatformSecLib\r
     //\r
 \r
-    if (IS_PRIMARY_CORE(MpId)) {\r
+    if (ArmPlatformIsPrimaryCore (MpId)) {\r
       // Signal the secondary cores they can jump to PEI phase\r
       ArmGicSendSgiTo (PcdGet32(PcdGicDistributorBase), ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E, PcdGet32 (PcdGicSgiIntId));\r
 \r
index 26afb34..5a2d288 100755 (executable)
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
   ArmPkg/ArmPkg.dec\r
   ArmPlatformPkg/ArmPlatformPkg.dec\r
 \r
 [LibraryClasses]\r
+  ArmPlatformLib\r
   DebugLib\r
   PcdLib\r
   ArmGicLib\r
@@ -46,9 +48,6 @@
 \r
 [FixedPcd]\r
   gArmTokenSpaceGuid.PcdFvBaseAddress\r
-  \r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
 \r
   gArmTokenSpaceGuid.PcdGicDistributorBase\r
   gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase\r
index f902a25..1fb8570 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 //  \r
 //  This program and the accompanying materials                          \r
 //  are licensed and made available under the terms and conditions of the BSD License         \r
@@ -20,6 +20,7 @@
 .align 3\r
 \r
 GCC_ASM_IMPORT(CEntryPoint)\r
+GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)\r
 GCC_ASM_IMPORT(ArmReadMpidr)\r
 GCC_ASM_EXPORT(_ModuleEntryPoint)\r
 \r
@@ -28,18 +29,19 @@ StartupAddr: .word    CEntryPoint
 ASM_PFX(_ModuleEntryPoint):\r
   // Identify CPU ID\r
   bl    ASM_PFX(ArmReadMpidr)\r
-  // Get ID of this CPU in Multicore system\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)\r
-  and   r5, r0, r1\r
-  \r
+  // Keep a copy of the MpId register value\r
+  mov   r5, r0\r
+\r
+  // Is it the Primary Core ?\r
+  bl    ASM_PFX(ArmPlatformIsPrimaryCore)\r
+\r
   // Get the top of the primary stacks (and the base of the secondary stacks)\r
   LoadConstantToReg (FixedPcdGet32(PcdCPUCoresStackBase), r1)\r
   LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)\r
   add   r1, r1, r2\r
 \r
-  // Is it the Primary Core ?\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3)\r
-  cmp   r5, r3\r
+  // r0 is equal to 1 if I am the primary core\r
+  cmp   r0, #1\r
   beq   _SetupPrimaryCoreStack\r
 \r
 _SetupSecondaryCoreStack:\r
index a3dd1fb..3b756b4 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 //  \r
 //  This program and the accompanying materials                          \r
 //  are licensed and made available under the terms and conditions of the BSD License         \r
@@ -19,6 +19,7 @@
   INCLUDE AsmMacroIoLib.inc\r
   \r
   IMPORT  CEntryPoint\r
+  IMPORT  ArmPlatformIsPrimaryCore\r
   IMPORT  ArmReadMpidr\r
   EXPORT  _ModuleEntryPoint\r
   \r
@@ -30,18 +31,19 @@ StartupAddr        DCD      CEntryPoint
 _ModuleEntryPoint\r
   // Identify CPU ID\r
   bl    ArmReadMpidr\r
-  // Get ID of this CPU in Multicore system\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)\r
-  and   r5, r0, r1\r
+  // Keep a copy of the MpId register value\r
+  mov   r5, r0\r
   \r
+  // Is it the Primary Core ?\r
+  bl   ArmPlatformIsPrimaryCore\r
+\r
   // Get the top of the primary stacks (and the base of the secondary stacks)\r
   LoadConstantToReg (FixedPcdGet32(PcdCPUCoresStackBase), r1)\r
   LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2)\r
   add   r1, r1, r2\r
 \r
-  // Is it the Primary Core ?\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3)\r
-  cmp   r5, r3\r
+  // r0 is equal to 1 if I am the primary core\r
+  cmp   r0, #1\r
   beq   _SetupPrimaryCoreStack\r
 \r
 _SetupSecondaryCoreStack\r
index fdd8697..ececd4c 100644 (file)
@@ -93,7 +93,7 @@ CEntryPoint (
   //Note: The MMU will be enabled by MemoryPeim. Only the primary core will have the MMU on.\r
 \r
   // If not primary Jump to Secondary Main\r
-  if (IS_PRIMARY_CORE(MpId)) {\r
+  if (ArmPlatformIsPrimaryCore (MpId)) {\r
     // Initialize the Debug Agent for Source Level Debugging\r
     InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);\r
     SaveAndSetDebugTimerInterrupt (TRUE);\r
index 91f9b3a..4658486 100644 (file)
@@ -62,7 +62,6 @@
   gArmTokenSpaceGuid.PcdFvBaseAddress\r
   gArmTokenSpaceGuid.PcdFvSize\r
 \r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
   gArmTokenSpaceGuid.PcdArmPrimaryCore\r
   gArmTokenSpaceGuid.PcdGicPrimaryCoreId\r
 \r
index bf590db..13f8690 100644 (file)
@@ -60,9 +60,6 @@
   gArmTokenSpaceGuid.PcdFvBaseAddress\r
   gArmTokenSpaceGuid.PcdFvSize\r
 \r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
-\r
   gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase\r
   gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize\r
   gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize\r
index c0c20a9..da654c7 100644 (file)
@@ -22,6 +22,7 @@
 .align 3\r
 \r
 GCC_ASM_IMPORT(CEntryPoint)\r
+GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)\r
 GCC_ASM_IMPORT(ArmReadMpidr)\r
 GCC_ASM_IMPORT(ArmPlatformStackSet)\r
 GCC_ASM_EXPORT(_ModuleEntryPoint)\r
@@ -32,8 +33,8 @@ StartupAddr: .word    CEntryPoint
 ASM_PFX(_ModuleEntryPoint):\r
   // Get ID of this CPU in Multicore system\r
   bl    ASM_PFX(ArmReadMpidr)\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)\r
-  and   r6, r0, r1\r
+  // Keep a copy of the MpId register value\r
+  mov   r6, r0\r
 \r
 _SetSVCMode:\r
   // Enter SVC mode, Disable FIQ and IRQ\r
@@ -118,8 +119,9 @@ _GetStackBase:
   bl   ASM_PFX(ArmPlatformStackSet)\r
 \r
   // Is it the Primary Core ?\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4)\r
-  cmp   r6, r4\r
+  mov   r0, r6\r
+  bl    ASM_PFX(ArmPlatformIsPrimaryCore)\r
+  cmp   r0, #1\r
   bne   _PrepareArguments\r
 \r
 _ReserveGlobalVariable:\r
index 5efdb53..b78729f 100644 (file)
@@ -21,6 +21,7 @@
   INCLUDE AsmMacroIoLib.inc\r
   \r
   IMPORT  CEntryPoint\r
+  IMPORT  ArmPlatformIsPrimaryCore\r
   IMPORT  ArmReadMpidr\r
   IMPORT  ArmPlatformStackSet\r
   \r
@@ -34,8 +35,8 @@ StartupAddr        DCD      CEntryPoint
 _ModuleEntryPoint\r
   // Get ID of this CPU in Multicore system\r
   bl    ArmReadMpidr\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)\r
-  and   r6, r0, r1\r
+  // Keep a copy of the MpId register value\r
+  mov   r6, r0\r
 \r
 _SetSVCMode\r
   // Enter SVC mode, Disable FIQ and IRQ\r
@@ -120,8 +121,9 @@ _GetStackBase
   bl   ArmPlatformStackSet\r
 \r
   // Is it the Primary Core ?\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r4)\r
-  cmp   r6, r4\r
+  mov   r0, r6\r
+  bl    ArmPlatformIsPrimaryCore\r
+  cmp   r0, #1\r
   bne   _PrepareArguments\r
 \r
 _ReserveGlobalVariable\r
index 3a36141..359e771 100755 (executable)
@@ -95,7 +95,6 @@
   \r
   gArmPlatformTokenSpaceGuid.PcdCoreCount\r
   gArmPlatformTokenSpaceGuid.PcdClusterCount\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
   gArmTokenSpaceGuid.PcdArmPrimaryCore\r
   gArmTokenSpaceGuid.PcdGicPrimaryCoreId\r
 \r
index 823a956..dd6b82e 100755 (executable)
@@ -90,8 +90,6 @@
   \r
   gArmPlatformTokenSpaceGuid.PcdCoreCount\r
   gArmPlatformTokenSpaceGuid.PcdClusterCount\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
 \r
   gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize\r
   gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize\r
index bdeb60d..238b098 100755 (executable)
@@ -217,7 +217,7 @@ CEntryPoint (
   // Initialize the platform specific controllers\r
   ArmPlatformInitialize (MpId);\r
 \r
-  if (IS_PRIMARY_CORE(MpId) && PerformanceMeasurementEnabled ()) {\r
+  if (ArmPlatformIsPrimaryCore (MpId) && PerformanceMeasurementEnabled ()) {\r
     // Initialize the Timer Library to setup the Timer HW controller\r
     TimerConstructor ();\r
     // We cannot call yet the PerformanceLib because the HOB List has not been initialized\r
@@ -240,7 +240,7 @@ CEntryPoint (
 \r
   // Define the Global Variable region when we are not running in XIP\r
   if (!IS_XIP()) {\r
-    if (IS_PRIMARY_CORE(MpId)) {\r
+    if (ArmPlatformIsPrimaryCore (MpId)) {\r
       mGlobalVariableBase = GlobalVariableBase;\r
       if (ArmIsMpCore()) {\r
         // Signal the Global Variable Region is defined (event: ARM_CPU_EVENT_DEFAULT)\r
@@ -253,7 +253,7 @@ CEntryPoint (
   }\r
   \r
   // If not primary Jump to Secondary Main\r
-  if (IS_PRIMARY_CORE(MpId)) {\r
+  if (ArmPlatformIsPrimaryCore (MpId)) {\r
     // Goto primary Main.\r
     PrimaryMain (UefiMemoryBase, StacksBase, GlobalVariableBase, StartTimeStamp);\r
   } else {\r
index 4eede5f..c99987d 100644 (file)
@@ -1,10 +1,10 @@
 #========================================================================================\r
-#  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
+#  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 #  \r
 #  This program and the accompanying materials                          \r
 #  are licensed and made available under the terms and conditions of the BSD License         \r
 #  which accompanies this distribution.  The full text of the license may be found at        \r
-#  http:#opensource.org/licenses/bsd-license.php                                            \r
+#  http://opensource.org/licenses/bsd-license.php\r
 #\r
 #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
 #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
index 92035a1..07fb71f 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 //  \r
 //  This program and the accompanying materials                          \r
 //  are licensed and made available under the terms and conditions of the BSD License         \r
@@ -19,6 +19,7 @@
 .align 3\r
 \r
 GCC_ASM_IMPORT(CEntryPoint)\r
+GCC_ASM_IMPORT(ArmPlatformIsPrimaryCore)\r
 GCC_ASM_IMPORT(ArmPlatformSecBootAction)\r
 GCC_ASM_IMPORT(ArmPlatformSecBootMemoryInit)\r
 GCC_ASM_IMPORT(ArmDisableInterrupts)\r
@@ -45,13 +46,12 @@ ASM_PFX(_ModuleEntryPoint):
 _IdentifyCpu:\r
   // Identify CPU ID\r
   bl    ASM_PFX(ArmReadMpidr)\r
-  // Get ID of this CPU in Multicore system\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)\r
-  and   r5, r0, r1\r
+  // Keep a copy of the MpId register value\r
+  mov   r9, r0\r
   \r
   // Is it the Primary Core ?\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3)\r
-  cmp   r5, r3\r
+  bl   ASM_PFX(ArmPlatformIsPrimaryCore)\r
+  cmp   r0, #1\r
   // Only the primary core initialize the memory (SMC)\r
   beq   _InitMem\r
   \r
@@ -74,9 +74,6 @@ _InitMem:
   // Initialize Init Boot Memory\r
   bl    ASM_PFX(ArmPlatformSecBootMemoryInit)\r
   \r
-  // Only Primary CPU could run this line (the secondary cores have jumped from _IdentifyCpu to _SetupStack)\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r5)\r
-\r
 _SetupPrimaryCoreStack:\r
   // Get the top of the primary stacks (and the base of the secondary stacks)\r
   LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1)\r
@@ -97,7 +94,7 @@ _SetupSecondaryCoreStack:
   add   r1, r1, r2\r
 \r
   // Get the Core Position (ClusterId * 4) + CoreId\r
-  GetCorePositionFromMpId(r0, r5, r2)\r
+  GetCorePositionFromMpId(r0, r9, r2)\r
   // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack\r
   add   r0, r0, #1\r
 \r
@@ -115,7 +112,7 @@ _PrepareArguments:
   // Jump to SEC C code\r
   //    r0 = mp_id\r
   //    r1 = Boot Mode\r
-  mov   r0, r5\r
+  mov   r0, r9\r
   mov   r1, r10\r
   blx   r3\r
   \r
index 9305e8e..f89aefd 100644 (file)
@@ -1,5 +1,5 @@
 //\r
-//  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
+//  Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
 //  \r
 //  This program and the accompanying materials                          \r
 //  are licensed and made available under the terms and conditions of the BSD License         \r
@@ -18,6 +18,7 @@
   INCLUDE AsmMacroIoLib.inc\r
   \r
   IMPORT  CEntryPoint\r
+  IMPORT  ArmPlatformIsPrimaryCore\r
   IMPORT  ArmPlatformSecBootAction\r
   IMPORT  ArmPlatformSecBootMemoryInit\r
   IMPORT  ArmDisableInterrupts\r
@@ -47,13 +48,12 @@ _ModuleEntryPoint FUNCTION
 _IdentifyCpu \r
   // Identify CPU ID\r
   bl    ArmReadMpidr\r
-  // Get ID of this CPU in Multicore system\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)\r
-  and   r5, r0, r1\r
+  // Keep a copy of the MpId register value\r
+  mov   r9, r0\r
   \r
   // Is it the Primary Core ?\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3)\r
-  cmp   r5, r3\r
+  bl   ArmPlatformIsPrimaryCore\r
+  cmp   r0, #1\r
   // Only the primary core initialize the memory (SMC)\r
   beq   _InitMem\r
   \r
@@ -76,9 +76,6 @@ _InitMem
   // Initialize Init Boot Memory\r
   bl    ArmPlatformSecBootMemoryInit\r
   \r
-  // Only Primary CPU could run this line (the secondary cores have jumped from _IdentifyCpu to _SetupStack)\r
-  LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r5)\r
-\r
 _SetupPrimaryCoreStack\r
   // Get the top of the primary stacks (and the base of the secondary stacks)\r
   LoadConstantToReg (FixedPcdGet32(PcdCPUCoresSecStackBase), r1)\r
@@ -99,7 +96,7 @@ _SetupSecondaryCoreStack
   add   r1, r1, r2\r
 \r
   // Get the Core Position (ClusterId * 4) + CoreId\r
-  GetCorePositionFromMpId(r0, r5, r2)\r
+  GetCorePositionFromMpId(r0, r9, r2)\r
   // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack\r
   add   r0, r0, #1\r
 \r
@@ -117,7 +114,7 @@ _PrepareArguments
   // Jump to SEC C code\r
   //    r0 = mp_id\r
   //    r1 = Boot Mode\r
-  mov   r0, r5\r
+  mov   r0, r9\r
   mov   r1, r10\r
   blx   r3\r
   ENDFUNC\r
index 52fa53a..5282d68 100644 (file)
@@ -56,7 +56,7 @@ CEntryPoint (
   ArmPlatformSecInitialize (MpId);\r
 \r
   // Primary CPU clears out the SCU tag RAMs, secondaries wait\r
-  if (IS_PRIMARY_CORE(MpId) && (SecBootMode == ARM_SEC_COLD_BOOT)) {\r
+  if (ArmPlatformIsPrimaryCore (MpId) && (SecBootMode == ARM_SEC_COLD_BOOT)) {\r
     if (ArmIsMpCore()) {\r
       // Signal for the initial memory is configured (event: BOOT_MEM_INIT)\r
       ArmCallSEV ();\r
@@ -108,7 +108,7 @@ CEntryPoint (
     // Enter Monitor Mode\r
     enter_monitor_mode ((UINTN)TrustedWorldInitialization, MpId, SecBootMode, (VOID*)(PcdGet32(PcdCPUCoresSecMonStackBase) + (PcdGet32(PcdCPUCoreSecMonStackSize) * (GET_CORE_POS(MpId) + 1))));\r
   } else {\r
-    if (IS_PRIMARY_CORE(MpId)) {\r
+    if (ArmPlatformIsPrimaryCore (MpId)) {\r
       SerialPrint ("Trust Zone Configuration is disabled\n\r");\r
     }\r
 \r
@@ -147,7 +147,7 @@ TrustedWorldInitialization (
 \r
   // Setup the Trustzone Chipsets\r
   if (SecBootMode == ARM_SEC_COLD_BOOT) {\r
-    if (IS_PRIMARY_CORE(MpId)) {\r
+    if (ArmPlatformIsPrimaryCore (MpId)) {\r
       if (ArmIsMpCore()) {\r
         // Signal the secondary core the Security settings is done (event: EVENT_SECURE_INIT)\r
         ArmCallSEV ();\r
index 3cf9f33..8e64a73 100644 (file)
@@ -38,6 +38,7 @@
 [LibraryClasses]\r
   ArmCpuLib\r
   ArmLib\r
+  ArmPlatformLib\r
   ArmPlatformSecLib\r
   ArmTrustedMonitorLib\r
   BaseLib\r
   gArmTokenSpaceGuid.PcdArmNsacr\r
   gArmTokenSpaceGuid.PcdArmNonSecModeTransition\r
   \r
-  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
-  gArmTokenSpaceGuid.PcdArmPrimaryCore\r
-  \r
   gArmTokenSpaceGuid.PcdSecureFvBaseAddress\r
   gArmTokenSpaceGuid.PcdSecureFvSize\r
   \r
   gArmTokenSpaceGuid.PcdFvBaseAddress\r
-  \r
+\r
   gArmPlatformTokenSpaceGuid.PcdCPUCoresSecStackBase\r
   gArmPlatformTokenSpaceGuid.PcdCPUCoreSecPrimaryStackSize\r
   gArmPlatformTokenSpaceGuid.PcdCPUCoreSecSecondaryStackSize\r
index eeaf40c..255059a 100644 (file)
@@ -19,6 +19,7 @@
 #include <Base.h>\r
 #include <Library/ArmLib.h>\r
 #include <Library/ArmCpuLib.h>\r
+#include <Library/ArmPlatformLib.h>\r
 #include <Library/ArmPlatformSecLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
diff --git a/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S b/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.S
new file mode 100644 (file)
index 0000000..29c4b5e
--- /dev/null
@@ -0,0 +1,31 @@
+#\r
+#  Copyright (c) 2012, ARM Limited. All rights reserved.\r
+#  \r
+#  This program and the accompanying materials                          \r
+#  are licensed and made available under the terms and conditions of the BSD License         \r
+#  which accompanies this distribution.  The full text of the license may be found at        \r
+#  http://opensource.org/licenses/bsd-license.php\r
+#\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+#\r
+#\r
+\r
+#include <AsmMacroIoLib.h>\r
+#include <AutoGen.h>\r
+\r
+.text\r
+.align 2\r
+\r
+GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)\r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ASM_PFX(ArmPlatformIsPrimaryCore):\r
+  // BeagleBoard has a single core. We must always return 1.\r
+  mov  r0, #1\r
+  bx   lr\r
+\r
+ASM_FUNCTION_REMOVE_IF_UNREFERENCED \r
diff --git a/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm b/BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardHelper.asm
new file mode 100644 (file)
index 0000000..35115d0
--- /dev/null
@@ -0,0 +1,36 @@
+//\r
+//  Copyright (c) 2012, ARM Limited. All rights reserved.\r
+//  \r
+//  This program and the accompanying materials                          \r
+//  are licensed and made available under the terms and conditions of the BSD License         \r
+//  which accompanies this distribution.  The full text of the license may be found at        \r
+//  http://opensource.org/licenses/bsd-license.php                                            \r
+//\r
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+//\r
+//\r
+\r
+#include <AsmMacroIoLib.h>\r
+#include <Base.h>\r
+\r
+#include <AutoGen.h>\r
+\r
+  INCLUDE AsmMacroIoLib.inc\r
+\r
+  EXPORT    ArmPlatformIsPrimaryCore\r
+\r
+  AREA BeagleBoardHelper, CODE, READONLY\r
+\r
+//UINTN\r
+//ArmPlatformIsPrimaryCore (\r
+//  IN UINTN MpId\r
+//  );\r
+ArmPlatformIsPrimaryCore FUNCTION\r
+  // BeagleBoard has a single core. We must always return 1.\r
+  mov  r0, #1\r
+  bx   lr\r
+  ENDFUNC\r
+\r
+  END\r
+\r
index 7ca98c2..48fab7c 100755 (executable)
@@ -39,6 +39,8 @@
   BeagleBoardMem.c\r
   PadConfiguration.c\r
   Clock.c\r
+  BeagleBoardHelper.S    | GCC\r
+  BeagleBoardHelper.asm  | RVCT\r
 \r
 [Protocols]\r
 \r