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 */ 114