Introduce ref_ptr::new_reference
[deliverable/binutils-gdb.git] / gdb / i386-cygwin-tdep.c
CommitLineData
1762d96d 1/* Target-dependent code for Cygwin running on i386's, for GDB.
acd5c798 2
e2882c85 3 Copyright (C) 2003-2018 Free Software Foundation, Inc.
1762d96d 4
acd5c798 5 This file is part of GDB.
1762d96d 6
acd5c798
MK
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
acd5c798 10 (at your option) any later version.
1762d96d 11
acd5c798
MK
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
1762d96d 16
acd5c798 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
1762d96d
CV
19
20#include "defs.h"
1762d96d 21#include "osabi.h"
acd5c798 22#include "i386-tdep.h"
31b060a2 23#include "windows-tdep.h"
de584861
PA
24#include "regset.h"
25#include "gdb_obstack.h"
26#include "xml-support.h"
27#include "gdbcore.h"
a5ee0f0c 28#include "inferior.h"
de584861
PA
29
30/* Core file support. */
31
32/* This vector maps GDB's idea of a register's number into an address
dc05df57 33 in the windows exception context vector. */
de584861 34
dc05df57 35static int i386_windows_gregset_reg_offset[] =
de584861
PA
36{
37 176, /* eax */
38 172, /* ecx */
39 168, /* edx */
40 164, /* ebx */
41
42 196, /* esp */
43 180, /* ebp */
44 160, /* esi */
45 156, /* edi */
46
47 184, /* eip */
48 192, /* eflags */
49 188, /* cs */
50 200, /* ss */
51
52 152, /* ds */
53 148, /* es */
54 144, /* fs */
55 140, /* gs */
56
57 56, /* FloatSave.RegisterArea[0 * 10] */
58 66, /* FloatSave.RegisterArea[1 * 10] */
59 76, /* FloatSave.RegisterArea[2 * 10] */
60 86, /* FloatSave.RegisterArea[3 * 10] */
61 96, /* FloatSave.RegisterArea[4 * 10] */
62 106, /* FloatSave.RegisterArea[5 * 10] */
63 116, /* FloatSave.RegisterArea[6 * 10] */
64 126, /* FloatSave.RegisterArea[7 * 10] */
65
66 28, /* FloatSave.ControlWord */
67 32, /* FloatSave.StatusWord */
68 36, /* FloatSave.TagWord */
69 44, /* FloatSave.ErrorSelector */
70 40, /* FloatSave.ErrorOffset */
71 52, /* FloatSave.DataSelector */
72 48, /* FloatSave.DataOffset */
73 44, /* FloatSave.ErrorSelector */
74
75 /* XMM0-7 */
76 364, /* ExtendedRegisters[10*16] */
77 380, /* ExtendedRegisters[11*16] */
78 396, /* ExtendedRegisters[12*16] */
79 412, /* ExtendedRegisters[13*16] */
80 428, /* ExtendedRegisters[14*16] */
81 444, /* ExtendedRegisters[15*16] */
82 460, /* ExtendedRegisters[16*16] */
83 476, /* ExtendedRegisters[17*16] */
84
85 /* MXCSR */
86 228 /* ExtendedRegisters[24] */
87};
88
dc05df57 89#define I386_WINDOWS_SIZEOF_GREGSET 716
de584861 90
de584861
PA
91struct cpms_data
92{
5af949e3 93 struct gdbarch *gdbarch;
de584861
PA
94 struct obstack *obstack;
95 int module_count;
96};
97
98static void
99core_process_module_section (bfd *abfd, asection *sect, void *obj)
100{
9a3c8263 101 struct cpms_data *data = (struct cpms_data *) obj;
e17a4113 102 enum bfd_endian byte_order = gdbarch_byte_order (data->gdbarch);
de584861
PA
103
104 char *module_name;
105 size_t module_name_size;
106 CORE_ADDR base_addr;
107
001f13d8 108 gdb_byte *buf = NULL;
de584861 109
61012eef 110 if (!startswith (sect->name, ".module"))
de584861
PA
111 return;
112
224c3ddb 113 buf = (gdb_byte *) xmalloc (bfd_get_section_size (sect) + 1);
de584861
PA
114 if (!buf)
115 {
116 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
117 goto out;
118 }
119 if (!bfd_get_section_contents (abfd, sect,
120 buf, 0, bfd_get_section_size (sect)))
121 goto out;
122
123
124
dc05df57 125 /* A DWORD (data_type) followed by struct windows_core_module_info. */
de584861
PA
126
127 base_addr =
e17a4113 128 extract_unsigned_integer (buf + 4, 4, byte_order);
de584861
PA
129
130 module_name_size =
e17a4113 131 extract_unsigned_integer (buf + 8, 4, byte_order);
de584861 132
001f13d8 133 if (12 + module_name_size > bfd_get_section_size (sect))
de584861 134 goto out;
001f13d8 135 module_name = (char *) buf + 12;
de584861
PA
136
137 /* The first module is the .exe itself. */
138 if (data->module_count != 0)
5af949e3
UW
139 windows_xfer_shared_library (module_name, base_addr,
140 data->gdbarch, data->obstack);
de584861
PA
141 data->module_count++;
142
143out:
144 if (buf)
145 xfree (buf);
146 return;
147}
148
c09f20e4 149static ULONGEST
dc05df57 150windows_core_xfer_shared_libraries (struct gdbarch *gdbarch,
de584861 151 gdb_byte *readbuf,
7ec1862d 152 ULONGEST offset, ULONGEST len)
de584861
PA
153{
154 struct obstack obstack;
155 const char *buf;
c09f20e4 156 ULONGEST len_avail;
5af949e3 157 struct cpms_data data = { gdbarch, &obstack, 0 };
de584861
PA
158
159 obstack_init (&obstack);
160 obstack_grow_str (&obstack, "<library-list>\n");
161 bfd_map_over_sections (core_bfd,
162 core_process_module_section,
163 &data);
164 obstack_grow_str0 (&obstack, "</library-list>\n");
165
224c3ddb 166 buf = (const char *) obstack_finish (&obstack);
de584861
PA
167 len_avail = strlen (buf);
168 if (offset >= len_avail)
169 return 0;
170
171 if (len > len_avail - offset)
172 len = len_avail - offset;
173 memcpy (readbuf, buf + offset, len);
174
175 obstack_free (&obstack, NULL);
176 return len;
177}
1762d96d 178
a5ee0f0c
PA
179/* This is how we want PTIDs from core files to be printed. */
180
7a114964 181static const char *
a5ee0f0c
PA
182i386_windows_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid)
183{
184 static char buf[80];
185
186 if (ptid_get_lwp (ptid) != 0)
187 {
188 snprintf (buf, sizeof (buf), "Thread 0x%lx", ptid_get_lwp (ptid));
189 return buf;
190 }
191
192 return normal_pid_to_str (ptid);
193}
194
f7948b5f 195static CORE_ADDR
52f729a7 196i386_cygwin_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
f7948b5f 197{
e17a4113 198 return i386_pe_skip_trampoline_code (frame, pc, NULL);
f7948b5f
JB
199}
200
f870a310
TT
201static const char *
202i386_cygwin_auto_wide_charset (void)
203{
204 return "UTF-16";
205}
206
1762d96d
CV
207static void
208i386_cygwin_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
209{
210 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
211
64870a42
YQ
212 windows_init_abi (info, gdbarch);
213
f7948b5f
JB
214 set_gdbarch_skip_trampoline_code (gdbarch, i386_cygwin_skip_trampoline_code);
215
4309257c
PM
216 set_gdbarch_skip_main_prologue (gdbarch, i386_skip_main_prologue);
217
1762d96d 218 tdep->struct_return = reg_struct_return;
de584861 219
dc05df57
CF
220 tdep->gregset_reg_offset = i386_windows_gregset_reg_offset;
221 tdep->gregset_num_regs = ARRAY_SIZE (i386_windows_gregset_reg_offset);
222 tdep->sizeof_gregset = I386_WINDOWS_SIZEOF_GREGSET;
de584861 223
490496c3
AA
224 tdep->sizeof_fpregset = 0;
225
de584861 226 /* Core file support. */
de584861 227 set_gdbarch_core_xfer_shared_libraries
dc05df57 228 (gdbarch, windows_core_xfer_shared_libraries);
a5ee0f0c 229 set_gdbarch_core_pid_to_str (gdbarch, i386_windows_core_pid_to_str);
f870a310
TT
230
231 set_gdbarch_auto_wide_charset (gdbarch, i386_cygwin_auto_wide_charset);
1762d96d
CV
232}
233
234static enum gdb_osabi
de584861
PA
235i386_cygwin_osabi_sniffer (bfd *abfd)
236{
1762d96d
CV
237 char *target_name = bfd_get_target (abfd);
238
1762d96d
CV
239 if (strcmp (target_name, "pei-i386") == 0)
240 return GDB_OSABI_CYGWIN;
241
c0993dbe
UW
242 /* Cygwin uses elf core dumps. Do not claim all ELF executables,
243 check whether there is a .reg section of proper size. */
de584861 244 if (strcmp (target_name, "elf32-i386") == 0)
c0993dbe
UW
245 {
246 asection *section = bfd_get_section_by_name (abfd, ".reg");
247 if (section
dc05df57 248 && bfd_section_size (abfd, section) == I386_WINDOWS_SIZEOF_GREGSET)
c0993dbe
UW
249 return GDB_OSABI_CYGWIN;
250 }
de584861 251
1762d96d
CV
252 return GDB_OSABI_UNKNOWN;
253}
254
255void
256_initialize_i386_cygwin_tdep (void)
257{
258 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_coff_flavour,
259 i386_cygwin_osabi_sniffer);
260
de584861
PA
261 /* Cygwin uses elf core dumps. */
262 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour,
263 i386_cygwin_osabi_sniffer);
264
1762d96d
CV
265 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_CYGWIN,
266 i386_cygwin_init_abi);
267}
This page took 1.525631 seconds and 4 git commands to generate.