123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- //
- // Copyright (c) 2012-2014, ARM Limited. All rights reserved.
- //
- // SPDX-License-Identifier: BSD-2-Clause-Patent
- //
- //
- #include <AsmMacroIoLibV8.h>
- //VOID
- //ArmPlatformStackSet (
- // IN UINTN StackBase,
- // IN UINTN MpId,
- // IN UINTN PrimaryStackSize,
- // IN UINTN SecondaryStackSize
- // );
- ASM_FUNC(ArmPlatformStackSet)
- // Save parameters
- mov x26, x3
- mov x25, x2
- mov x24, x1
- mov x23, x0
- // Save the Link register
- mov x27, x30
- // Identify Stack
- mov x0, x1
- bl ASM_PFX(ArmPlatformIsPrimaryCore)
- cmp x0, #1
- // Restore parameters
- mov x0, x23
- mov x1, x24
- mov x2, x25
- mov x3, x26
- // Restore the Link register
- mov x30, x27
- b.ne 0f
- b ASM_PFX(ArmPlatformStackSetPrimary)
- 0:b ASM_PFX(ArmPlatformStackSetSecondary)
- //VOID
- //ArmPlatformStackSetPrimary (
- // IN UINTN StackBase,
- // IN UINTN MpId,
- // IN UINTN PrimaryStackSize,
- // IN UINTN SecondaryStackSize
- // );
- ASM_FUNC(ArmPlatformStackSetPrimary)
- // Add size of primary stack to StackBase
- add x0, x0, x2
- // Compute SecondaryCoresCount * SecondaryCoreStackSize
- MOV32 (w1, FixedPcdGet32(PcdCoreCount) - 1)
- mul x3, x3, x1
- // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
- add sp, x0, x3
- ret
- //VOID
- //ArmPlatformStackSetSecondary (
- // IN UINTN StackBase,
- // IN UINTN MpId,
- // IN UINTN PrimaryStackSize,
- // IN UINTN SecondaryStackSize
- // );
- ASM_FUNC(ArmPlatformStackSetSecondary)
- // Save the Link register
- mov x24, x30
- mov sp, x0
- // Get Core Position
- mov x0, x1
- bl ASM_PFX(ArmPlatformGetCorePosition)
- mov x25, x0
- // 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 x25, x0
- // Decrement the position if after the primary core
- cinc x25, x25, ls
- // Compute top of the secondary stack
- mul x3, x3, x25
- // Set stack
- add sp, sp, x3
- ret x24
|