• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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#include <Base.h>
16#include <AutoGen.h>
17
18  INCLUDE AsmMacroIoLib.inc
19
20  EXPORT  ArmPlatformStackSet
21  EXPORT  ArmPlatformStackSetPrimary
22  EXPORT  ArmPlatformStackSetSecondary
23
24  IMPORT  ArmPlatformIsPrimaryCore
25  IMPORT  ArmPlatformGetCorePosition
26  IMPORT  ArmPlatformGetPrimaryCoreMpId
27
28  IMPORT  _gPcd_FixedAtBuild_PcdCoreCount
29
30  PRESERVE8
31  AREA    ArmPlatformStackLib, CODE, READONLY
32
33//VOID
34//ArmPlatformStackSet (
35//  IN UINTN StackBase,
36//  IN UINTN MpId,
37//  IN UINTN PrimaryStackSize,
38//  IN UINTN SecondaryStackSize
39//  );
40ArmPlatformStackSet FUNCTION
41  // Save parameters
42  mov   r6, r3
43  mov   r5, r2
44  mov   r4, r1
45  mov   r3, r0
46
47  // Save the Link register
48  mov   r7, lr
49
50  // Identify Stack
51  mov   r0, r1
52  bl    ArmPlatformIsPrimaryCore
53  cmp   r0, #1
54
55  // Restore parameters
56  mov   r0, r3
57  mov   r1, r4
58  mov   r2, r5
59  mov   r3, r6
60
61  // Restore the Link register
62  mov   lr, r7
63
64  beq   ArmPlatformStackSetPrimary
65  bne   ArmPlatformStackSetSecondary
66  ENDFUNC
67
68//VOID
69//ArmPlatformStackSetPrimary (
70//  IN UINTN StackBase,
71//  IN UINTN MpId,
72//  IN UINTN PrimaryStackSize,
73//  IN UINTN SecondaryStackSize
74//  );
75ArmPlatformStackSetPrimary FUNCTION
76  mov   r4, lr
77
78  // Add stack of primary stack to StackBase
79  add   r0, r0, r2
80
81  // Compute SecondaryCoresCount * SecondaryCoreStackSize
82  LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1)
83  ldr   r1, [r1]
84  sub   r1, #1
85  mul   r3, r3, r1
86
87  // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
88  add   sp, r0, r3
89
90  bx    r4
91  ENDFUNC
92
93//VOID
94//ArmPlatformStackSetSecondary (
95//  IN UINTN StackBase,
96//  IN UINTN MpId,
97//  IN UINTN PrimaryStackSize,
98//  IN UINTN SecondaryStackSize
99//  );
100ArmPlatformStackSetSecondary FUNCTION
101  mov   r4, lr
102  mov   sp, r0
103
104  // Get Core Position
105  mov   r0, r1
106  bl ArmPlatformGetCorePosition
107  mov   r5, r0
108
109  // Get Primary Core Position
110  bl ArmPlatformGetPrimaryCoreMpId
111  bl ArmPlatformGetCorePosition
112
113  // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
114  cmp   r5, r0
115  subhi r5, r5, #1
116  add   r5, r5, #1
117
118  // Compute top of the secondary stack
119  mul   r3, r3, r5
120
121  // Set stack
122  add   sp, sp, r3
123
124  bx r4
125  ENDFUNC
126
127  END
128