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