platform_mp_stack.S 2.66 KB
Newer Older
1
/*
2
 * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
7
8
 */

#include <arch.h>
#include <asm_macros.S>
9
#include <assert_macros.S>
10
#include <platform_def.h>
11
12

	.local	platform_normal_stacks
13
14
	.weak	plat_get_my_stack
	.weak	plat_set_my_stack
15

16
	/* ---------------------------------------------------------------------
17
18
19
20
21
22
23
	 * When the compatility layer is disabled, the platform APIs
	 * plat_get_my_stack() and plat_set_my_stack() are supported by the
	 * platform and the previous APIs platform_get_stack() and
	 * platform_set_stack() are defined in terms of new APIs making use of
	 * the fact that they are only ever invoked for the current CPU.  This
	 * is to enable components of Trusted Firmware like SPDs using the old
	 * platform APIs to continue to work.
24
25
26
	 * --------------------------------------------------------------------
	 */

27
	/* -----------------------------------------------------
28
	 * uintptr_t plat_get_my_stack ()
29
30
31
32
33
34
	 *
	 * For the current CPU, this function returns the stack
	 * pointer for a stack allocated in device memory.
	 * -----------------------------------------------------
	 */
func plat_get_my_stack
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#if (defined(IMAGE_BL31) && RECLAIM_INIT_CODE)
#if (PLATFORM_CORE_COUNT == 1)
	/* Single CPU */
	adrp	x0, __PRIMARY_STACK__
	add	x0, x0, :lo12:__PRIMARY_STACK__
	ret
#else
	mov	x10, x30
	bl	plat_my_core_pos
	cbnz	x0, 2f

	/* Primary CPU */
	adrp	x0, __PRIMARY_STACK__
	add	x0, x0, :lo12:__PRIMARY_STACK__
	ret	x10

	/* Secondary CPU */
2:	sub	x0, x0, #(PLATFORM_CORE_COUNT - 1)
	adrp	x1, __STACKS_END__
	adrp	x2, __STACK_SIZE__
	add	x1, x1, :lo12:__STACKS_END__
	add	x2, x2, :lo12:__STACK_SIZE__

	madd	x0, x0, x2, x1
	bic	x0, x0, #(CACHE_WRITEBACK_GRANULE - 1)
	ret	x10
#endif
	.word	platform_normal_stacks

#else /* !(IMAGE_BL31 && RECLAIM_INIT_CODE) */
	mov	x10, x30
66
67
	get_my_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE
	ret	x10
68
69

#endif /* IMAGE_BL31 && RECLAIM_INIT_CODE */
70
71
72
73
74
75
76
77
78
79
endfunc plat_get_my_stack

	/* -----------------------------------------------------
	 * void plat_set_my_stack ()
	 *
	 * For the current CPU, this function sets the stack
	 * pointer to a stack allocated in normal memory.
	 * -----------------------------------------------------
	 */
func plat_set_my_stack
80
	mov	x9, x30
81
82
83
84
85
	bl 	plat_get_my_stack
	mov	sp, x0
	ret	x9
endfunc plat_set_my_stack

86
	/* -----------------------------------------------------
87
	 * Per-CPU stacks in normal memory. Each CPU gets a
88
	 * stack of PLATFORM_STACK_SIZE bytes.
89
90
91
	 * -----------------------------------------------------
	 */
declare_stack platform_normal_stacks, tzfw_normal_stacks, \
92
93
		PLATFORM_STACK_SIZE, PLATFORM_CORE_COUNT, \
		CACHE_WRITEBACK_GRANULE