blob: fd0ea81d23d66ce81e8e004b8428dba4716bfcf0 [file] [log] [blame]
Soby Mathewb9ff2fd2016-07-08 15:26:35 +01001/*
Alexei Fedorov90f2e882019-05-24 12:17:09 +01002 * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved.
Soby Mathewb9ff2fd2016-07-08 15:26:35 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Soby Mathewb9ff2fd2016-07-08 15:26:35 +01005 */
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +00006#ifndef ASM_MACROS_COMMON_S
7#define ASM_MACROS_COMMON_S
Soby Mathewb9ff2fd2016-07-08 15:26:35 +01008
Soby Mathewb9ff2fd2016-07-08 15:26:35 +01009 /*
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
Douglas Raillard1c0e2082016-11-21 14:12:32 +000012 * to enable elimination of unused code during linking. It also adds
13 * basic debug information to enable call stack printing most of the
Julius Wernerb4c75e92017-08-01 15:16:36 -070014 * time. The optional _align parameter can be used to force a
Masahiro Yamadabe1d3ef2017-08-31 14:29:34 +090015 * 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.
Soby Mathewb9ff2fd2016-07-08 15:26:35 +010019 */
Masahiro Yamadabe1d3ef2017-08-31 14:29:34 +090020 .macro func _name, _align=2
Douglas Raillard1c0e2082016-11-21 14:12:32 +000021 /*
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
Roberto Vargase4e342d2017-11-02 16:36:51 +000032 .section .text.asm.\_name, "ax"
Soby Mathewb9ff2fd2016-07-08 15:26:35 +010033 .type \_name, %function
Douglas Raillard1c0e2082016-11-21 14:12:32 +000034 /*
35 * .cfi_startproc and .cfi_endproc are needed to output entries in
36 * .debug_frame
37 */
38 .cfi_startproc
Masahiro Yamadabe1d3ef2017-08-31 14:29:34 +090039 .align \_align
Soby Mathewb9ff2fd2016-07-08 15:26:35 +010040 \_name:
Alexei Fedorov90f2e882019-05-24 12:17:09 +010041#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
Soby Mathewb9ff2fd2016-07-08 15:26:35 +010047 .endm
48
49 /*
50 * This macro is used to mark the end of a function.
51 */
52 .macro endfunc _name
Douglas Raillard1c0e2082016-11-21 14:12:32 +000053 .cfi_endproc
Soby Mathewb9ff2fd2016-07-08 15:26:35 +010054 .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
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +0000113#endif /* ASM_MACROS_COMMON_S */