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