1 /* Copyright (C) 2008-2014 Free Software Foundation, Inc.
3 This file is part of GDB.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "windows-tdep.h"
20 #include "gdb_obstack.h"
21 #include "xml-support.h"
28 #include "gdbthread.h"
31 #include "coff-pe-read.h"
33 #include "complaints.h"
35 #include "solib-target.h"
37 struct cmd_list_element *info_w32_cmdlist;
39 typedef struct thread_information_block_32
41 uint32_t current_seh; /* %fs:0x0000 */
42 uint32_t current_top_of_stack; /* %fs:0x0004 */
43 uint32_t current_bottom_of_stack; /* %fs:0x0008 */
44 uint32_t sub_system_tib; /* %fs:0x000c */
45 uint32_t fiber_data; /* %fs:0x0010 */
46 uint32_t arbitrary_data_slot; /* %fs:0x0014 */
47 uint32_t linear_address_tib; /* %fs:0x0018 */
48 uint32_t environment_pointer; /* %fs:0x001c */
49 uint32_t process_id; /* %fs:0x0020 */
50 uint32_t current_thread_id; /* %fs:0x0024 */
51 uint32_t active_rpc_handle; /* %fs:0x0028 */
52 uint32_t thread_local_storage; /* %fs:0x002c */
53 uint32_t process_environment_block; /* %fs:0x0030 */
54 uint32_t last_error_number; /* %fs:0x0034 */
56 thread_information_32;
58 typedef struct thread_information_block_64
60 uint64_t current_seh; /* %gs:0x0000 */
61 uint64_t current_top_of_stack; /* %gs:0x0008 */
62 uint64_t current_bottom_of_stack; /* %gs:0x0010 */
63 uint64_t sub_system_tib; /* %gs:0x0018 */
64 uint64_t fiber_data; /* %gs:0x0020 */
65 uint64_t arbitrary_data_slot; /* %gs:0x0028 */
66 uint64_t linear_address_tib; /* %gs:0x0030 */
67 uint64_t environment_pointer; /* %gs:0x0038 */
68 uint64_t process_id; /* %gs:0x0040 */
69 uint64_t current_thread_id; /* %gs:0x0048 */
70 uint64_t active_rpc_handle; /* %gs:0x0050 */
71 uint64_t thread_local_storage; /* %gs:0x0058 */
72 uint64_t process_environment_block; /* %gs:0x0060 */
73 uint64_t last_error_number; /* %gs:0x0068 */
75 thread_information_64;
78 static const char* TIB_NAME[] =
80 " current_seh ", /* %fs:0x0000 */
81 " current_top_of_stack ", /* %fs:0x0004 */
82 " current_bottom_of_stack ", /* %fs:0x0008 */
83 " sub_system_tib ", /* %fs:0x000c */
84 " fiber_data ", /* %fs:0x0010 */
85 " arbitrary_data_slot ", /* %fs:0x0014 */
86 " linear_address_tib ", /* %fs:0x0018 */
87 " environment_pointer ", /* %fs:0x001c */
88 " process_id ", /* %fs:0x0020 */
89 " current_thread_id ", /* %fs:0x0024 */
90 " active_rpc_handle ", /* %fs:0x0028 */
91 " thread_local_storage ", /* %fs:0x002c */
92 " process_environment_block ", /* %fs:0x0030 */
93 " last_error_number " /* %fs:0x0034 */
96 static const int MAX_TIB32 =
97 sizeof (thread_information_32) / sizeof (uint32_t);
98 static const int MAX_TIB64 =
99 sizeof (thread_information_64) / sizeof (uint64_t);
100 static const int FULL_TIB_SIZE = 0x1000;
102 static int maint_display_all_tib = 0;
104 /* Define Thread Local Base pointer type. */
107 windows_get_tlb_type (struct gdbarch *gdbarch)
109 static struct gdbarch *last_gdbarch = NULL;
110 static struct type *last_tlb_type = NULL;
111 struct type *dword_ptr_type, *dword32_type, *void_ptr_type;
112 struct type *peb_ldr_type, *peb_ldr_ptr_type;
113 struct type *peb_type, *peb_ptr_type, *list_type, *list_ptr_type;
114 struct type *module_list_ptr_type;
115 struct type *tib_type, *seh_type, *tib_ptr_type, *seh_ptr_type;
117 /* Do not rebuild type if same gdbarch as last time. */
118 if (last_tlb_type && last_gdbarch == gdbarch)
119 return last_tlb_type;
121 dword_ptr_type = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch),
123 dword32_type = arch_integer_type (gdbarch, 32,
125 void_ptr_type = lookup_pointer_type (builtin_type (gdbarch)->builtin_void);
129 list_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
130 TYPE_NAME (list_type) = xstrdup ("list");
132 list_ptr_type = arch_type (gdbarch, TYPE_CODE_PTR,
133 TYPE_LENGTH (void_ptr_type), NULL);
135 module_list_ptr_type = void_ptr_type;
137 append_composite_type_field (list_type, "forward_list",
138 module_list_ptr_type);
139 append_composite_type_field (list_type, "backward_list",
140 module_list_ptr_type);
142 /* Structured Exception Handler */
144 seh_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
145 TYPE_NAME (seh_type) = xstrdup ("seh");
147 seh_ptr_type = arch_type (gdbarch, TYPE_CODE_PTR,
148 TYPE_LENGTH (void_ptr_type), NULL);
149 TYPE_TARGET_TYPE (seh_ptr_type) = seh_type;
151 append_composite_type_field (seh_type, "next_seh", seh_ptr_type);
152 append_composite_type_field (seh_type, "handler",
153 builtin_type (gdbarch)->builtin_func_ptr);
155 /* struct _PEB_LDR_DATA */
156 peb_ldr_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
157 TYPE_NAME (peb_ldr_type) = xstrdup ("peb_ldr_data");
159 append_composite_type_field (peb_ldr_type, "length", dword32_type);
160 append_composite_type_field (peb_ldr_type, "initialized", dword32_type);
161 append_composite_type_field (peb_ldr_type, "ss_handle", void_ptr_type);
162 append_composite_type_field (peb_ldr_type, "in_load_order", list_type);
163 append_composite_type_field (peb_ldr_type, "in_memory_order", list_type);
164 append_composite_type_field (peb_ldr_type, "in_init_order", list_type);
165 append_composite_type_field (peb_ldr_type, "entry_in_progress",
167 peb_ldr_ptr_type = arch_type (gdbarch, TYPE_CODE_PTR,
168 TYPE_LENGTH (void_ptr_type), NULL);
169 TYPE_TARGET_TYPE (peb_ldr_ptr_type) = peb_ldr_type;
172 /* struct process environment block */
173 peb_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
174 TYPE_NAME (peb_type) = xstrdup ("peb");
176 /* First bytes contain several flags. */
177 append_composite_type_field (peb_type, "flags", dword_ptr_type);
178 append_composite_type_field (peb_type, "mutant", void_ptr_type);
179 append_composite_type_field (peb_type, "image_base_address", void_ptr_type);
180 append_composite_type_field (peb_type, "ldr", peb_ldr_ptr_type);
181 append_composite_type_field (peb_type, "process_parameters", void_ptr_type);
182 append_composite_type_field (peb_type, "sub_system_data", void_ptr_type);
183 append_composite_type_field (peb_type, "process_heap", void_ptr_type);
184 append_composite_type_field (peb_type, "fast_peb_lock", void_ptr_type);
185 peb_ptr_type = arch_type (gdbarch, TYPE_CODE_PTR,
186 TYPE_LENGTH (void_ptr_type), NULL);
187 TYPE_TARGET_TYPE (peb_ptr_type) = peb_type;
190 /* struct thread information block */
191 tib_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
192 TYPE_NAME (tib_type) = xstrdup ("tib");
194 /* uint32_t current_seh; %fs:0x0000 */
195 append_composite_type_field (tib_type, "current_seh", seh_ptr_type);
196 /* uint32_t current_top_of_stack; %fs:0x0004 */
197 append_composite_type_field (tib_type, "current_top_of_stack",
199 /* uint32_t current_bottom_of_stack; %fs:0x0008 */
200 append_composite_type_field (tib_type, "current_bottom_of_stack",
202 /* uint32_t sub_system_tib; %fs:0x000c */
203 append_composite_type_field (tib_type, "sub_system_tib", void_ptr_type);
205 /* uint32_t fiber_data; %fs:0x0010 */
206 append_composite_type_field (tib_type, "fiber_data", void_ptr_type);
207 /* uint32_t arbitrary_data_slot; %fs:0x0014 */
208 append_composite_type_field (tib_type, "arbitrary_data_slot", void_ptr_type);
209 /* uint32_t linear_address_tib; %fs:0x0018 */
210 append_composite_type_field (tib_type, "linear_address_tib", void_ptr_type);
211 /* uint32_t environment_pointer; %fs:0x001c */
212 append_composite_type_field (tib_type, "environment_pointer", void_ptr_type);
213 /* uint32_t process_id; %fs:0x0020 */
214 append_composite_type_field (tib_type, "process_id", dword_ptr_type);
215 /* uint32_t current_thread_id; %fs:0x0024 */
216 append_composite_type_field (tib_type, "thread_id", dword_ptr_type);
217 /* uint32_t active_rpc_handle; %fs:0x0028 */
218 append_composite_type_field (tib_type, "active_rpc_handle", dword_ptr_type);
219 /* uint32_t thread_local_storage; %fs:0x002c */
220 append_composite_type_field (tib_type, "thread_local_storage",
222 /* uint32_t process_environment_block; %fs:0x0030 */
223 append_composite_type_field (tib_type, "process_environment_block",
225 /* uint32_t last_error_number; %fs:0x0034 */
226 append_composite_type_field (tib_type, "last_error_number", dword_ptr_type);
228 tib_ptr_type = arch_type (gdbarch, TYPE_CODE_PTR,
229 TYPE_LENGTH (void_ptr_type), NULL);
230 TYPE_TARGET_TYPE (tib_ptr_type) = tib_type;
232 last_tlb_type = tib_ptr_type;
233 last_gdbarch = gdbarch;
238 /* The $_tlb convenience variable is a bit special. We don't know
239 for sure the type of the value until we actually have a chance to
240 fetch the data. The type can change depending on gdbarch, so it is
241 also dependent on which thread you have selected. */
243 /* This function implements the lval_computed support for reading a
247 tlb_value_read (struct value *val)
250 struct type *type = check_typedef (value_type (val));
252 if (!target_get_tib_address (inferior_ptid, &tlb))
253 error (_("Unable to read tlb"));
254 store_typed_address (value_contents_raw (val), type, tlb);
257 /* This function implements the lval_computed support for writing a
261 tlb_value_write (struct value *v, struct value *fromval)
263 error (_("Impossible to change the Thread Local Base"));
266 static const struct lval_funcs tlb_value_funcs =
273 /* Return a new value with the correct type for the tlb object of
274 the current thread using architecture GDBARCH. Return a void value
275 if there's no object available. */
277 static struct value *
278 tlb_make_value (struct gdbarch *gdbarch, struct internalvar *var, void *ignore)
280 if (target_has_stack && !ptid_equal (inferior_ptid, null_ptid))
282 struct type *type = windows_get_tlb_type (gdbarch);
283 return allocate_computed_value (type, &tlb_value_funcs, NULL);
286 return allocate_value (builtin_type (gdbarch)->builtin_void);
290 /* Display thread information block of a given thread. */
293 display_one_tib (ptid_t ptid)
295 gdb_byte *tib = NULL;
297 CORE_ADDR thread_local_base;
298 ULONGEST i, val, max, max_name, size, tib_size;
299 ULONGEST sizeof_ptr = gdbarch_ptr_bit (target_gdbarch ());
300 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
302 if (sizeof_ptr == 64)
304 size = sizeof (uint64_t);
305 tib_size = sizeof (thread_information_64);
310 size = sizeof (uint32_t);
311 tib_size = sizeof (thread_information_32);
317 if (maint_display_all_tib)
319 tib_size = FULL_TIB_SIZE;
320 max = tib_size / size;
323 tib = alloca (tib_size);
325 if (target_get_tib_address (ptid, &thread_local_base) == 0)
327 printf_filtered (_("Unable to get thread local base for %s\n"),
328 target_pid_to_str (ptid));
332 if (target_read (¤t_target, TARGET_OBJECT_MEMORY,
333 NULL, tib, thread_local_base, tib_size) != tib_size)
335 printf_filtered (_("Unable to read thread information "
336 "block for %s at address %s\n"),
337 target_pid_to_str (ptid),
338 paddress (target_gdbarch (), thread_local_base));
342 printf_filtered (_("Thread Information Block %s at %s\n"),
343 target_pid_to_str (ptid),
344 paddress (target_gdbarch (), thread_local_base));
346 index = (gdb_byte *) tib;
348 /* All fields have the size of a pointer, this allows to iterate
349 using the same for loop for both layouts. */
350 for (i = 0; i < max; i++)
352 val = extract_unsigned_integer (index, size, byte_order);
354 printf_filtered (_("%s is 0x%s\n"), TIB_NAME[i], phex (val, size));
356 printf_filtered (_("TIB[0x%s] is 0x%s\n"), phex (i * size, 2),
363 /* Display thread information block of a thread specified by ARGS.
364 If ARGS is empty, display thread information block of current_thread
365 if current_thread is non NULL.
366 Otherwise ARGS is parsed and converted to a integer that should
367 be the windows ThreadID (not the internal GDB thread ID). */
370 display_tib (char * args, int from_tty)
374 struct thread_info *tp;
375 int gdb_id = value_as_long (parse_and_eval (args));
377 tp = find_thread_id (gdb_id);
380 error (_("Thread ID %d not known."), gdb_id);
382 if (!target_thread_alive (tp->ptid))
383 error (_("Thread ID %d has terminated."), gdb_id);
385 display_one_tib (tp->ptid);
387 else if (!ptid_equal (inferior_ptid, null_ptid))
388 display_one_tib (inferior_ptid);
392 windows_xfer_shared_library (const char* so_name, CORE_ADDR load_addr,
393 struct gdbarch *gdbarch, struct obstack *obstack)
397 CORE_ADDR text_offset;
399 obstack_grow_str (obstack, "<library name=\"");
400 p = xml_escape_text (so_name);
401 obstack_grow_str (obstack, p);
403 obstack_grow_str (obstack, "\"><segment address=\"");
404 dll = gdb_bfd_open_maybe_remote (so_name);
405 /* The following calls are OK even if dll is NULL.
406 The default value 0x1000 is returned by pe_text_section_offset
408 text_offset = pe_text_section_offset (dll);
410 obstack_grow_str (obstack, paddress (gdbarch, load_addr + text_offset));
411 obstack_grow_str (obstack, "\"/></library>");
414 /* Implement the "iterate_over_objfiles_in_search_order" gdbarch
415 method. It searches all objfiles, starting with CURRENT_OBJFILE
418 On Windows, the system behaves a little differently when two
419 objfiles each define a global symbol using the same name, compared
420 to other platforms such as GNU/Linux for instance. On GNU/Linux,
421 all instances of the symbol effectively get merged into a single
422 one, but on Windows, they remain distinct.
424 As a result, it usually makes sense to start global symbol searches
425 with the current objfile before expanding it to all other objfiles.
426 This helps for instance when a user debugs some code in a DLL that
427 refers to a global variable defined inside that DLL. When trying
428 to print the value of that global variable, it would be unhelpful
429 to print the value of another global variable defined with the same
430 name, but in a different DLL. */
433 windows_iterate_over_objfiles_in_search_order
434 (struct gdbarch *gdbarch,
435 iterate_over_objfiles_in_search_order_cb_ftype *cb,
436 void *cb_data, struct objfile *current_objfile)
439 struct objfile *objfile;
443 stop = cb (current_objfile, cb_data);
448 ALL_OBJFILES (objfile)
450 if (objfile != current_objfile)
452 stop = cb (objfile, cb_data);
460 show_maint_show_all_tib (struct ui_file *file, int from_tty,
461 struct cmd_list_element *c, const char *value)
463 fprintf_filtered (file, _("Show all non-zero elements of "
464 "Thread Information Block is %s.\n"), value);
468 info_w32_command (char *args, int from_tty)
470 help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
473 static int w32_prefix_command_valid = 0;
475 init_w32_command_list (void)
477 if (!w32_prefix_command_valid)
479 add_prefix_cmd ("w32", class_info, info_w32_command,
480 _("Print information specific to Win32 debugging."),
481 &info_w32_cmdlist, "info w32 ", 0, &infolist);
482 w32_prefix_command_valid = 1;
486 /* To be called from the various GDB_OSABI_CYGWIN handlers for the
487 various Windows architectures and machine types. */
490 windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
492 /* Canonical paths on this target look like
493 `c:\Program Files\Foo App\mydll.dll', for example. */
494 set_gdbarch_has_dos_based_file_system (gdbarch, 1);
496 set_gdbarch_iterate_over_objfiles_in_search_order
497 (gdbarch, windows_iterate_over_objfiles_in_search_order);
499 set_solib_ops (gdbarch, &solib_target_so_ops);
502 /* Provide a prototype to silence -Wmissing-prototypes. */
503 extern initialize_file_ftype _initialize_windows_tdep;
505 /* Implementation of `tlb' variable. */
507 static const struct internalvar_funcs tlb_funcs =
515 _initialize_windows_tdep (void)
517 init_w32_command_list ();
518 add_cmd ("thread-information-block", class_info, display_tib,
519 _("Display thread information block."),
521 add_alias_cmd ("tib", "thread-information-block", class_info, 1,
524 add_setshow_boolean_cmd ("show-all-tib", class_maintenance,
525 &maint_display_all_tib, _("\
526 Set whether to display all non-zero fields of thread information block."), _("\
527 Show whether to display all non-zero fields of thread information block."), _("\
528 Use \"on\" to enable, \"off\" to disable.\n\
529 If enabled, all non-zero fields of thread information block are displayed,\n\
530 even if their meaning is unknown."),
532 show_maint_show_all_tib,
533 &maintenance_set_cmdlist,
534 &maintenance_show_cmdlist);
536 /* Explicitly create without lookup, since that tries to create a
537 value with a void typed value, and when we get here, gdbarch
538 isn't initialized yet. At this point, we're quite sure there
539 isn't another convenience variable of the same name. */
540 create_internalvar_type_lazy ("_tlb", &tlb_funcs, NULL);