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