]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/Library/ArmPlatformStackLib/Arm/ArmPlatformStackLib.asm
ArmPlatformPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / ArmPlatformPkg / Library / ArmPlatformStackLib / Arm / ArmPlatformStackLib.asm
CommitLineData
17839a45 1//\r
8a25bd7c 2// Copyright (c) 2012-2013, ARM Limited. All rights reserved.\r
17839a45 3//\r
f4dfad05 4// SPDX-License-Identifier: BSD-2-Clause-Patent\r
17839a45 5//\r
6//\r
7\r
17839a45 8#include <AutoGen.h>\r
9\r
10 INCLUDE AsmMacroIoLib.inc\r
11\r
12 EXPORT ArmPlatformStackSet\r
13 EXPORT ArmPlatformStackSetPrimary\r
14 EXPORT ArmPlatformStackSetSecondary\r
15\r
8a25bd7c 16 IMPORT ArmPlatformIsPrimaryCore\r
17839a45 17 IMPORT ArmPlatformGetCorePosition\r
8a25bd7c 18 IMPORT ArmPlatformGetPrimaryCoreMpId\r
17839a45 19\r
20 IMPORT _gPcd_FixedAtBuild_PcdCoreCount\r
17839a45 21\r
22 PRESERVE8\r
23 AREA ArmPlatformStackLib, CODE, READONLY\r
24\r
25//VOID\r
26//ArmPlatformStackSet (\r
27// IN UINTN StackBase,\r
28// IN UINTN MpId,\r
29// IN UINTN PrimaryStackSize,\r
30// IN UINTN SecondaryStackSize\r
31// );\r
32ArmPlatformStackSet FUNCTION\r
8a25bd7c
OM
33 // Save parameters\r
34 mov r6, r3\r
35 mov r5, r2\r
36 mov r4, r1\r
37 mov r3, r0\r
38\r
39 // Save the Link register\r
40 mov r7, lr\r
41\r
17839a45 42 // Identify Stack\r
8a25bd7c
OM
43 mov r0, r1\r
44 bl ArmPlatformIsPrimaryCore\r
45 cmp r0, #1\r
46\r
47 // Restore parameters\r
48 mov r0, r3\r
49 mov r1, r4\r
50 mov r2, r5\r
51 mov r3, r6\r
52\r
53 // Restore the Link register\r
54 mov lr, r7\r
55\r
91c38d4e 56 beq ArmPlatformStackSetPrimary\r
17839a45 57 bne ArmPlatformStackSetSecondary\r
58 ENDFUNC\r
59\r
60//VOID\r
61//ArmPlatformStackSetPrimary (\r
62// IN UINTN StackBase,\r
63// IN UINTN MpId,\r
64// IN UINTN PrimaryStackSize,\r
65// IN UINTN SecondaryStackSize\r
66// );\r
67ArmPlatformStackSetPrimary FUNCTION\r
91c38d4e 68 mov r4, lr\r
17839a45 69\r
70 // Add stack of primary stack to StackBase\r
91c38d4e 71 add r0, r0, r2\r
17839a45 72\r
73 // Compute SecondaryCoresCount * SecondaryCoreStackSize\r
66edb631 74 mov32 r1, FixedPcdGet32 (PcdCoreCount)\r
91c38d4e
RC
75 sub r1, #1\r
76 mul r3, r3, r1\r
17839a45 77\r
78 // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))\r
91c38d4e 79 add sp, r0, r3\r
17839a45 80\r
81 bx r4\r
82 ENDFUNC\r
83\r
84//VOID\r
85//ArmPlatformStackSetSecondary (\r
86// IN UINTN StackBase,\r
87// IN UINTN MpId,\r
88// IN UINTN PrimaryStackSize,\r
89// IN UINTN SecondaryStackSize\r
90// );\r
91ArmPlatformStackSetSecondary FUNCTION\r
91c38d4e 92 mov r4, lr\r
17839a45 93 mov sp, r0\r
94\r
95 // Get Core Position\r
91c38d4e 96 mov r0, r1\r
17839a45 97 bl ArmPlatformGetCorePosition\r
91c38d4e 98 mov r5, r0\r
17839a45 99\r
100 // Get Primary Core Position\r
8a25bd7c 101 bl ArmPlatformGetPrimaryCoreMpId\r
17839a45 102 bl ArmPlatformGetCorePosition\r
103\r
104 // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)\r
91c38d4e 105 cmp r5, r0\r
17839a45 106 subhi r5, r5, #1\r
91c38d4e 107 add r5, r5, #1\r
17839a45 108\r
109 // Compute top of the secondary stack\r
91c38d4e 110 mul r3, r3, r5\r
17839a45 111\r
112 // Set stack\r
91c38d4e 113 add sp, sp, r3\r
17839a45 114\r
115 bx r4\r
116 ENDFUNC\r
117\r
118 END\r