1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- //
- // Copyright (c) 2012-2013, ARM Limited. All rights reserved.
- //
- // SPDX-License-Identifier: BSD-2-Clause-Patent
- //
- //
- #include <AsmMacroIoLib.h>
- //VOID
- //ArmPlatformStackSet (
- // IN UINTN StackBase,
- // IN UINTN MpId,
- // IN UINTN PrimaryStackSize,
- // IN UINTN SecondaryStackSize
- // );
- ASM_FUNC(ArmPlatformStackSet)
- // Save parameters
- mov r6, r3
- mov r5, r2
- mov r4, r1
- mov r3, r0
- // Save the Link register
- mov r7, lr
- // Identify Stack
- mov r0, r1
- bl ASM_PFX(ArmPlatformIsPrimaryCore)
- cmp r0, #1
- // Restore parameters
- mov r0, r3
- mov r1, r4
- mov r2, r5
- mov r3, r6
- // Restore the Link register
- mov lr, r7
- beq ASM_PFX(ArmPlatformStackSetPrimary)
- bne ASM_PFX(ArmPlatformStackSetSecondary)
- //VOID
- //ArmPlatformStackSetPrimary (
- // IN UINTN StackBase,
- // IN UINTN MpId,
- // IN UINTN PrimaryStackSize,
- // IN UINTN SecondaryStackSize
- // );
- ASM_FUNC(ArmPlatformStackSetPrimary)
- mov r4, lr
- // Add stack of primary stack to StackBase
- add r0, r0, r2
- // Compute SecondaryCoresCount * SecondaryCoreStackSize
- MOV32 (r1, FixedPcdGet32(PcdCoreCount) - 1)
- mul r3, r3, r1
- // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
- add sp, r0, r3
- bx r4
- //VOID
- //ArmPlatformStackSetSecondary (
- // IN UINTN StackBase,
- // IN UINTN MpId,
- // IN UINTN PrimaryStackSize,
- // IN UINTN SecondaryStackSize
- // );
- ASM_FUNC(ArmPlatformStackSetSecondary)
- mov r4, lr
- mov sp, r0
- // Get Core Position
- mov r0, r1
- bl ASM_PFX(ArmPlatformGetCorePosition)
- mov r5, r0
- // Get Primary Core Position
- bl ASM_PFX(ArmPlatformGetPrimaryCoreMpId)
- bl ASM_PFX(ArmPlatformGetCorePosition)
- // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
- cmp r5, r0
- subhi r5, r5, #1
- add r5, r5, #1
- // Compute top of the secondary stack
- mul r3, r3, r5
- // Set stack
- add sp, sp, r3
- bx r4
|