/ duct-tape / xnu / osfmk / arm / dwarf_unwind.h
dwarf_unwind.h
  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_ */