winedbg: Implement be_x86_64_init_registers.
[wine] / programs / winedbg / be_x86_64.c
1 /*
2  * Debugger x86_64 specific functions
3  *
4  * Copyright 2004 Vincent BĂ©ron
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "debugger.h"
22
23 #if defined(__x86_64__)
24
25 static unsigned be_x86_64_get_addr(HANDLE hThread, const CONTEXT* ctx, 
26                                  enum be_cpu_addr bca, ADDRESS* addr)
27 {
28     dbg_printf("not done\n");
29     return FALSE;
30 }
31
32 static void be_x86_64_single_step(CONTEXT* ctx, unsigned enable)
33 {
34     dbg_printf("not done\n");
35 }
36
37 static void be_x86_64_print_context(HANDLE hThread, const CONTEXT* ctx)
38 {
39     dbg_printf("Context printing for x86_64 not done yet\n");
40 }
41
42 static void be_x86_64_print_segment_info(HANDLE hThread, const CONTEXT* ctx)
43 {
44 }
45
46 static struct dbg_internal_var be_x86_64_ctx[] =
47 {
48     {CV_AMD64_AL,       "AL",           (DWORD*)FIELD_OFFSET(CONTEXT, Rax),     dbg_itype_unsigned_char_int},
49     {CV_AMD64_BL,       "BL",           (DWORD*)FIELD_OFFSET(CONTEXT, Rbx),     dbg_itype_unsigned_char_int},
50     {CV_AMD64_CL,       "CL",           (DWORD*)FIELD_OFFSET(CONTEXT, Rcx),     dbg_itype_unsigned_char_int},
51     {CV_AMD64_DL,       "DL",           (DWORD*)FIELD_OFFSET(CONTEXT, Rdx),     dbg_itype_unsigned_char_int},
52     {CV_AMD64_AH,       "AH",           (DWORD*)(FIELD_OFFSET(CONTEXT, Rax)+1), dbg_itype_unsigned_char_int},
53     {CV_AMD64_BH,       "BH",           (DWORD*)(FIELD_OFFSET(CONTEXT, Rbx)+1), dbg_itype_unsigned_char_int},
54     {CV_AMD64_CH,       "CH",           (DWORD*)(FIELD_OFFSET(CONTEXT, Rcx)+1), dbg_itype_unsigned_char_int},
55     {CV_AMD64_DH,       "DH",           (DWORD*)(FIELD_OFFSET(CONTEXT, Rdx)+1), dbg_itype_unsigned_char_int},
56     {CV_AMD64_AX,       "AX",           (DWORD*)FIELD_OFFSET(CONTEXT, Rax),     dbg_itype_unsigned_short_int},
57     {CV_AMD64_BX,       "BX",           (DWORD*)FIELD_OFFSET(CONTEXT, Rbx),     dbg_itype_unsigned_short_int},
58     {CV_AMD64_CX,       "CX",           (DWORD*)FIELD_OFFSET(CONTEXT, Rcx),     dbg_itype_unsigned_short_int},
59     {CV_AMD64_DX,       "DX",           (DWORD*)FIELD_OFFSET(CONTEXT, Rdx),     dbg_itype_unsigned_short_int},
60     {CV_AMD64_SP,       "SP",           (DWORD*)FIELD_OFFSET(CONTEXT, Rsp),     dbg_itype_unsigned_short_int},
61     {CV_AMD64_BP,       "BP",           (DWORD*)FIELD_OFFSET(CONTEXT, Rbp),     dbg_itype_unsigned_short_int},
62     {CV_AMD64_SI,       "SI",           (DWORD*)FIELD_OFFSET(CONTEXT, Rsi),     dbg_itype_unsigned_short_int},
63     {CV_AMD64_DI,       "DI",           (DWORD*)FIELD_OFFSET(CONTEXT, Rdi),     dbg_itype_unsigned_short_int},
64     {CV_AMD64_EAX,      "EAX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rax),     dbg_itype_unsigned_int},
65     {CV_AMD64_EBX,      "EBX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rbx),     dbg_itype_unsigned_int},
66     {CV_AMD64_ECX,      "ECX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rcx),     dbg_itype_unsigned_int},
67     {CV_AMD64_EDX,      "EDX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rdx),     dbg_itype_unsigned_int},
68     {CV_AMD64_ESP,      "ESP",          (DWORD*)FIELD_OFFSET(CONTEXT, Rsp),     dbg_itype_unsigned_int},
69     {CV_AMD64_EBP,      "EBP",          (DWORD*)FIELD_OFFSET(CONTEXT, Rbp),     dbg_itype_unsigned_int},
70     {CV_AMD64_ESI,      "ESI",          (DWORD*)FIELD_OFFSET(CONTEXT, Rsi),     dbg_itype_unsigned_int},
71     {CV_AMD64_EDI,      "EDI",          (DWORD*)FIELD_OFFSET(CONTEXT, Rdi),     dbg_itype_unsigned_int},
72     {CV_AMD64_ES,       "ES",           (DWORD*)FIELD_OFFSET(CONTEXT, SegEs),   dbg_itype_unsigned_short_int},
73     {CV_AMD64_CS,       "CS",           (DWORD*)FIELD_OFFSET(CONTEXT, SegCs),   dbg_itype_unsigned_short_int},
74     {CV_AMD64_SS,       "SS",           (DWORD*)FIELD_OFFSET(CONTEXT, SegSs),   dbg_itype_unsigned_short_int},
75     {CV_AMD64_DS,       "DS",           (DWORD*)FIELD_OFFSET(CONTEXT, SegDs),   dbg_itype_unsigned_short_int},
76     {CV_AMD64_FS,       "FS",           (DWORD*)FIELD_OFFSET(CONTEXT, SegFs),   dbg_itype_unsigned_short_int},
77     {CV_AMD64_GS,       "GS",           (DWORD*)FIELD_OFFSET(CONTEXT, SegGs),   dbg_itype_unsigned_short_int},
78     {CV_AMD64_FLAGS,    "FLAGS",        (DWORD*)FIELD_OFFSET(CONTEXT, EFlags),  dbg_itype_unsigned_short_int},
79     {CV_AMD64_EFLAGS,   "EFLAGS",       (DWORD*)FIELD_OFFSET(CONTEXT, EFlags),  dbg_itype_unsigned_int},
80     {CV_AMD64_RIP,      "RIP",          (DWORD*)FIELD_OFFSET(CONTEXT, Rip),     dbg_itype_unsigned_int},
81     {CV_AMD64_RAX,      "RAX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rax),     dbg_itype_unsigned_long_int},
82     {CV_AMD64_RBX,      "RBX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rbx),     dbg_itype_unsigned_long_int},
83     {CV_AMD64_RCX,      "RCX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rcx),     dbg_itype_unsigned_long_int},
84     {CV_AMD64_RDX,      "RDX",          (DWORD*)FIELD_OFFSET(CONTEXT, Rdx),     dbg_itype_unsigned_long_int},
85     {CV_AMD64_RSP,      "RSP",          (DWORD*)FIELD_OFFSET(CONTEXT, Rsp),     dbg_itype_unsigned_long_int},
86     {CV_AMD64_RBP,      "RBP",          (DWORD*)FIELD_OFFSET(CONTEXT, Rbp),     dbg_itype_unsigned_long_int},
87     {CV_AMD64_RSI,      "RSI",          (DWORD*)FIELD_OFFSET(CONTEXT, Rsi),     dbg_itype_unsigned_long_int},
88     {CV_AMD64_RDI,      "RDI",          (DWORD*)FIELD_OFFSET(CONTEXT, Rdi),     dbg_itype_unsigned_long_int},
89     {CV_AMD64_R8,       "R8",           (DWORD*)FIELD_OFFSET(CONTEXT, R8),      dbg_itype_unsigned_long_int},
90     {CV_AMD64_R9,       "R9",           (DWORD*)FIELD_OFFSET(CONTEXT, R9),      dbg_itype_unsigned_long_int},
91     {CV_AMD64_R10,      "R10",          (DWORD*)FIELD_OFFSET(CONTEXT, R10),     dbg_itype_unsigned_long_int},
92     {CV_AMD64_R11,      "R11",          (DWORD*)FIELD_OFFSET(CONTEXT, R11),     dbg_itype_unsigned_long_int},
93     {CV_AMD64_R12,      "R12",          (DWORD*)FIELD_OFFSET(CONTEXT, R12),     dbg_itype_unsigned_long_int},
94     {CV_AMD64_R13,      "R13",          (DWORD*)FIELD_OFFSET(CONTEXT, R13),     dbg_itype_unsigned_long_int},
95     {CV_AMD64_R14,      "R14",          (DWORD*)FIELD_OFFSET(CONTEXT, R14),     dbg_itype_unsigned_long_int},
96     {CV_AMD64_R15,      "R15",          (DWORD*)FIELD_OFFSET(CONTEXT, R15),     dbg_itype_unsigned_long_int},
97     {0,                 NULL,           0,                                      dbg_itype_none}
98 };
99
100 static const struct dbg_internal_var* be_x86_64_init_registers(CONTEXT* ctx)
101 {
102     struct dbg_internal_var*    div;
103
104     for (div = be_x86_64_ctx; div->name; div++)
105         div->pval = (DWORD*)((char*)ctx + (DWORD_PTR)div->pval);
106     return be_x86_64_ctx;
107 }
108
109 static unsigned be_x86_64_is_step_over_insn(void* insn)
110 {
111     dbg_printf("not done\n");
112     return FALSE;
113 }
114
115 static unsigned be_x86_64_is_function_return(void* insn)
116 {
117     dbg_printf("not done\n");
118     return FALSE;
119 }
120
121 static unsigned be_x86_64_is_break_insn(void* insn)
122 {
123     dbg_printf("not done\n");
124     return FALSE;
125 }
126
127 static unsigned be_x86_64_is_func_call(void* insn, void** insn_callee)
128 {
129     return FALSE;
130 }
131
132 static void be_x86_64_disasm_one_insn(ADDRESS* addr, int display)
133 {
134     dbg_printf("Disasm NIY\n");
135 }
136
137 static unsigned be_x86_64_insert_Xpoint(HANDLE hProcess, const struct be_process_io* pio,
138                                        CONTEXT* ctx, enum be_xpoint_type type,
139                                        void* addr, unsigned long* val, unsigned size)
140 {
141     dbg_printf("not done\n");
142     return 0;
143 }
144
145 static unsigned be_x86_64_remove_Xpoint(HANDLE hProcess, const struct be_process_io* pio,
146                                        CONTEXT* ctx, enum be_xpoint_type type, 
147                                        void* addr, unsigned long val, unsigned size)
148 {
149     dbg_printf("not done\n");
150     return FALSE;
151 }
152
153 static unsigned be_x86_64_is_watchpoint_set(const CONTEXT* ctx, unsigned idx)
154 {
155     dbg_printf("not done\n");
156     return FALSE;
157 }
158
159 static void be_x86_64_clear_watchpoint(CONTEXT* ctx, unsigned idx)
160 {
161     dbg_printf("not done\n");
162 }
163
164 static int be_x86_64_adjust_pc_for_break(CONTEXT* ctx, BOOL way)
165 {
166     dbg_printf("not done\n");
167     return 0;
168 }
169
170 static int be_x86_64_fetch_integer(const struct dbg_lvalue* lvalue, unsigned size,
171                                   unsigned ext_sign, LONGLONG* ret)
172 {
173     dbg_printf("not done\n");
174     return FALSE;
175 }
176
177 static int be_x86_64_fetch_float(const struct dbg_lvalue* lvalue, unsigned size, 
178                                 long double* ret)
179 {
180     dbg_printf("not done\n");
181     return FALSE;
182 }
183
184 struct backend_cpu be_x86_64 =
185 {
186     be_cpu_linearize,
187     be_cpu_build_addr,
188     be_x86_64_get_addr,
189     be_x86_64_single_step,
190     be_x86_64_print_context,
191     be_x86_64_print_segment_info,
192     be_x86_64_init_registers,
193     be_x86_64_is_step_over_insn,
194     be_x86_64_is_function_return,
195     be_x86_64_is_break_insn,
196     be_x86_64_is_func_call,
197     be_x86_64_disasm_one_insn,
198     be_x86_64_insert_Xpoint,
199     be_x86_64_remove_Xpoint,
200     be_x86_64_is_watchpoint_set,
201     be_x86_64_clear_watchpoint,
202     be_x86_64_adjust_pc_for_break,
203     be_x86_64_fetch_integer,
204     be_x86_64_fetch_float,
205 };
206 #endif