xref: /rk3399_ARM-atf/include/common/asm_macros_common.S (revision 09d40e0e08283a249e7dce0e106c07c5141f9b7e)
1/*
2 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#ifndef ASM_MACROS_COMMON_S
7#define ASM_MACROS_COMMON_S
8
9	/*
10	 * This macro is used to create a function label and place the
11	 * code into a separate text section based on the function name
12	 * to enable elimination of unused code during linking. It also adds
13	 * basic debug information to enable call stack printing most of the
14	 * time. The optional _align parameter can be used to force a
15	 * non-standard alignment (indicated in powers of 2). The default is
16	 * _align=2 because both Aarch32 and Aarch64 instructions must be
17	 * word aligned. Do *not* try to use a raw .align directive. Since func
18	 * switches to a new section, this would not have the desired effect.
19	 */
20	.macro func _name, _align=2
21	/*
22	 * Add Call Frame Information entry in the .debug_frame section for
23	 * debugger consumption. This enables callstack printing in debuggers.
24	 * This does not use any space in the final loaded binary, only in the
25	 * ELF file.
26	 * Note that a function manipulating the CFA pointer location (i.e. the
27	 * x29 frame pointer on AArch64) should declare it using the
28	 * appropriate .cfi* directives, or be prepared to have a degraded
29	 * debugging experience.
30	 */
31	.cfi_sections .debug_frame
32	.section .text.asm.\_name, "ax"
33	.type \_name, %function
34	/*
35	 * .cfi_startproc and .cfi_endproc are needed to output entries in
36	 * .debug_frame
37	 */
38	.cfi_startproc
39	.align \_align
40	\_name:
41	.endm
42
43	/*
44	 * This macro is used to mark the end of a function.
45	 */
46	.macro endfunc _name
47	.cfi_endproc
48	.size \_name, . - \_name
49	.endm
50
51	/*
52	 * Theses macros are used to create function labels for deprecated
53	 * APIs. If ERROR_DEPRECATED is non zero, the callers of these APIs
54	 * will fail to link and cause build failure.
55	 */
56#if ERROR_DEPRECATED
57	.macro func_deprecated _name
58	func deprecated\_name
59	.endm
60
61	.macro endfunc_deprecated _name
62	endfunc deprecated\_name
63	.endm
64#else
65	.macro func_deprecated _name
66	func \_name
67	.endm
68
69	.macro endfunc_deprecated _name
70	endfunc \_name
71	.endm
72#endif
73
74	/*
75	 * Helper assembler macro to count trailing zeros. The output is
76	 * populated in the `TZ_COUNT` symbol.
77	 */
78	.macro count_tz _value, _tz_count
79	.if \_value
80	  count_tz "(\_value >> 1)", "(\_tz_count + 1)"
81	.else
82	  .equ TZ_COUNT, (\_tz_count - 1)
83	.endif
84	.endm
85
86	/*
87	 * This macro declares an array of 1 or more stacks, properly
88	 * aligned and in the requested section
89	 */
90#define DEFAULT_STACK_ALIGN	(1 << 6)   /* In case the caller doesnt provide alignment */
91
92	.macro declare_stack _name, _section, _size, _count, _align=DEFAULT_STACK_ALIGN
93	count_tz \_align, 0
94	.if (\_align - (1 << TZ_COUNT))
95	  .error "Incorrect stack alignment specified (Must be a power of 2)."
96	.endif
97	.if ((\_size & ((1 << TZ_COUNT) - 1)) <> 0)
98	  .error "Stack size not correctly aligned"
99	.endif
100	.section    \_section, "aw", %nobits
101	.align TZ_COUNT
102	\_name:
103	.space ((\_count) * (\_size)), 0
104	.endm
105
106
107#endif /* ASM_MACROS_COMMON_S */
108