ArmPlatformPkg/PrePeiCore: Drop secondary stack handling

This SEC driver is single CPU only now, so all of the secondary stack
handling is dead code, and can be removed.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
Ard Biesheuvel 2024-07-30 19:25:55 +02:00 committed by mergify[bot]
parent 96c8e75681
commit 9c1bc36ad1
4 changed files with 26 additions and 90 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -62,6 +62,5 @@
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize
gArmPlatformTokenSpaceGuid.PcdCPUCoreSecondaryStackSize
gEfiMdeModulePkgTokenSpaceGuid.PcdInitValueInTempStack