winedbg: Added support for variables with thread storage.
[wine] / programs / winedbg / be_sparc.c
1 /*
2  * Debugger Sparc specific functions
3  *
4  * Copyright 2010 Austin English
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(__sparc__)
24
25 static unsigned be_sparc_get_addr(HANDLE hThread, const CONTEXT* ctx,
26                                  enum be_cpu_addr bca, ADDRESS64* addr)
27 {
28     dbg_printf("not done for Sparc\n");
29     return FALSE;
30 }
31
32 static unsigned be_sparc_get_register_info(int regno, enum be_cpu_addr* kind)
33 {
34     dbg_printf("not done for Sparc\n");
35     return FALSE;
36 }
37
38 static void be_sparc_single_step(CONTEXT* ctx, unsigned enable)
39 {
40     dbg_printf("not done for Sparc\n");
41 }
42
43 static void be_sparc_print_context(HANDLE hThread, const CONTEXT* ctx, int all_regs)
44 {
45     dbg_printf("not done for Sparc\n");
46 }
47
48 static void be_sparc_print_segment_info(HANDLE hThread, const CONTEXT* ctx)
49 {
50     dbg_printf("not done for Sparc\n");
51 }
52
53 static struct dbg_internal_var be_sparc_ctx[] =
54 {
55     {0, NULL, 0, dbg_itype_none}
56 };
57
58 static unsigned be_sparc_is_step_over_insn(const void* insn)
59 {
60     dbg_printf("not done for Sparc\n");
61     return FALSE;
62 }
63
64 static unsigned be_sparc_is_function_return(const void* insn)
65 {
66     dbg_printf("not done for Sparc\n");
67     return FALSE;
68 }
69
70 static unsigned be_sparc_is_break_insn(const void* insn)
71 {
72     dbg_printf("not done for Sparc\n");
73     return FALSE;
74 }
75
76 static unsigned be_sparc_is_func_call(const void* insn, ADDRESS64* callee)
77 {
78     return FALSE;
79 }
80
81 static unsigned be_sparc_is_jump(const void* insn, ADDRESS64* jumpee)
82 {
83     return FALSE;
84 }
85
86 static void be_sparc_disasm_one_insn(ADDRESS64* addr, int display)
87 {
88     dbg_printf("not done for Sparc\n");
89 }
90
91 static unsigned be_sparc_insert_Xpoint(HANDLE hProcess, const struct be_process_io* pio,
92                                        CONTEXT* ctx, enum be_xpoint_type type,
93                                        void* addr, unsigned long* val, unsigned size)
94 {
95     dbg_printf("not done for Sparc\n");
96     return 0;
97 }
98
99 static unsigned be_sparc_remove_Xpoint(HANDLE hProcess, const struct be_process_io* pio,
100                                        CONTEXT* ctx, enum be_xpoint_type type,
101                                        void* addr, unsigned long val, unsigned size)
102 {
103     dbg_printf("not done for Sparc\n");
104     return FALSE;
105 }
106
107 static unsigned be_sparc_is_watchpoint_set(const CONTEXT* ctx, unsigned idx)
108 {
109     dbg_printf("not done for Sparc\n");
110     return FALSE;
111 }
112
113 static void be_sparc_clear_watchpoint(CONTEXT* ctx, unsigned idx)
114 {
115     dbg_printf("not done for Sparc\n");
116 }
117
118 static int be_sparc_adjust_pc_for_break(CONTEXT* ctx, BOOL way)
119 {
120     dbg_printf("not done for Sparc\n");
121     return 0;
122 }
123
124 static int be_sparc_fetch_integer(const struct dbg_lvalue* lvalue, unsigned size,
125                                   unsigned ext_sign, LONGLONG* ret)
126 {
127     dbg_printf("not done for Sparc\n");
128     return FALSE;
129 }
130
131 static int be_sparc_fetch_float(const struct dbg_lvalue* lvalue, unsigned size,
132                                 long double* ret)
133 {
134     dbg_printf("not done for Sparc\n");
135     return FALSE;
136 }
137
138 struct backend_cpu be_sparc =
139 {
140     IMAGE_FILE_MACHINE_SPARC,
141     4,
142     be_cpu_linearize,
143     be_cpu_build_addr,
144     be_sparc_get_addr,
145     be_sparc_get_register_info,
146     be_sparc_single_step,
147     be_sparc_print_context,
148     be_sparc_print_segment_info,
149     be_sparc_ctx,
150     be_sparc_is_step_over_insn,
151     be_sparc_is_function_return,
152     be_sparc_is_break_insn,
153     be_sparc_is_func_call,
154     be_sparc_is_jump,
155     be_sparc_disasm_one_insn,
156     be_sparc_insert_Xpoint,
157     be_sparc_remove_Xpoint,
158     be_sparc_is_watchpoint_set,
159     be_sparc_clear_watchpoint,
160     be_sparc_adjust_pc_for_break,
161     be_sparc_fetch_integer,
162     be_sparc_fetch_float,
163 };
164 #endif