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