• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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