]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPlatformPkg/Library/ArmPlatformStackLib/Arm/ArmPlatformStackLib.S
bdd7a27b7cf9cc7b0e82dde35c5458ff364d761c
[mirror_edk2.git] / ArmPlatformPkg / Library / ArmPlatformStackLib / Arm / ArmPlatformStackLib.S
1 //
2 // Copyright (c) 2012-2013, ARM Limited. All rights reserved.
3 //
4 // This program and the accompanying materials
5 // are licensed and made available under the terms and conditions of the BSD License
6 // which accompanies this distribution. The full text of the license may be found at
7 // http://opensource.org/licenses/bsd-license.php
8 //
9 // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 //
12 //
13
14 #include <AsmMacroIoLib.h>
15
16 //VOID
17 //ArmPlatformStackSet (
18 // IN UINTN StackBase,
19 // IN UINTN MpId,
20 // IN UINTN PrimaryStackSize,
21 // IN UINTN SecondaryStackSize
22 // );
23 ASM_FUNC(ArmPlatformStackSet)
24 // Save parameters
25 mov r6, r3
26 mov r5, r2
27 mov r4, r1
28 mov r3, r0
29
30 // Save the Link register
31 mov r7, lr
32
33 // Identify Stack
34 mov r0, r1
35 bl ASM_PFX(ArmPlatformIsPrimaryCore)
36 cmp r0, #1
37
38 // Restore parameters
39 mov r0, r3
40 mov r1, r4
41 mov r2, r5
42 mov r3, r6
43
44 // Restore the Link register
45 mov lr, r7
46
47 beq ASM_PFX(ArmPlatformStackSetPrimary)
48 bne ASM_PFX(ArmPlatformStackSetSecondary)
49
50 //VOID
51 //ArmPlatformStackSetPrimary (
52 // IN UINTN StackBase,
53 // IN UINTN MpId,
54 // IN UINTN PrimaryStackSize,
55 // IN UINTN SecondaryStackSize
56 // );
57 ASM_FUNC(ArmPlatformStackSetPrimary)
58 mov r4, lr
59
60 // Add stack of primary stack to StackBase
61 add r0, r0, r2
62
63 // Compute SecondaryCoresCount * SecondaryCoreStackSize
64 MOV32 (r1, FixedPcdGet32(PcdCoreCount) - 1)
65 mul r3, r3, r1
66
67 // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
68 add sp, r0, r3
69
70 bx r4
71
72 //VOID
73 //ArmPlatformStackSetSecondary (
74 // IN UINTN StackBase,
75 // IN UINTN MpId,
76 // IN UINTN PrimaryStackSize,
77 // IN UINTN SecondaryStackSize
78 // );
79 ASM_FUNC(ArmPlatformStackSetSecondary)
80 mov r4, lr
81 mov sp, r0
82
83 // Get Core Position
84 mov r0, r1
85 bl ASM_PFX(ArmPlatformGetCorePosition)
86 mov r5, r0
87
88 // Get Primary Core Position
89 bl ASM_PFX(ArmPlatformGetPrimaryCoreMpId)
90 bl ASM_PFX(ArmPlatformGetCorePosition)
91
92 // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
93 cmp r5, r0
94 subhi r5, r5, #1
95 add r5, r5, #1
96
97 // Compute top of the secondary stack
98 mul r3, r3, r5
99
100 // Set stack
101 add sp, sp, r3
102
103 bx r4
104