1 /* 2 * Copyright (c) 2019 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29 30 #ifndef _ARM_DWARF_UNWIND_H_ 31 #define _ARM_DWARF_UNWIND_H_ 32 33 /* 34 * This file contains the architecture specific DWARF definitions needed for unwind 35 * information added to trap handlers. 36 */ 37 38 #define DWARF_ARM_R0 0 39 #define DWARF_ARM_R1 1 40 #define DWARF_ARM_R2 2 41 #define DWARF_ARM_R3 3 42 #define DWARF_ARM_R4 4 43 #define DWARF_ARM_R5 5 44 #define DWARF_ARM_R6 6 45 #define DWARF_ARM_R7 7 46 #define DWARF_ARM_R8 8 47 #define DWARF_ARM_R9 9 48 #define DWARF_ARM_R10 10 49 #define DWARF_ARM_R11 11 50 #define DWARF_ARM_R12 12 51 #define DWARF_ARM_SP 13 52 #define DWARF_ARM_LR 14 53 #define DWARF_ARM_PC 15 54 55 #define DW_OP_breg0 0x70 56 #define DW_OP_breg8 0x78 57 #define DW_OP_breg13 0x7d 58 #define DW_CFA_expression 0x10 59 #define DW_OP_deref 0x06 60 #define DW_OP_constu 0x10 61 #define DW_OP_plus 0x22 62 63 #define DW_FORM_LENGTH 6 64 #define DWARF_OFFSET_0 0 65 66 #define DWARF_ARM_R0_OFFSET 0 67 #define DWARF_ARM_R1_OFFSET 4 68 #define DWARF_ARM_R2_OFFSET 8 69 #define DWARF_ARM_R3_OFFSET 12 70 #define DWARF_ARM_R4_OFFSET 16 71 #define DWARF_ARM_R5_OFFSET 20 72 #define DWARF_ARM_R6_OFFSET 24 73 #define DWARF_ARM_R7_OFFSET 28 74 #define DWARF_ARM_R8_OFFSET 32 75 #define DWARF_ARM_R9_OFFSET 36 76 #define DWARF_ARM_R10_OFFSET 40 77 #define DWARF_ARM_R11_OFFSET 44 78 #define DWARF_ARM_R12_OFFSET 48 79 #define DWARF_ARM_SP_OFFSET 52 80 #define DWARF_ARM_LR_OFFSET 56 81 #define DWARF_ARM_PC_OFFSET 60 82 83 /* The actual unwind directives added to trap handlers to let the debugger know where the register state is stored */ 84 85 /* Unwind Prologue added to each function to indicate the start of the unwind information. */ 86 87 #define UNWIND_PROLOGUE \ 88 .cfi_sections .eh_frame ;\ 89 .cfi_startproc ;\ 90 .cfi_signal_frame ;\ 91 92 93 /* Unwind Epilogue added to each function to indicate the end of the unwind information */ 94 95 #define UNWIND_EPILOGUE .cfi_endproc 96 97 98 99 #define UNWIND_DIRECTIVES \ 100 .cfi_escape DW_CFA_expression, DWARF_ARM_R0, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R0_OFFSET, DW_OP_plus ;\ 101 .cfi_escape DW_CFA_expression, DWARF_ARM_R1, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R1_OFFSET, DW_OP_plus ;\ 102 .cfi_escape DW_CFA_expression, DWARF_ARM_R2, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R2_OFFSET, DW_OP_plus ;\ 103 .cfi_escape DW_CFA_expression, DWARF_ARM_R3, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R3_OFFSET, DW_OP_plus ;\ 104 .cfi_escape DW_CFA_expression, DWARF_ARM_R4, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R4_OFFSET, DW_OP_plus ;\ 105 .cfi_escape DW_CFA_expression, DWARF_ARM_R5, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R5_OFFSET, DW_OP_plus ;\ 106 .cfi_escape DW_CFA_expression, DWARF_ARM_R6, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R6_OFFSET, DW_OP_plus ;\ 107 .cfi_escape DW_CFA_expression, DWARF_ARM_R7, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R7_OFFSET, DW_OP_plus ;\ 108 .cfi_escape DW_CFA_expression, DWARF_ARM_R8, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R8_OFFSET, DW_OP_plus ;\ 109 .cfi_escape DW_CFA_expression, DWARF_ARM_R9, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R9_OFFSET, DW_OP_plus ;\ 110 .cfi_escape DW_CFA_expression, DWARF_ARM_R10, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R10_OFFSET, DW_OP_plus ;\ 111 .cfi_escape DW_CFA_expression, DWARF_ARM_R11, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R11_OFFSET, DW_OP_plus ;\ 112 .cfi_escape DW_CFA_expression, DWARF_ARM_R12, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_R12_OFFSET, DW_OP_plus ;\ 113 .cfi_escape DW_CFA_expression, DWARF_ARM_SP, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_SP_OFFSET, DW_OP_plus ;\ 114 .cfi_escape DW_CFA_expression, DWARF_ARM_LR, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_LR_OFFSET, DW_OP_plus ;\ 115 .cfi_escape DW_CFA_expression, DWARF_ARM_PC, DW_FORM_LENGTH, DW_OP_breg13, DWARF_OFFSET_0, DW_OP_deref, DW_OP_constu, DWARF_ARM_PC_OFFSET, DW_OP_plus ;\ 116 117 #endif /* _ARM_DWARF_UNWIND_H_ */ 118