1738b1fd7SSoby Mathew/* 2*64726e6dSJulius Werner * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved. 3738b1fd7SSoby Mathew * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5738b1fd7SSoby Mathew */ 6738b1fd7SSoby Mathew#ifndef __ASM_MACROS_COMMON_S__ 7738b1fd7SSoby Mathew#define __ASM_MACROS_COMMON_S__ 8738b1fd7SSoby Mathew 9738b1fd7SSoby Mathew /* 10738b1fd7SSoby Mathew * This macro is used to create a function label and place the 11738b1fd7SSoby Mathew * code into a separate text section based on the function name 12b91d935fSDouglas Raillard * to enable elimination of unused code during linking. It also adds 13b91d935fSDouglas Raillard * basic debug information to enable call stack printing most of the 14*64726e6dSJulius Werner * time. The optional _align parameter can be used to force a 15*64726e6dSJulius Werner * non-standard alignment (indicated in powers of 2). Do *not* try to 16*64726e6dSJulius Werner * use a raw .align directive. Since func switches to a new section, 17*64726e6dSJulius Werner * this would not have the desired effect. 18738b1fd7SSoby Mathew */ 19*64726e6dSJulius Werner .macro func _name, _align=-1 20b91d935fSDouglas Raillard /* 21b91d935fSDouglas Raillard * Add Call Frame Information entry in the .debug_frame section for 22b91d935fSDouglas Raillard * debugger consumption. This enables callstack printing in debuggers. 23b91d935fSDouglas Raillard * This does not use any space in the final loaded binary, only in the 24b91d935fSDouglas Raillard * ELF file. 25b91d935fSDouglas Raillard * Note that a function manipulating the CFA pointer location (i.e. the 26b91d935fSDouglas Raillard * x29 frame pointer on AArch64) should declare it using the 27b91d935fSDouglas Raillard * appropriate .cfi* directives, or be prepared to have a degraded 28b91d935fSDouglas Raillard * debugging experience. 29b91d935fSDouglas Raillard */ 30b91d935fSDouglas Raillard .cfi_sections .debug_frame 31738b1fd7SSoby Mathew .section .text.\_name, "ax" 32738b1fd7SSoby Mathew .type \_name, %function 33738b1fd7SSoby Mathew .func \_name 34b91d935fSDouglas Raillard /* 35b91d935fSDouglas Raillard * .cfi_startproc and .cfi_endproc are needed to output entries in 36b91d935fSDouglas Raillard * .debug_frame 37b91d935fSDouglas Raillard */ 38b91d935fSDouglas Raillard .cfi_startproc 39*64726e6dSJulius Werner .if (\_align) != -1 40*64726e6dSJulius Werner .align \_align 41*64726e6dSJulius Werner .endif 42738b1fd7SSoby Mathew \_name: 43738b1fd7SSoby Mathew .endm 44738b1fd7SSoby Mathew 45738b1fd7SSoby Mathew /* 46738b1fd7SSoby Mathew * This macro is used to mark the end of a function. 47738b1fd7SSoby Mathew */ 48738b1fd7SSoby Mathew .macro endfunc _name 49738b1fd7SSoby Mathew .endfunc 50b91d935fSDouglas Raillard .cfi_endproc 51738b1fd7SSoby Mathew .size \_name, . - \_name 52738b1fd7SSoby Mathew .endm 53738b1fd7SSoby Mathew 54738b1fd7SSoby Mathew /* 55738b1fd7SSoby Mathew * Theses macros are used to create function labels for deprecated 56738b1fd7SSoby Mathew * APIs. If ERROR_DEPRECATED is non zero, the callers of these APIs 57738b1fd7SSoby Mathew * will fail to link and cause build failure. 58738b1fd7SSoby Mathew */ 59738b1fd7SSoby Mathew#if ERROR_DEPRECATED 60738b1fd7SSoby Mathew .macro func_deprecated _name 61738b1fd7SSoby Mathew func deprecated\_name 62738b1fd7SSoby Mathew .endm 63738b1fd7SSoby Mathew 64738b1fd7SSoby Mathew .macro endfunc_deprecated _name 65738b1fd7SSoby Mathew endfunc deprecated\_name 66738b1fd7SSoby Mathew .endm 67738b1fd7SSoby Mathew#else 68738b1fd7SSoby Mathew .macro func_deprecated _name 69738b1fd7SSoby Mathew func \_name 70738b1fd7SSoby Mathew .endm 71738b1fd7SSoby Mathew 72738b1fd7SSoby Mathew .macro endfunc_deprecated _name 73738b1fd7SSoby Mathew endfunc \_name 74738b1fd7SSoby Mathew .endm 75738b1fd7SSoby Mathew#endif 76738b1fd7SSoby Mathew 77738b1fd7SSoby Mathew /* 78738b1fd7SSoby Mathew * Helper assembler macro to count trailing zeros. The output is 79738b1fd7SSoby Mathew * populated in the `TZ_COUNT` symbol. 80738b1fd7SSoby Mathew */ 81738b1fd7SSoby Mathew .macro count_tz _value, _tz_count 82738b1fd7SSoby Mathew .if \_value 83738b1fd7SSoby Mathew count_tz "(\_value >> 1)", "(\_tz_count + 1)" 84738b1fd7SSoby Mathew .else 85738b1fd7SSoby Mathew .equ TZ_COUNT, (\_tz_count - 1) 86738b1fd7SSoby Mathew .endif 87738b1fd7SSoby Mathew .endm 88738b1fd7SSoby Mathew 89738b1fd7SSoby Mathew /* 90738b1fd7SSoby Mathew * This macro declares an array of 1 or more stacks, properly 91738b1fd7SSoby Mathew * aligned and in the requested section 92738b1fd7SSoby Mathew */ 93738b1fd7SSoby Mathew#define DEFAULT_STACK_ALIGN (1 << 6) /* In case the caller doesnt provide alignment */ 94738b1fd7SSoby Mathew 95738b1fd7SSoby Mathew .macro declare_stack _name, _section, _size, _count, _align=DEFAULT_STACK_ALIGN 96738b1fd7SSoby Mathew count_tz \_align, 0 97738b1fd7SSoby Mathew .if (\_align - (1 << TZ_COUNT)) 98738b1fd7SSoby Mathew .error "Incorrect stack alignment specified (Must be a power of 2)." 99738b1fd7SSoby Mathew .endif 100738b1fd7SSoby Mathew .if ((\_size & ((1 << TZ_COUNT) - 1)) <> 0) 101738b1fd7SSoby Mathew .error "Stack size not correctly aligned" 102738b1fd7SSoby Mathew .endif 103738b1fd7SSoby Mathew .section \_section, "aw", %nobits 104738b1fd7SSoby Mathew .align TZ_COUNT 105738b1fd7SSoby Mathew \_name: 106738b1fd7SSoby Mathew .space ((\_count) * (\_size)), 0 107738b1fd7SSoby Mathew .endm 108738b1fd7SSoby Mathew 109738b1fd7SSoby Mathew 110738b1fd7SSoby Mathew#endif /* __ASM_MACROS_COMMON_S__ */ 111