btrace: remove leftover comment
[deliverable/binutils-gdb.git] / gdb / nto-tdep.c
CommitLineData
1b883d35
KW
1/* nto-tdep.c - general QNX Neutrino target functionality.
2
618f726f 3 Copyright (C) 2003-2016 Free Software Foundation, Inc.
1b883d35
KW
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
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
1b883d35
KW
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
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
1b883d35 21
b4d5ed91 22#include "defs.h"
53ce3c39 23#include <sys/stat.h>
1b883d35
KW
24#include "nto-tdep.h"
25#include "top.h"
1b883d35 26#include "inferior.h"
45741a9c 27#include "infrun.h"
1b883d35
KW
28#include "gdbarch.h"
29#include "bfd.h"
30#include "elf-bfd.h"
31#include "solib-svr4.h"
32#include "gdbcore.h"
238ae9af
UW
33#include "objfiles.h"
34
d7161de4
AR
35#define QNX_NOTE_NAME "QNX"
36#define QNX_INFO_SECT_NAME "QNX_info"
37
1b883d35
KW
38#ifdef __CYGWIN__
39#include <sys/cygwin.h>
40#endif
41
42#ifdef __CYGWIN__
43static char default_nto_target[] = "C:\\QNXsdk\\target\\qnx6";
44#elif defined(__sun__) || defined(linux)
45static char default_nto_target[] = "/opt/QNXsdk/target/qnx6";
46#else
47static char default_nto_target[] = "";
48#endif
49
50struct nto_target_ops current_nto_target;
51
a9889169
AR
52static const struct inferior_data *nto_inferior_data_reg;
53
1b883d35
KW
54static char *
55nto_target (void)
56{
57 char *p = getenv ("QNX_TARGET");
58
59#ifdef __CYGWIN__
60 static char buf[PATH_MAX];
61 if (p)
90375a0e 62 cygwin_conv_path (CCP_WIN_A_TO_POSIX, p, buf, PATH_MAX);
1b883d35 63 else
90375a0e 64 cygwin_conv_path (CCP_WIN_A_TO_POSIX, default_nto_target, buf, PATH_MAX);
1b883d35
KW
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. */
73int
74nto_map_arch_to_cputype (const char *arch)
75{
76 if (!strcmp (arch, "i386") || !strcmp (arch, "x86"))
77 return CPUTYPE_X86;
192cdb19 78 if (!strcmp (arch, "rs6000") || !strcmp (arch, "powerpc"))
1b883d35
KW
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
89int
90nto_find_and_open_solib (char *solib, unsigned o_flags, char **temp_pathname)
91{
c32ed3ef
PA
92 char *buf, *arch_path, *nto_root;
93 const char *endian;
91495617 94 const char *base;
1b883d35 95 const char *arch;
08850b56 96 int arch_len, len, ret;
0df8b418
MS
97#define PATH_FMT \
98 "%s/lib:%s/usr/lib:%s/usr/photon/lib:%s/usr/photon/dll:%s/lib/dll"
1b883d35
KW
99
100 nto_root = nto_target ();
f5656ead 101 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
1b883d35
KW
102 {
103 arch = "x86";
104 endian = "";
105 }
f5656ead 106 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 107 "rs6000") == 0
f5656ead 108 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 109 "powerpc") == 0)
1b883d35
KW
110 {
111 arch = "ppc";
112 endian = "be";
113 }
114 else
115 {
f5656ead
TT
116 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
117 endian = gdbarch_byte_order (target_gdbarch ())
4c6b5505 118 == BFD_ENDIAN_BIG ? "be" : "le";
1b883d35
KW
119 }
120
d737fd7f
KW
121 /* In case nto_root is short, add strlen(solib)
122 so we can reuse arch_path below. */
1b883d35 123
08850b56
PM
124 arch_len = (strlen (nto_root) + strlen (arch) + strlen (endian) + 2
125 + strlen (solib));
224c3ddb 126 arch_path = (char *) alloca (arch_len);
08850b56
PM
127 xsnprintf (arch_path, arch_len, "%s/%s%s", nto_root, arch, endian);
128
129 len = strlen (PATH_FMT) + strlen (arch_path) * 5 + 1;
224c3ddb 130 buf = (char *) alloca (len);
08850b56
PM
131 xsnprintf (buf, len, PATH_FMT, arch_path, arch_path, arch_path, arch_path,
132 arch_path);
1b883d35 133
9f37bbcc 134 base = lbasename (solib);
492c0ab7
JK
135 ret = openp (buf, OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, base, o_flags,
136 temp_pathname);
d737fd7f
KW
137 if (ret < 0 && base != solib)
138 {
08850b56 139 xsnprintf (arch_path, arch_len, "/%s", solib);
d737fd7f
KW
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
2c571006 146 *temp_pathname = NULL;
d737fd7f
KW
147 }
148 }
149 return ret;
1b883d35
KW
150}
151
152void
153nto_init_solib_absolute_prefix (void)
154{
155 char buf[PATH_MAX * 2], arch_path[PATH_MAX];
c32ed3ef
PA
156 char *nto_root;
157 const char *endian;
1b883d35
KW
158 const char *arch;
159
160 nto_root = nto_target ();
f5656ead 161 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
1b883d35
KW
162 {
163 arch = "x86";
164 endian = "";
165 }
f5656ead 166 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 167 "rs6000") == 0
f5656ead 168 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 169 "powerpc") == 0)
1b883d35
KW
170 {
171 arch = "ppc";
172 endian = "be";
173 }
174 else
175 {
f5656ead
TT
176 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
177 endian = gdbarch_byte_order (target_gdbarch ())
4c6b5505 178 == BFD_ENDIAN_BIG ? "be" : "le";
1b883d35
KW
179 }
180
08850b56 181 xsnprintf (arch_path, sizeof (arch_path), "%s/%s%s", nto_root, arch, endian);
1b883d35 182
08850b56 183 xsnprintf (buf, sizeof (buf), "set solib-absolute-prefix %s", arch_path);
1b883d35
KW
184 execute_command (buf, 0);
185}
186
187char **
14ef7606
AR
188nto_parse_redirection (char *pargv[], const char **pin, const char **pout,
189 const char **perr)
1b883d35
KW
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
224c3ddb 202 argv = XCNEWVEC (char *, n + 1);
1b883d35
KW
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
b23518f0 241/* The struct lm_info, lm_addr, and nto_truncate_ptr are copied from
1b883d35
KW
242 solib-svr4.c to support nto_relocate_section_addresses
243 which is different from the svr4 version. */
244
ebd67d87
AR
245/* Link map info to include in an allocated so_list entry */
246
1b883d35 247struct lm_info
ebd67d87
AR
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
1b883d35
KW
265
266static CORE_ADDR
b23518f0 267lm_addr (struct so_list *so)
1b883d35 268{
ebd67d87
AR
269 if (so->lm_info->l_addr == (CORE_ADDR)-1)
270 {
271 struct link_map_offsets *lmo = nto_fetch_link_map_offsets ();
f5656ead 272 struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
1b883d35 273
ebd67d87 274 so->lm_info->l_addr =
b6da22b0 275 extract_typed_address (so->lm_info->lm + lmo->l_addr_offset, ptr_type);
ebd67d87
AR
276 }
277 return so->lm_info->l_addr;
1b883d35
KW
278}
279
280static CORE_ADDR
281nto_truncate_ptr (CORE_ADDR addr)
282{
f5656ead 283 if (gdbarch_ptr_bit (target_gdbarch ()) == sizeof (CORE_ADDR) * 8)
1b883d35
KW
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
f5656ead 288 return addr & (((CORE_ADDR) 1 << gdbarch_ptr_bit (target_gdbarch ())) - 1);
1b883d35
KW
289}
290
63807e1d 291static Elf_Internal_Phdr *
1b883d35
KW
292find_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
309void
0542c86d 310nto_relocate_section_addresses (struct so_list *so, struct target_section *sec)
1b883d35
KW
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. */
57e6060e 315 Elf_Internal_Phdr *phdr = find_load_phdr (sec->the_bfd_section->owner);
1b883d35
KW
316 unsigned vaddr = phdr ? phdr->p_vaddr : 0;
317
b23518f0
PM
318 sec->addr = nto_truncate_ptr (sec->addr + lm_addr (so) - vaddr);
319 sec->endaddr = nto_truncate_ptr (sec->endaddr + lm_addr (so) - vaddr);
1b883d35
KW
320}
321
d737fd7f
KW
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. */
324int
325nto_in_dynsym_resolve_code (CORE_ADDR pc)
326{
3e5d3a5a 327 if (in_plt_section (pc))
d737fd7f
KW
328 return 1;
329 return 0;
330}
331
d737fd7f 332void
468e3d51 333nto_dummy_supply_regset (struct regcache *regcache, char *regs)
d737fd7f
KW
334{
335 /* Do nothing. */
336}
337
d7161de4
AR
338static void
339nto_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
d737fd7f
KW
373enum gdb_osabi
374nto_elf_osabi_sniffer (bfd *abfd)
375{
d7161de4
AR
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;
d737fd7f
KW
383}
384
745a434e
AR
385static 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
410char *
c15906d8 411nto_extra_thread_info (struct target_ops *self, struct thread_info *ti)
745a434e 412{
fe978cb0
PA
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];
745a434e
AR
416 return "";
417}
418
1b883d35 419void
d737fd7f 420nto_initialize_signals (void)
1b883d35 421{
1b883d35
KW
422 /* We use SIG45 for pulses, or something, so nostop, noprint
423 and pass them. */
2ea28649
PA
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);
1b883d35
KW
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
d737fd7f 440}
8a6c0ccd
AR
441
442/* Read AUXV from initial_stack. */
443LONGEST
444nto_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}
a9889169
AR
524
525/* Allocate new nto_inferior_data object. */
526
527static struct nto_inferior_data *
528nto_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
538static void
539nto_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
547struct nto_inferior_data *
548nto_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
fb70bc1a
SM
555 inf_data
556 = (struct nto_inferior_data *) inferior_data (inf, nto_inferior_data_reg);
a9889169
AR
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. */
567extern initialize_file_ftype _initialize_nto_tdep;
568
569void
570_initialize_nto_tdep (void)
571{
572 nto_inferior_data_reg
573 = register_inferior_data_with_cleanup (NULL, nto_inferior_data_cleanup);
574}
This page took 1.325513 seconds and 4 git commands to generate.