INCLUDE AsmMacroIoLib.inc\r
\r
IMPORT CEntryPoint\r
+ IMPORT ArmReadMpidr\r
EXPORT _ModuleEntryPoint\r
\r
PRESERVE8\r
\r
StartupAddr DCD CEntryPoint\r
\r
-SCC_SYS_SW EQU 0x0004\r
-\r
_ModuleEntryPoint\r
// Identify CPU ID\r
- mrc p15, 0, r0, c0, c0, 5\r
- and r0, #0xf\r
+ bl ArmReadMpidr\r
+ // Get ID of this CPU in Multicore system\r
+ LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1)\r
+ and r0, r0, r1\r
\r
_SetupStack\r
// Setup Stack for the 4 CPU cores\r
- LoadConstantToReg (FixedPcdGet32(PcdCPUCoresNonSecStackBase) ,r1)\r
- LoadConstantToReg (FixedPcdGet32(PcdCPUCoresNonSecStackSize) ,r2)\r
+ LoadConstantToReg (FixedPcdGet32(PcdCPUCoresNonSecStackBase), r1)\r
+ LoadConstantToReg (FixedPcdGet32(PcdCPUCoresNonSecStackSize), r2)\r
\r
- mov r3,r0 // r3 = core_id\r
- mul r3,r3,r2 // r3 = core_id * stack_size = offset from the stack base\r
- add r3,r3,r1 // r3 = stack_base + offset\r
- add r3,r3,r2,LSR #1 // r3 = stack_offset + (stack_size/2) <-- the top half is for the heap\r
- mov sp, r3\r
+ mov r3, r0 // r3 = core_id\r
+ mul r3, r3, r2 // r3 = core_id * stack_size = offset from the stack base\r
+ add r3, r3, r1 // r3 = stack_base + offset\r
+ add r3, r3, r2, LSR #1 // r3 = stack_offset + (stack_size/2) <-- the top half is for the heap\r
+ mov sp, r3\r
+\r
+ // Only allocate memory in top of the primary core stack\r
+ cmp r0, #0\r
+ bne _PrepareArguments\r
+\r
+_AllocateGlobalPeiVariables\r
+ // Reserve top of the stack for Global PEI Variables (eg: PeiServicesTablePointer)\r
+ LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r1)\r
+ sub sp, sp, r1\r
\r
+_PrepareArguments\r
// The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector\r
- LoadConstantToReg (FixedPcdGet32(PcdEmbeddedFdBaseAddress), r2)\r
+ LoadConstantToReg (FixedPcdGet32(PcdNormalFvBaseAddress), r2)\r
add r2, r2, #4\r
ldr r1, [r2]\r
\r
// ensure we're jumping to FV version of the code (not boot remapped alias)\r
ldr r2, StartupAddr\r
\r
- // jump to SEC C code\r
- // r0 = core_id\r
+ // jump to PrePeiCore C code\r
+ // r0 = mp_id\r
// r1 = pei_core_address\r
blx r2\r
\r