1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * Dwarf2 data encoding flags. 19 */ 20 21 #define DW_EH_PE_absptr 0x00 22 #define DW_EH_PE_omit 0xff 23 #define DW_EH_PE_uleb128 0x01 24 #define DW_EH_PE_udata2 0x02 25 #define DW_EH_PE_udata4 0x03 26 #define DW_EH_PE_udata8 0x04 27 #define DW_EH_PE_sleb128 0x09 28 #define DW_EH_PE_sdata2 0x0A 29 #define DW_EH_PE_sdata4 0x0B 30 #define DW_EH_PE_sdata8 0x0C 31 #define DW_EH_PE_signed 0x08 32 #define DW_EH_PE_pcrel 0x10 33 #define DW_EH_PE_textrel 0x20 34 #define DW_EH_PE_datarel 0x30 35 #define DW_EH_PE_funcrel 0x40 36 #define DW_EH_PE_aligned 0x50 37 #define DW_EH_PE_indirect 0x80 38 39 /* 40 * Dwarf2 call frame instructions. 41 */ 42 43 typedef enum { 44 DW_CFA_advance_loc = 0x40, 45 DW_CFA_offset = 0x80, 46 DW_CFA_restore = 0xc0, 47 DW_CFA_nop = 0x00, 48 DW_CFA_set_loc = 0x01, 49 DW_CFA_advance_loc1 = 0x02, 50 DW_CFA_advance_loc2 = 0x03, 51 DW_CFA_advance_loc4 = 0x04, 52 DW_CFA_offset_extended = 0x05, 53 DW_CFA_restore_extended = 0x06, 54 DW_CFA_undefined = 0x07, 55 DW_CFA_same_value = 0x08, 56 DW_CFA_register = 0x09, 57 DW_CFA_remember_state = 0x0a, 58 DW_CFA_restore_state = 0x0b, 59 DW_CFA_def_cfa = 0x0c, 60 DW_CFA_def_cfa_register = 0x0d, 61 DW_CFA_def_cfa_offset = 0x0e 62 } dwarf_CFA; 63 64 /* 65 * eh_frame_hdr information. 66 */ 67 68 typedef struct { 69 uint8_t version; 70 uint8_t eh_frame_ptr_enc; 71 uint8_t fde_count_enc; 72 uint8_t fde_table_enc; 73 uintptr_t eh_frame_ptr; 74 uint32_t fde_count; 75 } eh_frame_hdr_info_t; 76 77 /* 78 * CIE information. 79 */ 80 81 typedef struct { 82 uint8_t version; 83 uint32_t code_align; 84 uint32_t data_align; 85 uint32_t reg; 86 uint32_t aug_z; 87 uint8_t aug_L; 88 uint8_t aug_R; 89 uint8_t aug_S; 90 uint32_t aug_P; 91 } cie_info_t; 92 93 /* 94 * FDE information. 95 */ 96 97 typedef struct { 98 uint32_t start; 99 uint32_t length; // number of instructions covered by FDE 100 uint32_t aug_z; 101 uint32_t aug_L; 102 } fde_info_t; 103 104 /* 105 * Dwarf state. 106 */ 107 108 /* Stack of states: required for DW_CFA_remember_state/DW_CFA_restore_state 109 30 should be enough */ 110 #define DWARF_STATES_STACK 30 111 112 typedef struct { 113 char rule; // rule: o - offset(value); r - register(value) 114 uint32_t value; // value 115 } reg_rule_t; 116 117 /* Dwarf preserved number of registers for x86. */ 118 119 #define DWARF_REGISTERS 17 120 121 typedef struct { 122 uintptr_t loc; // location (ip) 123 uint8_t cfa_reg; // index of register where CFA location stored 124 intptr_t cfa_off; // offset 125 reg_rule_t regs[DWARF_REGISTERS]; // dwarf preserved registers for x86 126 } dwarf_state_t; 127 128 /* DWARF registers we are caring about. */ 129 130 #define DWARF_EAX 0 131 #define DWARF_ECX 1 132 #define DWARF_EDX 2 133 #define DWARF_EBX 3 134 #define DWARF_ESP 4 135 #define DWARF_EBP 5 136 #define DWARF_ESI 6 137 #define DWARF_EDI 7 138 #define DWARF_EIP 8 139 140 141