]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/nto-tdep.c
GDB copyright headers update after running GDB's copyright.py script.
[thirdparty/binutils-gdb.git] / gdb / nto-tdep.c
1 /* nto-tdep.c - general QNX Neutrino target functionality.
2
3 Copyright (C) 2003-2016 Free Software Foundation, Inc.
4
5 Contributed by QNX Software Systems Ltd.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22 #include "defs.h"
23 #include <sys/stat.h>
24 #include "nto-tdep.h"
25 #include "top.h"
26 #include "inferior.h"
27 #include "infrun.h"
28 #include "gdbarch.h"
29 #include "bfd.h"
30 #include "elf-bfd.h"
31 #include "solib-svr4.h"
32 #include "gdbcore.h"
33 #include "objfiles.h"
34
35 #define QNX_NOTE_NAME "QNX"
36 #define QNX_INFO_SECT_NAME "QNX_info"
37
38 #ifdef __CYGWIN__
39 #include <sys/cygwin.h>
40 #endif
41
42 #ifdef __CYGWIN__
43 static char default_nto_target[] = "C:\\QNXsdk\\target\\qnx6";
44 #elif defined(__sun__) || defined(linux)
45 static char default_nto_target[] = "/opt/QNXsdk/target/qnx6";
46 #else
47 static char default_nto_target[] = "";
48 #endif
49
50 struct nto_target_ops current_nto_target;
51
52 static const struct inferior_data *nto_inferior_data_reg;
53
54 static char *
55 nto_target (void)
56 {
57 char *p = getenv ("QNX_TARGET");
58
59 #ifdef __CYGWIN__
60 static char buf[PATH_MAX];
61 if (p)
62 cygwin_conv_path (CCP_WIN_A_TO_POSIX, p, buf, PATH_MAX);
63 else
64 cygwin_conv_path (CCP_WIN_A_TO_POSIX, default_nto_target, buf, PATH_MAX);
65 return buf;
66 #else
67 return p ? p : default_nto_target;
68 #endif
69 }
70
71 /* Take a string such as i386, rs6000, etc. and map it onto CPUTYPE_X86,
72 CPUTYPE_PPC, etc. as defined in nto-share/dsmsgs.h. */
73 int
74 nto_map_arch_to_cputype (const char *arch)
75 {
76 if (!strcmp (arch, "i386") || !strcmp (arch, "x86"))
77 return CPUTYPE_X86;
78 if (!strcmp (arch, "rs6000") || !strcmp (arch, "powerpc"))
79 return CPUTYPE_PPC;
80 if (!strcmp (arch, "mips"))
81 return CPUTYPE_MIPS;
82 if (!strcmp (arch, "arm"))
83 return CPUTYPE_ARM;
84 if (!strcmp (arch, "sh"))
85 return CPUTYPE_SH;
86 return CPUTYPE_UNKNOWN;
87 }
88
89 int
90 nto_find_and_open_solib (char *solib, unsigned o_flags, char **temp_pathname)
91 {
92 char *buf, *arch_path, *nto_root;
93 const char *endian;
94 const char *base;
95 const char *arch;
96 int arch_len, len, ret;
97 #define PATH_FMT \
98 "%s/lib:%s/usr/lib:%s/usr/photon/lib:%s/usr/photon/dll:%s/lib/dll"
99
100 nto_root = nto_target ();
101 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
102 {
103 arch = "x86";
104 endian = "";
105 }
106 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
107 "rs6000") == 0
108 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
109 "powerpc") == 0)
110 {
111 arch = "ppc";
112 endian = "be";
113 }
114 else
115 {
116 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
117 endian = gdbarch_byte_order (target_gdbarch ())
118 == BFD_ENDIAN_BIG ? "be" : "le";
119 }
120
121 /* In case nto_root is short, add strlen(solib)
122 so we can reuse arch_path below. */
123
124 arch_len = (strlen (nto_root) + strlen (arch) + strlen (endian) + 2
125 + strlen (solib));
126 arch_path = (char *) alloca (arch_len);
127 xsnprintf (arch_path, arch_len, "%s/%s%s", nto_root, arch, endian);
128
129 len = strlen (PATH_FMT) + strlen (arch_path) * 5 + 1;
130 buf = (char *) alloca (len);
131 xsnprintf (buf, len, PATH_FMT, arch_path, arch_path, arch_path, arch_path,
132 arch_path);
133
134 base = lbasename (solib);
135 ret = openp (buf, OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, base, o_flags,
136 temp_pathname);
137 if (ret < 0 && base != solib)
138 {
139 xsnprintf (arch_path, arch_len, "/%s", solib);
140 ret = open (arch_path, o_flags, 0);
141 if (temp_pathname)
142 {
143 if (ret >= 0)
144 *temp_pathname = gdb_realpath (arch_path);
145 else
146 *temp_pathname = NULL;
147 }
148 }
149 return ret;
150 }
151
152 void
153 nto_init_solib_absolute_prefix (void)
154 {
155 char buf[PATH_MAX * 2], arch_path[PATH_MAX];
156 char *nto_root;
157 const char *endian;
158 const char *arch;
159
160 nto_root = nto_target ();
161 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
162 {
163 arch = "x86";
164 endian = "";
165 }
166 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
167 "rs6000") == 0
168 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
169 "powerpc") == 0)
170 {
171 arch = "ppc";
172 endian = "be";
173 }
174 else
175 {
176 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
177 endian = gdbarch_byte_order (target_gdbarch ())
178 == BFD_ENDIAN_BIG ? "be" : "le";
179 }
180
181 xsnprintf (arch_path, sizeof (arch_path), "%s/%s%s", nto_root, arch, endian);
182
183 xsnprintf (buf, sizeof (buf), "set solib-absolute-prefix %s", arch_path);
184 execute_command (buf, 0);
185 }
186
187 char **
188 nto_parse_redirection (char *pargv[], const char **pin, const char **pout,
189 const char **perr)
190 {
191 char **argv;
192 char *in, *out, *err, *p;
193 int argc, i, n;
194
195 for (n = 0; pargv[n]; n++);
196 if (n == 0)
197 return NULL;
198 in = "";
199 out = "";
200 err = "";
201
202 argv = XCNEWVEC (char *, n + 1);
203 argc = n;
204 for (i = 0, n = 0; n < argc; n++)
205 {
206 p = pargv[n];
207 if (*p == '>')
208 {
209 p++;
210 if (*p)
211 out = p;
212 else
213 out = pargv[++n];
214 }
215 else if (*p == '<')
216 {
217 p++;
218 if (*p)
219 in = p;
220 else
221 in = pargv[++n];
222 }
223 else if (*p++ == '2' && *p++ == '>')
224 {
225 if (*p == '&' && *(p + 1) == '1')
226 err = out;
227 else if (*p)
228 err = p;
229 else
230 err = pargv[++n];
231 }
232 else
233 argv[i++] = pargv[n];
234 }
235 *pin = in;
236 *pout = out;
237 *perr = err;
238 return argv;
239 }
240
241 /* The struct lm_info, lm_addr, and nto_truncate_ptr are copied from
242 solib-svr4.c to support nto_relocate_section_addresses
243 which is different from the svr4 version. */
244
245 /* Link map info to include in an allocated so_list entry */
246
247 struct lm_info
248 {
249 /* Pointer to copy of link map from inferior. The type is char *
250 rather than void *, so that we may use byte offsets to find the
251 various fields without the need for a cast. */
252 gdb_byte *lm;
253
254 /* Amount by which addresses in the binary should be relocated to
255 match the inferior. This could most often be taken directly
256 from lm, but when prelinking is involved and the prelink base
257 address changes, we may need a different offset, we want to
258 warn about the difference and compute it only once. */
259 CORE_ADDR l_addr;
260
261 /* The target location of lm. */
262 CORE_ADDR lm_addr;
263 };
264
265
266 static CORE_ADDR
267 lm_addr (struct so_list *so)
268 {
269 if (so->lm_info->l_addr == (CORE_ADDR)-1)
270 {
271 struct link_map_offsets *lmo = nto_fetch_link_map_offsets ();
272 struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
273
274 so->lm_info->l_addr =
275 extract_typed_address (so->lm_info->lm + lmo->l_addr_offset, ptr_type);
276 }
277 return so->lm_info->l_addr;
278 }
279
280 static CORE_ADDR
281 nto_truncate_ptr (CORE_ADDR addr)
282 {
283 if (gdbarch_ptr_bit (target_gdbarch ()) == sizeof (CORE_ADDR) * 8)
284 /* We don't need to truncate anything, and the bit twiddling below
285 will fail due to overflow problems. */
286 return addr;
287 else
288 return addr & (((CORE_ADDR) 1 << gdbarch_ptr_bit (target_gdbarch ())) - 1);
289 }
290
291 static Elf_Internal_Phdr *
292 find_load_phdr (bfd *abfd)
293 {
294 Elf_Internal_Phdr *phdr;
295 unsigned int i;
296
297 if (!elf_tdata (abfd))
298 return NULL;
299
300 phdr = elf_tdata (abfd)->phdr;
301 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
302 {
303 if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X))
304 return phdr;
305 }
306 return NULL;
307 }
308
309 void
310 nto_relocate_section_addresses (struct so_list *so, struct target_section *sec)
311 {
312 /* Neutrino treats the l_addr base address field in link.h as different than
313 the base address in the System V ABI and so the offset needs to be
314 calculated and applied to relocations. */
315 Elf_Internal_Phdr *phdr = find_load_phdr (sec->the_bfd_section->owner);
316 unsigned vaddr = phdr ? phdr->p_vaddr : 0;
317
318 sec->addr = nto_truncate_ptr (sec->addr + lm_addr (so) - vaddr);
319 sec->endaddr = nto_truncate_ptr (sec->endaddr + lm_addr (so) - vaddr);
320 }
321
322 /* This is cheating a bit because our linker code is in libc.so. If we
323 ever implement lazy linking, this may need to be re-examined. */
324 int
325 nto_in_dynsym_resolve_code (CORE_ADDR pc)
326 {
327 if (in_plt_section (pc))
328 return 1;
329 return 0;
330 }
331
332 void
333 nto_dummy_supply_regset (struct regcache *regcache, char *regs)
334 {
335 /* Do nothing. */
336 }
337
338 static void
339 nto_sniff_abi_note_section (bfd *abfd, asection *sect, void *obj)
340 {
341 const char *sectname;
342 unsigned int sectsize;
343 /* Buffer holding the section contents. */
344 char *note;
345 unsigned int namelen;
346 const char *name;
347 const unsigned sizeof_Elf_Nhdr = 12;
348
349 sectname = bfd_get_section_name (abfd, sect);
350 sectsize = bfd_section_size (abfd, sect);
351
352 if (sectsize > 128)
353 sectsize = 128;
354
355 if (sectname != NULL && strstr (sectname, QNX_INFO_SECT_NAME) != NULL)
356 *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO;
357 else if (sectname != NULL && strstr (sectname, "note") != NULL
358 && sectsize > sizeof_Elf_Nhdr)
359 {
360 note = XNEWVEC (char, sectsize);
361 bfd_get_section_contents (abfd, sect, note, 0, sectsize);
362 namelen = (unsigned int) bfd_h_get_32 (abfd, note);
363 name = note + sizeof_Elf_Nhdr;
364 if (sectsize >= namelen + sizeof_Elf_Nhdr
365 && namelen == sizeof (QNX_NOTE_NAME)
366 && 0 == strcmp (name, QNX_NOTE_NAME))
367 *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO;
368
369 XDELETEVEC (note);
370 }
371 }
372
373 enum gdb_osabi
374 nto_elf_osabi_sniffer (bfd *abfd)
375 {
376 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
377
378 bfd_map_over_sections (abfd,
379 nto_sniff_abi_note_section,
380 &osabi);
381
382 return osabi;
383 }
384
385 static const char *nto_thread_state_str[] =
386 {
387 "DEAD", /* 0 0x00 */
388 "RUNNING", /* 1 0x01 */
389 "READY", /* 2 0x02 */
390 "STOPPED", /* 3 0x03 */
391 "SEND", /* 4 0x04 */
392 "RECEIVE", /* 5 0x05 */
393 "REPLY", /* 6 0x06 */
394 "STACK", /* 7 0x07 */
395 "WAITTHREAD", /* 8 0x08 */
396 "WAITPAGE", /* 9 0x09 */
397 "SIGSUSPEND", /* 10 0x0a */
398 "SIGWAITINFO", /* 11 0x0b */
399 "NANOSLEEP", /* 12 0x0c */
400 "MUTEX", /* 13 0x0d */
401 "CONDVAR", /* 14 0x0e */
402 "JOIN", /* 15 0x0f */
403 "INTR", /* 16 0x10 */
404 "SEM", /* 17 0x11 */
405 "WAITCTX", /* 18 0x12 */
406 "NET_SEND", /* 19 0x13 */
407 "NET_REPLY" /* 20 0x14 */
408 };
409
410 char *
411 nto_extra_thread_info (struct target_ops *self, struct thread_info *ti)
412 {
413 if (ti && ti->priv
414 && ti->priv->state < ARRAY_SIZE (nto_thread_state_str))
415 return (char *)nto_thread_state_str [ti->priv->state];
416 return "";
417 }
418
419 void
420 nto_initialize_signals (void)
421 {
422 /* We use SIG45 for pulses, or something, so nostop, noprint
423 and pass them. */
424 signal_stop_update (gdb_signal_from_name ("SIG45"), 0);
425 signal_print_update (gdb_signal_from_name ("SIG45"), 0);
426 signal_pass_update (gdb_signal_from_name ("SIG45"), 1);
427
428 /* By default we don't want to stop on these two, but we do want to pass. */
429 #if defined(SIGSELECT)
430 signal_stop_update (SIGSELECT, 0);
431 signal_print_update (SIGSELECT, 0);
432 signal_pass_update (SIGSELECT, 1);
433 #endif
434
435 #if defined(SIGPHOTON)
436 signal_stop_update (SIGPHOTON, 0);
437 signal_print_update (SIGPHOTON, 0);
438 signal_pass_update (SIGPHOTON, 1);
439 #endif
440 }
441
442 /* Read AUXV from initial_stack. */
443 LONGEST
444 nto_read_auxv_from_initial_stack (CORE_ADDR initial_stack, gdb_byte *readbuf,
445 LONGEST len, size_t sizeof_auxv_t)
446 {
447 gdb_byte targ32[4]; /* For 32 bit target values. */
448 gdb_byte targ64[8]; /* For 64 bit target values. */
449 CORE_ADDR data_ofs = 0;
450 ULONGEST anint;
451 LONGEST len_read = 0;
452 gdb_byte *buff;
453 enum bfd_endian byte_order;
454 int ptr_size;
455
456 if (sizeof_auxv_t == 16)
457 ptr_size = 8;
458 else
459 ptr_size = 4;
460
461 /* Skip over argc, argv and envp... Comment from ldd.c:
462
463 The startup frame is set-up so that we have:
464 auxv
465 NULL
466 ...
467 envp2
468 envp1 <----- void *frame + (argc + 2) * sizeof(char *)
469 NULL
470 ...
471 argv2
472 argv1
473 argc <------ void * frame
474
475 On entry to ldd, frame gives the address of argc on the stack. */
476 /* Read argc. 4 bytes on both 64 and 32 bit arches and luckily little
477 * endian. So we just read first 4 bytes. */
478 if (target_read_memory (initial_stack + data_ofs, targ32, 4) != 0)
479 return 0;
480
481 byte_order = gdbarch_byte_order (target_gdbarch ());
482
483 anint = extract_unsigned_integer (targ32, sizeof (targ32), byte_order);
484
485 /* Size of pointer is assumed to be 4 bytes (32 bit arch.) */
486 data_ofs += (anint + 2) * ptr_size; /* + 2 comes from argc itself and
487 NULL terminating pointer in
488 argv. */
489
490 /* Now loop over env table: */
491 anint = 0;
492 while (target_read_memory (initial_stack + data_ofs, targ64, ptr_size)
493 == 0)
494 {
495 if (extract_unsigned_integer (targ64, ptr_size, byte_order) == 0)
496 anint = 1; /* Keep looping until non-null entry is found. */
497 else if (anint)
498 break;
499 data_ofs += ptr_size;
500 }
501 initial_stack += data_ofs;
502
503 memset (readbuf, 0, len);
504 buff = readbuf;
505 while (len_read <= len-sizeof_auxv_t)
506 {
507 if (target_read_memory (initial_stack + len_read, buff, sizeof_auxv_t)
508 == 0)
509 {
510 /* Both 32 and 64 bit structures have int as the first field. */
511 const ULONGEST a_type
512 = extract_unsigned_integer (buff, sizeof (targ32), byte_order);
513
514 if (a_type == AT_NULL)
515 break;
516 buff += sizeof_auxv_t;
517 len_read += sizeof_auxv_t;
518 }
519 else
520 break;
521 }
522 return len_read;
523 }
524
525 /* Allocate new nto_inferior_data object. */
526
527 static struct nto_inferior_data *
528 nto_new_inferior_data (void)
529 {
530 struct nto_inferior_data *const inf_data
531 = XCNEW (struct nto_inferior_data);
532
533 return inf_data;
534 }
535
536 /* Free inferior data. */
537
538 static void
539 nto_inferior_data_cleanup (struct inferior *const inf, void *const dat)
540 {
541 xfree (dat);
542 }
543
544 /* Return nto_inferior_data for the given INFERIOR. If not yet created,
545 construct it. */
546
547 struct nto_inferior_data *
548 nto_inferior_data (struct inferior *const inferior)
549 {
550 struct inferior *const inf = inferior ? inferior : current_inferior ();
551 struct nto_inferior_data *inf_data;
552
553 gdb_assert (inf != NULL);
554
555 inf_data
556 = (struct nto_inferior_data *) inferior_data (inf, nto_inferior_data_reg);
557 if (inf_data == NULL)
558 {
559 set_inferior_data (inf, nto_inferior_data_reg,
560 (inf_data = nto_new_inferior_data ()));
561 }
562
563 return inf_data;
564 }
565
566 /* Provide a prototype to silence -Wmissing-prototypes. */
567 extern initialize_file_ftype _initialize_nto_tdep;
568
569 void
570 _initialize_nto_tdep (void)
571 {
572 nto_inferior_data_reg
573 = register_inferior_data_with_cleanup (NULL, nto_inferior_data_cleanup);
574 }