Add support for Branch Target Identification
[project/bcm63xx/atf.git] / include / common / asm_macros_common.S
1 /*
2 * Copyright (c) 2013-2019, 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 #if ENABLE_BTI
42 /* When Branch Target Identification is enabled, insert "bti jc"
43 * instruction to enable indirect calls and branches
44 */
45 bti jc
46 #endif
47 .endm
48
49 /*
50 * This macro is used to mark the end of a function.
51 */
52 .macro endfunc _name
53 .cfi_endproc
54 .size \_name, . - \_name
55 .endm
56
57 /*
58 * Theses macros are used to create function labels for deprecated
59 * APIs. If ERROR_DEPRECATED is non zero, the callers of these APIs
60 * will fail to link and cause build failure.
61 */
62 #if ERROR_DEPRECATED
63 .macro func_deprecated _name
64 func deprecated\_name
65 .endm
66
67 .macro endfunc_deprecated _name
68 endfunc deprecated\_name
69 .endm
70 #else
71 .macro func_deprecated _name
72 func \_name
73 .endm
74
75 .macro endfunc_deprecated _name
76 endfunc \_name
77 .endm
78 #endif
79
80 /*
81 * Helper assembler macro to count trailing zeros. The output is
82 * populated in the `TZ_COUNT` symbol.
83 */
84 .macro count_tz _value, _tz_count
85 .if \_value
86 count_tz "(\_value >> 1)", "(\_tz_count + 1)"
87 .else
88 .equ TZ_COUNT, (\_tz_count - 1)
89 .endif
90 .endm
91
92 /*
93 * This macro declares an array of 1 or more stacks, properly
94 * aligned and in the requested section
95 */
96 #define DEFAULT_STACK_ALIGN (1 << 6) /* In case the caller doesnt provide alignment */
97
98 .macro declare_stack _name, _section, _size, _count, _align=DEFAULT_STACK_ALIGN
99 count_tz \_align, 0
100 .if (\_align - (1 << TZ_COUNT))
101 .error "Incorrect stack alignment specified (Must be a power of 2)."
102 .endif
103 .if ((\_size & ((1 << TZ_COUNT) - 1)) <> 0)
104 .error "Stack size not correctly aligned"
105 .endif
106 .section \_section, "aw", %nobits
107 .align TZ_COUNT
108 \_name:
109 .space ((\_count) * (\_size)), 0
110 .endm
111
112
113 #endif /* ASM_MACROS_COMMON_S */