blob: 322e3bb7439a1338fe6dd0aeb7d66ea4a02ea81c [file] [log] [blame]
Andrew Thoelke65668f92014-03-20 10:48:23 +00001/*
Antonio Nino Diaz7c65c1e2017-04-20 09:58:28 +01002 * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved.
Andrew Thoelke65668f92014-03-20 10:48:23 +00003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of ARM nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include <arch.h>
Andrew Thoelke65668f92014-03-20 10:48:23 +000032#include <asm_macros.S>
Soby Mathew49473e42015-06-10 13:49:59 +010033#include <assert_macros.S>
Dan Handleyed6ff952014-05-14 17:44:19 +010034#include <platform_def.h>
Andrew Thoelke65668f92014-03-20 10:48:23 +000035
Andrew Thoelke65668f92014-03-20 10:48:23 +000036 .local platform_normal_stacks
Soby Mathew49473e42015-06-10 13:49:59 +010037#if ENABLE_PLAT_COMPAT
38 .globl plat_get_my_stack
39 .globl plat_set_my_stack
Andrew Thoelke65668f92014-03-20 10:48:23 +000040 .weak platform_get_stack
Soby Mathew49473e42015-06-10 13:49:59 +010041 .weak platform_set_stack
Soby Mathew981487a2015-07-13 14:10:57 +010042#else
Soby Mathewb0082d22015-04-09 13:40:55 +010043 .weak plat_get_my_stack
44 .weak plat_set_my_stack
Soby Mathew70716d62015-07-13 16:26:11 +010045 .globl platform_get_stack
46 .globl platform_set_stack
47#endif /* __ENABLE_PLAT_COMPAT__ */
Soby Mathew49473e42015-06-10 13:49:59 +010048
49#if ENABLE_PLAT_COMPAT
50 /* ---------------------------------------------------------------------
51 * When the compatility layer is enabled, the new platform APIs
52 * viz plat_get_my_stack() and plat_set_my_stack() need to be
53 * defined using the previous APIs platform_get_stack() and
54 * platform_set_stack(). Also we need to provide weak definitions
55 * of platform_get_stack() and platform_set_stack() for the platforms
56 * to reuse.
57 * --------------------------------------------------------------------
58 */
Andrew Thoelke65668f92014-03-20 10:48:23 +000059
60 /* -----------------------------------------------------
Soby Mathew49473e42015-06-10 13:49:59 +010061 * unsigned long plat_get_my_stack ()
62 *
63 * For the current CPU, this function returns the stack
64 * pointer for a stack allocated in device memory.
65 * -----------------------------------------------------
66 */
67func plat_get_my_stack
68 mrs x0, mpidr_el1
69 b platform_get_stack
70endfunc plat_get_my_stack
71
72 /* -----------------------------------------------------
73 * void plat_set_my_stack ()
74 *
75 * For the current CPU, this function sets the stack
76 * pointer to a stack allocated in normal memory.
77 * -----------------------------------------------------
78 */
79func plat_set_my_stack
80 mrs x0, mpidr_el1
81 b platform_set_stack
82endfunc plat_set_my_stack
83
Soby Mathew49473e42015-06-10 13:49:59 +010084 /* -----------------------------------------------------
Andrew Thoelke65668f92014-03-20 10:48:23 +000085 * unsigned long platform_get_stack (unsigned long mpidr)
86 *
87 * For a given CPU, this function returns the stack
88 * pointer for a stack allocated in device memory.
89 * -----------------------------------------------------
90 */
91func platform_get_stack
92 mov x10, x30 // lr
93 get_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE
94 ret x10
Kévin Petita877c252015-03-24 14:03:57 +000095endfunc platform_get_stack
Andrew Thoelke65668f92014-03-20 10:48:23 +000096
97 /* -----------------------------------------------------
98 * void platform_set_stack (unsigned long mpidr)
99 *
100 * For a given CPU, this function sets the stack pointer
101 * to a stack allocated in normal memory.
102 * -----------------------------------------------------
103 */
104func platform_set_stack
105 mov x9, x30 // lr
106 bl platform_get_stack
107 mov sp, x0
108 ret x9
Kévin Petita877c252015-03-24 14:03:57 +0000109endfunc platform_set_stack
Andrew Thoelke65668f92014-03-20 10:48:23 +0000110
Soby Mathew981487a2015-07-13 14:10:57 +0100111#else
Soby Mathew70716d62015-07-13 16:26:11 +0100112 /* ---------------------------------------------------------------------
113 * When the compatility layer is disabled, the new platform APIs
114 * viz plat_get_my_stack() and plat_set_my_stack() are
115 * supported by the platform and the previous APIs platform_get_stack()
116 * and platform_set_stack() are defined in terms of new APIs making use
117 * of the fact that they are only ever invoked for the current CPU.
118 * This is to enable components of Trusted Firmware like SPDs using the
119 * old platform APIs to continue to work.
120 * --------------------------------------------------------------------
121 */
122
123 /* -------------------------------------------------------
124 * unsigned long platform_get_stack (unsigned long mpidr)
125 *
126 * For the current CPU, this function returns the stack
127 * pointer for a stack allocated in device memory. The
128 * 'mpidr' should correspond to that of the current CPU.
129 * This function is deprecated and plat_get_my_stack()
130 * should be used instead.
131 * -------------------------------------------------------
132 */
133func_deprecated platform_get_stack
Antonio Nino Diaz7c65c1e2017-04-20 09:58:28 +0100134#if ENABLE_ASSERTIONS
Soby Mathew70716d62015-07-13 16:26:11 +0100135 mrs x1, mpidr_el1
136 cmp x0, x1
137 ASM_ASSERT(eq)
138#endif
139 b plat_get_my_stack
140endfunc_deprecated platform_get_stack
141
142 /* -----------------------------------------------------
143 * void platform_set_stack (unsigned long mpidr)
144 *
145 * For the current CPU, this function sets the stack pointer
146 * to a stack allocated in normal memory. The
147 * 'mpidr' should correspond to that of the current CPU.
148 * This function is deprecated and plat_get_my_stack()
149 * should be used instead.
150 * -----------------------------------------------------
151 */
152func_deprecated platform_set_stack
Antonio Nino Diaz7c65c1e2017-04-20 09:58:28 +0100153#if ENABLE_ASSERTIONS
Soby Mathew70716d62015-07-13 16:26:11 +0100154 mrs x1, mpidr_el1
155 cmp x0, x1
156 ASM_ASSERT(eq)
157#endif
158 b plat_set_my_stack
159endfunc_deprecated platform_set_stack
Soby Mathew981487a2015-07-13 14:10:57 +0100160
Andrew Thoelke65668f92014-03-20 10:48:23 +0000161 /* -----------------------------------------------------
Soby Mathewa0fedc42016-06-16 14:52:04 +0100162 * uintptr_t plat_get_my_stack ()
Soby Mathewb0082d22015-04-09 13:40:55 +0100163 *
164 * For the current CPU, this function returns the stack
165 * pointer for a stack allocated in device memory.
166 * -----------------------------------------------------
167 */
168func plat_get_my_stack
169 mov x10, x30 // lr
170 get_my_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE
171 ret x10
172endfunc plat_get_my_stack
173
174 /* -----------------------------------------------------
175 * void plat_set_my_stack ()
176 *
177 * For the current CPU, this function sets the stack
178 * pointer to a stack allocated in normal memory.
179 * -----------------------------------------------------
180 */
181func plat_set_my_stack
182 mov x9, x30 // lr
183 bl plat_get_my_stack
184 mov sp, x0
185 ret x9
186endfunc plat_set_my_stack
187
Soby Mathew49473e42015-06-10 13:49:59 +0100188#endif /*__ENABLE_PLAT_COMPAT__*/
189
Soby Mathewb0082d22015-04-09 13:40:55 +0100190 /* -----------------------------------------------------
Achin Gupta9c60d802014-06-26 11:12:37 +0100191 * Per-cpu stacks in normal memory. Each cpu gets a
192 * stack of PLATFORM_STACK_SIZE bytes.
Andrew Thoelke65668f92014-03-20 10:48:23 +0000193 * -----------------------------------------------------
194 */
195declare_stack platform_normal_stacks, tzfw_normal_stacks, \
Soby Mathewbfdbecf2016-06-09 17:16:35 +0100196 PLATFORM_STACK_SIZE, PLATFORM_CORE_COUNT, \
197 CACHE_WRITEBACK_GRANULE