diff --git a/include/common/asm_macros_common.S b/include/common/asm_macros_common.S index 023124b30..4e9f8bb9d 100644 --- a/include/common/asm_macros_common.S +++ b/include/common/asm_macros_common.S @@ -33,12 +33,30 @@ /* * This macro is used to create a function label and place the * code into a separate text section based on the function name - * to enable elimination of unused code during linking + * to enable elimination of unused code during linking. It also adds + * basic debug information to enable call stack printing most of the + * time. */ .macro func _name + /* + * Add Call Frame Information entry in the .debug_frame section for + * debugger consumption. This enables callstack printing in debuggers. + * This does not use any space in the final loaded binary, only in the + * ELF file. + * Note that a function manipulating the CFA pointer location (i.e. the + * x29 frame pointer on AArch64) should declare it using the + * appropriate .cfi* directives, or be prepared to have a degraded + * debugging experience. + */ + .cfi_sections .debug_frame .section .text.\_name, "ax" .type \_name, %function .func \_name + /* + * .cfi_startproc and .cfi_endproc are needed to output entries in + * .debug_frame + */ + .cfi_startproc \_name: .endm @@ -47,6 +65,7 @@ */ .macro endfunc _name .endfunc + .cfi_endproc .size \_name, . - \_name .endm