Move some declarations to source.h
[deliverable/binutils-gdb.git] / gdb / nto-tdep.c
CommitLineData
1b883d35
KW
1/* nto-tdep.c - general QNX Neutrino target functionality.
2
e2882c85 3 Copyright (C) 2003-2018 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 33#include "objfiles.h"
b46a8d7c 34#include "source.h"
238ae9af 35
d7161de4
AR
36#define QNX_NOTE_NAME "QNX"
37#define QNX_INFO_SECT_NAME "QNX_info"
38
1b883d35
KW
39#ifdef __CYGWIN__
40#include <sys/cygwin.h>
41#endif
42
43#ifdef __CYGWIN__
44static char default_nto_target[] = "C:\\QNXsdk\\target\\qnx6";
45#elif defined(__sun__) || defined(linux)
46static char default_nto_target[] = "/opt/QNXsdk/target/qnx6";
47#else
48static char default_nto_target[] = "";
49#endif
50
51struct nto_target_ops current_nto_target;
52
a9889169
AR
53static const struct inferior_data *nto_inferior_data_reg;
54
1b883d35
KW
55static char *
56nto_target (void)
57{
58 char *p = getenv ("QNX_TARGET");
59
60#ifdef __CYGWIN__
61 static char buf[PATH_MAX];
62 if (p)
90375a0e 63 cygwin_conv_path (CCP_WIN_A_TO_POSIX, p, buf, PATH_MAX);
1b883d35 64 else
90375a0e 65 cygwin_conv_path (CCP_WIN_A_TO_POSIX, default_nto_target, buf, PATH_MAX);
1b883d35
KW
66 return buf;
67#else
68 return p ? p : default_nto_target;
69#endif
70}
71
72/* Take a string such as i386, rs6000, etc. and map it onto CPUTYPE_X86,
73 CPUTYPE_PPC, etc. as defined in nto-share/dsmsgs.h. */
74int
75nto_map_arch_to_cputype (const char *arch)
76{
77 if (!strcmp (arch, "i386") || !strcmp (arch, "x86"))
78 return CPUTYPE_X86;
192cdb19 79 if (!strcmp (arch, "rs6000") || !strcmp (arch, "powerpc"))
1b883d35
KW
80 return CPUTYPE_PPC;
81 if (!strcmp (arch, "mips"))
82 return CPUTYPE_MIPS;
83 if (!strcmp (arch, "arm"))
84 return CPUTYPE_ARM;
85 if (!strcmp (arch, "sh"))
86 return CPUTYPE_SH;
87 return CPUTYPE_UNKNOWN;
88}
89
90int
992f1ddc
PA
91nto_find_and_open_solib (const char *solib, unsigned o_flags,
92 char **temp_pathname)
1b883d35 93{
c32ed3ef
PA
94 char *buf, *arch_path, *nto_root;
95 const char *endian;
91495617 96 const char *base;
1b883d35 97 const char *arch;
08850b56 98 int arch_len, len, ret;
0df8b418
MS
99#define PATH_FMT \
100 "%s/lib:%s/usr/lib:%s/usr/photon/lib:%s/usr/photon/dll:%s/lib/dll"
1b883d35
KW
101
102 nto_root = nto_target ();
f5656ead 103 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
1b883d35
KW
104 {
105 arch = "x86";
106 endian = "";
107 }
f5656ead 108 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 109 "rs6000") == 0
f5656ead 110 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 111 "powerpc") == 0)
1b883d35
KW
112 {
113 arch = "ppc";
114 endian = "be";
115 }
116 else
117 {
f5656ead
TT
118 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
119 endian = gdbarch_byte_order (target_gdbarch ())
4c6b5505 120 == BFD_ENDIAN_BIG ? "be" : "le";
1b883d35
KW
121 }
122
d737fd7f
KW
123 /* In case nto_root is short, add strlen(solib)
124 so we can reuse arch_path below. */
1b883d35 125
08850b56
PM
126 arch_len = (strlen (nto_root) + strlen (arch) + strlen (endian) + 2
127 + strlen (solib));
224c3ddb 128 arch_path = (char *) alloca (arch_len);
08850b56
PM
129 xsnprintf (arch_path, arch_len, "%s/%s%s", nto_root, arch, endian);
130
131 len = strlen (PATH_FMT) + strlen (arch_path) * 5 + 1;
224c3ddb 132 buf = (char *) alloca (len);
08850b56
PM
133 xsnprintf (buf, len, PATH_FMT, arch_path, arch_path, arch_path, arch_path,
134 arch_path);
1b883d35 135
9f37bbcc 136 base = lbasename (solib);
492c0ab7
JK
137 ret = openp (buf, OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, base, o_flags,
138 temp_pathname);
d737fd7f
KW
139 if (ret < 0 && base != solib)
140 {
08850b56 141 xsnprintf (arch_path, arch_len, "/%s", solib);
d737fd7f
KW
142 ret = open (arch_path, o_flags, 0);
143 if (temp_pathname)
144 {
145 if (ret >= 0)
14278e1f 146 *temp_pathname = gdb_realpath (arch_path).release ();
d737fd7f 147 else
2c571006 148 *temp_pathname = NULL;
d737fd7f
KW
149 }
150 }
151 return ret;
1b883d35
KW
152}
153
154void
155nto_init_solib_absolute_prefix (void)
156{
157 char buf[PATH_MAX * 2], arch_path[PATH_MAX];
c32ed3ef
PA
158 char *nto_root;
159 const char *endian;
1b883d35
KW
160 const char *arch;
161
162 nto_root = nto_target ();
f5656ead 163 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
1b883d35
KW
164 {
165 arch = "x86";
166 endian = "";
167 }
f5656ead 168 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 169 "rs6000") == 0
f5656ead 170 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 171 "powerpc") == 0)
1b883d35
KW
172 {
173 arch = "ppc";
174 endian = "be";
175 }
176 else
177 {
f5656ead
TT
178 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
179 endian = gdbarch_byte_order (target_gdbarch ())
4c6b5505 180 == BFD_ENDIAN_BIG ? "be" : "le";
1b883d35
KW
181 }
182
08850b56 183 xsnprintf (arch_path, sizeof (arch_path), "%s/%s%s", nto_root, arch, endian);
1b883d35 184
08850b56 185 xsnprintf (buf, sizeof (buf), "set solib-absolute-prefix %s", arch_path);
1b883d35
KW
186 execute_command (buf, 0);
187}
188
189char **
14ef7606
AR
190nto_parse_redirection (char *pargv[], const char **pin, const char **pout,
191 const char **perr)
1b883d35
KW
192{
193 char **argv;
a121b7c1 194 const char *in, *out, *err, *p;
1b883d35
KW
195 int argc, i, n;
196
197 for (n = 0; pargv[n]; n++);
198 if (n == 0)
199 return NULL;
200 in = "";
201 out = "";
202 err = "";
203
224c3ddb 204 argv = XCNEWVEC (char *, n + 1);
1b883d35
KW
205 argc = n;
206 for (i = 0, n = 0; n < argc; n++)
207 {
208 p = pargv[n];
209 if (*p == '>')
210 {
211 p++;
212 if (*p)
213 out = p;
214 else
215 out = pargv[++n];
216 }
217 else if (*p == '<')
218 {
219 p++;
220 if (*p)
221 in = p;
222 else
223 in = pargv[++n];
224 }
225 else if (*p++ == '2' && *p++ == '>')
226 {
227 if (*p == '&' && *(p + 1) == '1')
228 err = out;
229 else if (*p)
230 err = p;
231 else
232 err = pargv[++n];
233 }
234 else
235 argv[i++] = pargv[n];
236 }
237 *pin = in;
238 *pout = out;
239 *perr = err;
240 return argv;
241}
242
1b883d35 243static CORE_ADDR
b23518f0 244lm_addr (struct so_list *so)
1b883d35 245{
d0e449a1 246 lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info;
1b883d35 247
d0e449a1 248 return li->l_addr;
1b883d35
KW
249}
250
251static CORE_ADDR
252nto_truncate_ptr (CORE_ADDR addr)
253{
f5656ead 254 if (gdbarch_ptr_bit (target_gdbarch ()) == sizeof (CORE_ADDR) * 8)
1b883d35
KW
255 /* We don't need to truncate anything, and the bit twiddling below
256 will fail due to overflow problems. */
257 return addr;
258 else
f5656ead 259 return addr & (((CORE_ADDR) 1 << gdbarch_ptr_bit (target_gdbarch ())) - 1);
1b883d35
KW
260}
261
63807e1d 262static Elf_Internal_Phdr *
1b883d35
KW
263find_load_phdr (bfd *abfd)
264{
265 Elf_Internal_Phdr *phdr;
266 unsigned int i;
267
268 if (!elf_tdata (abfd))
269 return NULL;
270
271 phdr = elf_tdata (abfd)->phdr;
272 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
273 {
274 if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X))
275 return phdr;
276 }
277 return NULL;
278}
279
280void
0542c86d 281nto_relocate_section_addresses (struct so_list *so, struct target_section *sec)
1b883d35
KW
282{
283 /* Neutrino treats the l_addr base address field in link.h as different than
284 the base address in the System V ABI and so the offset needs to be
285 calculated and applied to relocations. */
57e6060e 286 Elf_Internal_Phdr *phdr = find_load_phdr (sec->the_bfd_section->owner);
1b883d35
KW
287 unsigned vaddr = phdr ? phdr->p_vaddr : 0;
288
b23518f0
PM
289 sec->addr = nto_truncate_ptr (sec->addr + lm_addr (so) - vaddr);
290 sec->endaddr = nto_truncate_ptr (sec->endaddr + lm_addr (so) - vaddr);
1b883d35
KW
291}
292
d737fd7f
KW
293/* This is cheating a bit because our linker code is in libc.so. If we
294 ever implement lazy linking, this may need to be re-examined. */
295int
296nto_in_dynsym_resolve_code (CORE_ADDR pc)
297{
3e5d3a5a 298 if (in_plt_section (pc))
d737fd7f
KW
299 return 1;
300 return 0;
301}
302
d737fd7f 303void
468e3d51 304nto_dummy_supply_regset (struct regcache *regcache, char *regs)
d737fd7f
KW
305{
306 /* Do nothing. */
307}
308
d7161de4
AR
309static void
310nto_sniff_abi_note_section (bfd *abfd, asection *sect, void *obj)
311{
312 const char *sectname;
313 unsigned int sectsize;
314 /* Buffer holding the section contents. */
315 char *note;
316 unsigned int namelen;
317 const char *name;
318 const unsigned sizeof_Elf_Nhdr = 12;
319
320 sectname = bfd_get_section_name (abfd, sect);
321 sectsize = bfd_section_size (abfd, sect);
322
323 if (sectsize > 128)
324 sectsize = 128;
325
326 if (sectname != NULL && strstr (sectname, QNX_INFO_SECT_NAME) != NULL)
327 *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO;
328 else if (sectname != NULL && strstr (sectname, "note") != NULL
329 && sectsize > sizeof_Elf_Nhdr)
330 {
331 note = XNEWVEC (char, sectsize);
332 bfd_get_section_contents (abfd, sect, note, 0, sectsize);
333 namelen = (unsigned int) bfd_h_get_32 (abfd, note);
334 name = note + sizeof_Elf_Nhdr;
335 if (sectsize >= namelen + sizeof_Elf_Nhdr
336 && namelen == sizeof (QNX_NOTE_NAME)
337 && 0 == strcmp (name, QNX_NOTE_NAME))
338 *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO;
339
340 XDELETEVEC (note);
341 }
342}
343
d737fd7f
KW
344enum gdb_osabi
345nto_elf_osabi_sniffer (bfd *abfd)
346{
d7161de4
AR
347 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
348
349 bfd_map_over_sections (abfd,
350 nto_sniff_abi_note_section,
351 &osabi);
352
353 return osabi;
d737fd7f
KW
354}
355
745a434e
AR
356static const char *nto_thread_state_str[] =
357{
358 "DEAD", /* 0 0x00 */
359 "RUNNING", /* 1 0x01 */
360 "READY", /* 2 0x02 */
361 "STOPPED", /* 3 0x03 */
362 "SEND", /* 4 0x04 */
363 "RECEIVE", /* 5 0x05 */
364 "REPLY", /* 6 0x06 */
365 "STACK", /* 7 0x07 */
366 "WAITTHREAD", /* 8 0x08 */
367 "WAITPAGE", /* 9 0x09 */
368 "SIGSUSPEND", /* 10 0x0a */
369 "SIGWAITINFO", /* 11 0x0b */
370 "NANOSLEEP", /* 12 0x0c */
371 "MUTEX", /* 13 0x0d */
372 "CONDVAR", /* 14 0x0e */
373 "JOIN", /* 15 0x0f */
374 "INTR", /* 16 0x10 */
375 "SEM", /* 17 0x11 */
376 "WAITCTX", /* 18 0x12 */
377 "NET_SEND", /* 19 0x13 */
378 "NET_REPLY" /* 20 0x14 */
379};
380
7a114964 381const char *
c15906d8 382nto_extra_thread_info (struct target_ops *self, struct thread_info *ti)
745a434e 383{
7aabaf9d
SM
384 if (ti != NULL && ti->priv != NULL)
385 {
386 nto_thread_info *priv = get_nto_thread_info (ti);
387
388 if (priv->state < ARRAY_SIZE (nto_thread_state_str))
389 return nto_thread_state_str [priv->state];
390 }
745a434e
AR
391 return "";
392}
393
1b883d35 394void
d737fd7f 395nto_initialize_signals (void)
1b883d35 396{
1b883d35
KW
397 /* We use SIG45 for pulses, or something, so nostop, noprint
398 and pass them. */
2ea28649
PA
399 signal_stop_update (gdb_signal_from_name ("SIG45"), 0);
400 signal_print_update (gdb_signal_from_name ("SIG45"), 0);
401 signal_pass_update (gdb_signal_from_name ("SIG45"), 1);
1b883d35
KW
402
403 /* By default we don't want to stop on these two, but we do want to pass. */
404#if defined(SIGSELECT)
405 signal_stop_update (SIGSELECT, 0);
406 signal_print_update (SIGSELECT, 0);
407 signal_pass_update (SIGSELECT, 1);
408#endif
409
410#if defined(SIGPHOTON)
411 signal_stop_update (SIGPHOTON, 0);
412 signal_print_update (SIGPHOTON, 0);
413 signal_pass_update (SIGPHOTON, 1);
414#endif
d737fd7f 415}
8a6c0ccd
AR
416
417/* Read AUXV from initial_stack. */
418LONGEST
419nto_read_auxv_from_initial_stack (CORE_ADDR initial_stack, gdb_byte *readbuf,
420 LONGEST len, size_t sizeof_auxv_t)
421{
422 gdb_byte targ32[4]; /* For 32 bit target values. */
423 gdb_byte targ64[8]; /* For 64 bit target values. */
424 CORE_ADDR data_ofs = 0;
425 ULONGEST anint;
426 LONGEST len_read = 0;
427 gdb_byte *buff;
428 enum bfd_endian byte_order;
429 int ptr_size;
430
431 if (sizeof_auxv_t == 16)
432 ptr_size = 8;
433 else
434 ptr_size = 4;
435
436 /* Skip over argc, argv and envp... Comment from ldd.c:
437
438 The startup frame is set-up so that we have:
439 auxv
440 NULL
441 ...
442 envp2
443 envp1 <----- void *frame + (argc + 2) * sizeof(char *)
444 NULL
445 ...
446 argv2
447 argv1
448 argc <------ void * frame
449
450 On entry to ldd, frame gives the address of argc on the stack. */
451 /* Read argc. 4 bytes on both 64 and 32 bit arches and luckily little
452 * endian. So we just read first 4 bytes. */
453 if (target_read_memory (initial_stack + data_ofs, targ32, 4) != 0)
454 return 0;
455
456 byte_order = gdbarch_byte_order (target_gdbarch ());
457
458 anint = extract_unsigned_integer (targ32, sizeof (targ32), byte_order);
459
460 /* Size of pointer is assumed to be 4 bytes (32 bit arch.) */
461 data_ofs += (anint + 2) * ptr_size; /* + 2 comes from argc itself and
462 NULL terminating pointer in
463 argv. */
464
465 /* Now loop over env table: */
466 anint = 0;
467 while (target_read_memory (initial_stack + data_ofs, targ64, ptr_size)
468 == 0)
469 {
470 if (extract_unsigned_integer (targ64, ptr_size, byte_order) == 0)
471 anint = 1; /* Keep looping until non-null entry is found. */
472 else if (anint)
473 break;
474 data_ofs += ptr_size;
475 }
476 initial_stack += data_ofs;
477
478 memset (readbuf, 0, len);
479 buff = readbuf;
480 while (len_read <= len-sizeof_auxv_t)
481 {
482 if (target_read_memory (initial_stack + len_read, buff, sizeof_auxv_t)
483 == 0)
484 {
485 /* Both 32 and 64 bit structures have int as the first field. */
486 const ULONGEST a_type
487 = extract_unsigned_integer (buff, sizeof (targ32), byte_order);
488
489 if (a_type == AT_NULL)
490 break;
491 buff += sizeof_auxv_t;
492 len_read += sizeof_auxv_t;
493 }
494 else
495 break;
496 }
497 return len_read;
498}
a9889169
AR
499
500/* Allocate new nto_inferior_data object. */
501
502static struct nto_inferior_data *
503nto_new_inferior_data (void)
504{
505 struct nto_inferior_data *const inf_data
506 = XCNEW (struct nto_inferior_data);
507
508 return inf_data;
509}
510
511/* Free inferior data. */
512
513static void
514nto_inferior_data_cleanup (struct inferior *const inf, void *const dat)
515{
516 xfree (dat);
517}
518
519/* Return nto_inferior_data for the given INFERIOR. If not yet created,
520 construct it. */
521
522struct nto_inferior_data *
523nto_inferior_data (struct inferior *const inferior)
524{
525 struct inferior *const inf = inferior ? inferior : current_inferior ();
526 struct nto_inferior_data *inf_data;
527
528 gdb_assert (inf != NULL);
529
fb70bc1a
SM
530 inf_data
531 = (struct nto_inferior_data *) inferior_data (inf, nto_inferior_data_reg);
a9889169
AR
532 if (inf_data == NULL)
533 {
534 set_inferior_data (inf, nto_inferior_data_reg,
535 (inf_data = nto_new_inferior_data ()));
536 }
537
538 return inf_data;
539}
540
a9889169
AR
541void
542_initialize_nto_tdep (void)
543{
544 nto_inferior_data_reg
545 = register_inferior_data_with_cleanup (NULL, nto_inferior_data_cleanup);
546}
This page took 1.884354 seconds and 4 git commands to generate.