diff --git a/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S b/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S index 8ecec234bf..1c1054304a 100644 --- a/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S +++ b/ArmPlatformPkg/PrePeiCore/AArch64/PrePeiCoreEntryPoint.S @@ -30,41 +30,23 @@ ASM_FUNC(_ModuleEntryPoint) b ASM_PFX(MainEntryPoint) ASM_PFX(MainEntryPoint): - // Identify CPU ID - bl ASM_PFX(ArmReadMpidr) - // Keep a copy of the MpId register value - mov x5, x0 - - // Is it the Primary Core ? - bl ASM_PFX(ArmPlatformIsPrimaryCore) - // Get the top of the primary stacks (and the base of the secondary stacks) MOV64 (x1, FixedPcdGet64(PcdCPUCoresStackBase) + FixedPcdGet32(PcdCPUCorePrimaryStackSize)) - // x0 is equal to 1 if I am the primary core - cmp x0, #1 - b.eq _SetupPrimaryCoreStack + // Set up the stack pointer + mov sp, x1 -_SetupSecondaryCoreStack: - // x1 contains the base of the secondary stacks + // Apply the init value to the entire stack + MOV64 (x8, FixedPcdGet64 (PcdCPUCoresStackBase)) + MOV64 (x9, FixedPcdGet32 (PcdInitValueInTempStack) |\ + FixedPcdGet32 (PcdInitValueInTempStack) << 32) +0:stp x9, x9, [x8], #16 + cmp x8, x1 + b.lt 0b - // Get the Core Position - mov x6, x1 // Save base of the secondary stacks - mov x0, x5 - 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 x0, x0, #1 - - // StackOffset = CorePos * StackSize - MOV32 (x2, FixedPcdGet32(PcdCPUCoreSecondaryStackSize)) - mul x0, x0, x2 - // SP = StackBase + StackOffset - add sp, x6, x0 - -_PrepareArguments: // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector MOV64 (x2, FixedPcdGet64(PcdFvBaseAddress)) - ldr x1, [x2, #8] + ldr x0, [x2, #8] // Move sec startup address into a data register // Ensure we're jumping to FV version of the code (not boot remapped alias) @@ -74,17 +56,6 @@ _PrepareArguments: mov x29, xzr // Jump to PrePeiCore C code - // x0 = mp_id - // x1 = pei_core_address + // x0 = pei_core_address mov x0, x5 blr x3 - -_SetupPrimaryCoreStack: - mov sp, x1 - MOV64 (x8, FixedPcdGet64 (PcdCPUCoresStackBase)) - MOV64 (x9, FixedPcdGet32 (PcdInitValueInTempStack) |\ - FixedPcdGet32 (PcdInitValueInTempStack) << 32) -0:stp x9, x9, [x8], #16 - cmp x8, x1 - b.lt 0b - b _PrepareArguments diff --git a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S index 1c9d1b5193..b3c67234e9 100644 --- a/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S +++ b/ArmPlatformPkg/PrePeiCore/Arm/PrePeiCoreEntryPoint.S @@ -11,54 +11,13 @@ ASM_FUNC(_ModuleEntryPoint) // Do early platform specific actions bl ASM_PFX(ArmPlatformPeiBootAction) - // Identify CPU ID - bl ASM_PFX(ArmReadMpidr) - // Keep a copy of the MpId register value - mov r5, r0 - - // Is it the Primary Core ? - bl ASM_PFX(ArmPlatformIsPrimaryCore) - // Get the top of the primary stacks (and the base of the secondary stacks) MOV32 (r1, FixedPcdGet64(PcdCPUCoresStackBase) + FixedPcdGet32(PcdCPUCorePrimaryStackSize)) - // r0 is equal to 1 if I am the primary core - cmp r0, #1 - beq _SetupPrimaryCoreStack - -_SetupSecondaryCoreStack: - // r1 contains the base of the secondary stacks - - // 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 - - // StackOffset = CorePos * StackSize - MOV32 (r2, FixedPcdGet32(PcdCPUCoreSecondaryStackSize)) - mul r0, r0, r2 - // SP = StackBase + StackOffset - 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 - MOV32 (r2, FixedPcdGet32(PcdFvBaseAddress)) - ldr r1, [r2, #4] - - // Move sec startup address into a data register - // Ensure we're jumping to FV version of the code (not boot remapped alias) - ldr r3, =ASM_PFX(CEntryPoint) - - // Jump to PrePeiCore C code - // r0 = mp_id - // r1 = pei_core_address - mov r0, r5 - blx r3 - -_SetupPrimaryCoreStack: + // Set up the stack pointer mov sp, r1 + + // Apply the init value to the entire stack MOV32 (r8, FixedPcdGet64 (PcdCPUCoresStackBase)) MOV32 (r9, FixedPcdGet32 (PcdInitValueInTempStack)) mov r10, r9 @@ -67,7 +26,15 @@ _SetupPrimaryCoreStack: 0:stm r8!, {r9-r12} cmp r8, r1 blt 0b - b _PrepareArguments -_NeverReturn: - b _NeverReturn + // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector + MOV32 (r2, FixedPcdGet32(PcdFvBaseAddress)) + ldr r0, [r2, #4] + + // Move sec startup address into a data register + // Ensure we're jumping to FV version of the code (not boot remapped alias) + ldr r3, =ASM_PFX(CEntryPoint) + + // Jump to PrePeiCore C code + // r0 = pei_core_address + blx r3 diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c index b4d40e7156..cbaccbbad9 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c @@ -81,7 +81,6 @@ PrintFirmwareVersion ( VOID CEntryPoint ( - IN UINTN MpId, IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint ) { @@ -128,7 +127,7 @@ CEntryPoint ( SaveAndSetDebugTimerInterrupt (TRUE); // Initialize the platform specific controllers - ArmPlatformInitialize (MpId); + ArmPlatformInitialize (ArmReadMpidr ()); // Goto primary Main. PrimaryMain (PeiCoreEntryPoint); diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf index 7bcc5a383a..772bd14db0 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf @@ -62,6 +62,5 @@ gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize - gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize gEfiMdeModulePkgTokenSpaceGuid.PcdInitValueInTempStack