[nto] Fix nto target stopped by watchpoint.
[external/binutils.git] / gdb / nto-procfs.c
1 /* Machine independent support for QNX Neutrino /proc (process file system)
2    for GDB.  Written by Colin Burgess at QNX Software Systems Limited.
3
4    Copyright (C) 2003-2015 Free Software Foundation, Inc.
5
6    Contributed by QNX Software Systems Ltd.
7
8    This file is part of GDB.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
23 #include "defs.h"
24
25 #include <fcntl.h>
26 #include <spawn.h>
27 #include <sys/debug.h>
28 #include <sys/procfs.h>
29 #include <sys/neutrino.h>
30 #include <sys/syspage.h>
31 #include <dirent.h>
32 #include <sys/netmgr.h>
33 #include <sys/auxv.h>
34
35 #include "gdbcore.h"
36 #include "inferior.h"
37 #include "target.h"
38 #include "objfiles.h"
39 #include "gdbthread.h"
40 #include "nto-tdep.h"
41 #include "command.h"
42 #include "regcache.h"
43 #include "solib.h"
44 #include "inf-child.h"
45 #include "common/filestuff.h"
46
47 #define NULL_PID                0
48 #define _DEBUG_FLAG_TRACE       (_DEBUG_FLAG_TRACE_EXEC|_DEBUG_FLAG_TRACE_RD|\
49                 _DEBUG_FLAG_TRACE_WR|_DEBUG_FLAG_TRACE_MODIFY)
50
51 int ctl_fd;
52
53 static sighandler_t ofunc;
54
55 static procfs_run run;
56
57 static ptid_t do_attach (ptid_t ptid);
58
59 static int procfs_can_use_hw_breakpoint (struct target_ops *self,
60                                          enum bptype, int, int);
61
62 static int procfs_insert_hw_watchpoint (struct target_ops *self,
63                                         CORE_ADDR addr, int len,
64                                         enum target_hw_bp_type type,
65                                         struct expression *cond);
66
67 static int procfs_remove_hw_watchpoint (struct target_ops *self,
68                                         CORE_ADDR addr, int len,
69                                         enum target_hw_bp_type type,
70                                         struct expression *cond);
71
72 static int procfs_stopped_by_watchpoint (struct target_ops *ops);
73
74 /* These two globals are only ever set in procfs_open_1, but are
75    referenced elsewhere.  'nto_procfs_node' is a flag used to say
76    whether we are local, or we should get the current node descriptor
77    for the remote QNX node.  */
78 static char *nodestr;
79 static unsigned nto_procfs_node = ND_LOCAL_NODE;
80
81 /* Return the current QNX Node, or error out.  This is a simple
82    wrapper for the netmgr_strtond() function.  The reason this
83    is required is because QNX node descriptors are transient so
84    we have to re-acquire them every time.  */
85 static unsigned
86 nto_node (void)
87 {
88   unsigned node;
89
90   if (ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) == 0
91       || nodestr == NULL)
92     return ND_LOCAL_NODE;
93
94   node = netmgr_strtond (nodestr, 0);
95   if (node == -1)
96     error (_("Lost the QNX node.  Debug session probably over."));
97
98   return (node);
99 }
100
101 static enum gdb_osabi
102 procfs_is_nto_target (bfd *abfd)
103 {
104   return GDB_OSABI_QNXNTO;
105 }
106
107 /* This is called when we call 'target native' or 'target procfs
108    <arg>' from the (gdb) prompt.  For QNX6 (nto), the only valid arg
109    will be a QNX node string, eg: "/net/some_node".  If arg is not a
110    valid QNX node, we will default to local.  */
111 static void
112 procfs_open_1 (struct target_ops *ops, const char *arg, int from_tty)
113 {
114   char *endstr;
115   char buffer[50];
116   int fd, total_size;
117   procfs_sysinfo *sysinfo;
118   struct cleanup *cleanups;
119   char nto_procfs_path[PATH_MAX];
120
121   /* Offer to kill previous inferiors before opening this target.  */
122   target_preopen (from_tty);
123
124   nto_is_nto_target = procfs_is_nto_target;
125
126   /* Set the default node used for spawning to this one,
127      and only override it if there is a valid arg.  */
128
129   xfree (nodestr);
130   nodestr = NULL;
131
132   nto_procfs_node = ND_LOCAL_NODE;
133   nodestr = (arg != NULL) ? xstrdup (arg) : NULL;
134
135   init_thread_list ();
136
137   if (nodestr)
138     {
139       nto_procfs_node = netmgr_strtond (nodestr, &endstr);
140       if (nto_procfs_node == -1)
141         {
142           if (errno == ENOTSUP)
143             printf_filtered ("QNX Net Manager not found.\n");
144           printf_filtered ("Invalid QNX node %s: error %d (%s).\n", nodestr,
145                            errno, safe_strerror (errno));
146           xfree (nodestr);
147           nodestr = NULL;
148           nto_procfs_node = ND_LOCAL_NODE;
149         }
150       else if (*endstr)
151         {
152           if (*(endstr - 1) == '/')
153             *(endstr - 1) = 0;
154           else
155             *endstr = 0;
156         }
157     }
158   snprintf (nto_procfs_path, PATH_MAX - 1, "%s%s",
159             (nodestr != NULL) ? nodestr : "", "/proc");
160
161   fd = open (nto_procfs_path, O_RDONLY);
162   if (fd == -1)
163     {
164       printf_filtered ("Error opening %s : %d (%s)\n", nto_procfs_path, errno,
165                        safe_strerror (errno));
166       error (_("Invalid procfs arg"));
167     }
168   cleanups = make_cleanup_close (fd);
169
170   sysinfo = (void *) buffer;
171   if (devctl (fd, DCMD_PROC_SYSINFO, sysinfo, sizeof buffer, 0) != EOK)
172     {
173       printf_filtered ("Error getting size: %d (%s)\n", errno,
174                        safe_strerror (errno));
175       error (_("Devctl failed."));
176     }
177   else
178     {
179       total_size = sysinfo->total_size;
180       sysinfo = alloca (total_size);
181       if (sysinfo == NULL)
182         {
183           printf_filtered ("Memory error: %d (%s)\n", errno,
184                            safe_strerror (errno));
185           error (_("alloca failed."));
186         }
187       else
188         {
189           if (devctl (fd, DCMD_PROC_SYSINFO, sysinfo, total_size, 0) != EOK)
190             {
191               printf_filtered ("Error getting sysinfo: %d (%s)\n", errno,
192                                safe_strerror (errno));
193               error (_("Devctl failed."));
194             }
195           else
196             {
197               if (sysinfo->type !=
198                   nto_map_arch_to_cputype (gdbarch_bfd_arch_info
199                                            (target_gdbarch ())->arch_name))
200                 error (_("Invalid target CPU."));
201             }
202         }
203     }
204   do_cleanups (cleanups);
205
206   inf_child_open_target (ops, arg, from_tty);
207   printf_filtered ("Debugging using %s\n", nto_procfs_path);
208 }
209
210 static void
211 procfs_set_thread (ptid_t ptid)
212 {
213   pid_t tid;
214
215   tid = ptid_get_tid (ptid);
216   devctl (ctl_fd, DCMD_PROC_CURTHREAD, &tid, sizeof (tid), 0);
217 }
218
219 /*  Return nonzero if the thread TH is still alive.  */
220 static int
221 procfs_thread_alive (struct target_ops *ops, ptid_t ptid)
222 {
223   pid_t tid;
224   pid_t pid;
225   procfs_status status;
226   int err;
227
228   tid = ptid_get_tid (ptid);
229   pid = ptid_get_pid (ptid);
230
231   if (kill (pid, 0) == -1)
232     return 0;
233
234   status.tid = tid;
235   if ((err = devctl (ctl_fd, DCMD_PROC_TIDSTATUS,
236                      &status, sizeof (status), 0)) != EOK)
237     return 0;
238
239   /* Thread is alive or dead but not yet joined,
240      or dead and there is an alive (or dead unjoined) thread with
241      higher tid.
242
243      If the tid is not the same as requested, requested tid is dead.  */
244   return (status.tid == tid) && (status.state != STATE_DEAD);
245 }
246
247 static void
248 update_thread_private_data_name (struct thread_info *new_thread,
249                                  const char *newname)
250 {
251   int newnamelen;
252   struct private_thread_info *pti;
253
254   gdb_assert (newname != NULL);
255   gdb_assert (new_thread != NULL);
256   newnamelen = strlen (newname);
257   if (!new_thread->priv)
258     {
259       new_thread->priv = xmalloc (offsetof (struct private_thread_info,
260                                                name)
261                                      + newnamelen + 1);
262       memcpy (new_thread->priv->name, newname, newnamelen + 1);
263     }
264   else if (strcmp (newname, new_thread->priv->name) != 0)
265     {
266       /* Reallocate if neccessary.  */
267       int oldnamelen = strlen (new_thread->priv->name);
268
269       if (oldnamelen < newnamelen)
270         new_thread->priv = xrealloc (new_thread->priv,
271                                         offsetof (struct private_thread_info,
272                                                   name)
273                                         + newnamelen + 1);
274       memcpy (new_thread->priv->name, newname, newnamelen + 1);
275     }
276 }
277
278 static void 
279 update_thread_private_data (struct thread_info *new_thread, 
280                             pthread_t tid, int state, int flags)
281 {
282   struct private_thread_info *pti;
283   procfs_info pidinfo;
284   struct _thread_name *tn;
285   procfs_threadctl tctl;
286
287 #if _NTO_VERSION > 630
288   gdb_assert (new_thread != NULL);
289
290   if (devctl (ctl_fd, DCMD_PROC_INFO, &pidinfo,
291               sizeof(pidinfo), 0) != EOK)
292     return;
293
294   memset (&tctl, 0, sizeof (tctl));
295   tctl.cmd = _NTO_TCTL_NAME;
296   tn = (struct _thread_name *) (&tctl.data);
297
298   /* Fetch name for the given thread.  */
299   tctl.tid = tid;
300   tn->name_buf_len = sizeof (tctl.data) - sizeof (*tn);
301   tn->new_name_len = -1; /* Getting, not setting.  */
302   if (devctl (ctl_fd, DCMD_PROC_THREADCTL, &tctl, sizeof (tctl), NULL) != EOK)
303     tn->name_buf[0] = '\0';
304
305   tn->name_buf[_NTO_THREAD_NAME_MAX] = '\0';
306
307   update_thread_private_data_name (new_thread, tn->name_buf);
308
309   pti = (struct private_thread_info *) new_thread->priv;
310   pti->tid = tid;
311   pti->state = state;
312   pti->flags = flags;
313 #endif /* _NTO_VERSION */
314 }
315
316 static void
317 procfs_update_thread_list (struct target_ops *ops)
318 {
319   procfs_status status;
320   pid_t pid;
321   ptid_t ptid;
322   pthread_t tid;
323   struct thread_info *new_thread;
324
325   if (ctl_fd == -1)
326     return;
327
328   prune_threads ();
329
330   pid = ptid_get_pid (inferior_ptid);
331
332   status.tid = 1;
333
334   for (tid = 1;; ++tid)
335     {
336       if (status.tid == tid 
337           && (devctl (ctl_fd, DCMD_PROC_TIDSTATUS, &status, sizeof (status), 0)
338               != EOK))
339         break;
340       if (status.tid != tid)
341         /* The reason why this would not be equal is that devctl might have 
342            returned different tid, meaning the requested tid no longer exists
343            (e.g. thread exited).  */
344         continue;
345       ptid = ptid_build (pid, 0, tid);
346       new_thread = find_thread_ptid (ptid);
347       if (!new_thread)
348         new_thread = add_thread (ptid);
349       update_thread_private_data (new_thread, tid, status.state, 0);
350       status.tid++;
351     }
352   return;
353 }
354
355 static void
356 do_closedir_cleanup (void *dir)
357 {
358   closedir (dir);
359 }
360
361 static void
362 procfs_pidlist (char *args, int from_tty)
363 {
364   DIR *dp = NULL;
365   struct dirent *dirp = NULL;
366   char buf[PATH_MAX];
367   procfs_info *pidinfo = NULL;
368   procfs_debuginfo *info = NULL;
369   procfs_status *status = NULL;
370   pid_t num_threads = 0;
371   pid_t pid;
372   char name[512];
373   struct cleanup *cleanups;
374   char procfs_dir[PATH_MAX];
375
376   snprintf (procfs_dir, sizeof (procfs_dir), "%s%s",
377             (nodestr != NULL) ? nodestr : "", "/proc");
378
379   dp = opendir (procfs_dir);
380   if (dp == NULL)
381     {
382       fprintf_unfiltered (gdb_stderr, "failed to opendir \"%s\" - %d (%s)",
383                           procfs_dir, errno, safe_strerror (errno));
384       return;
385     }
386
387   cleanups = make_cleanup (do_closedir_cleanup, dp);
388
389   /* Start scan at first pid.  */
390   rewinddir (dp);
391
392   do
393     {
394       int fd;
395       struct cleanup *inner_cleanup;
396
397       /* Get the right pid and procfs path for the pid.  */
398       do
399         {
400           dirp = readdir (dp);
401           if (dirp == NULL)
402             {
403               do_cleanups (cleanups);
404               return;
405             }
406           snprintf (buf, sizeof (buf), "%s%s/%s/as",
407                     (nodestr != NULL) ? nodestr : "",
408                     "/proc", dirp->d_name);
409           pid = atoi (dirp->d_name);
410         }
411       while (pid == 0);
412
413       /* Open the procfs path.  */
414       fd = open (buf, O_RDONLY);
415       if (fd == -1)
416         {
417           fprintf_unfiltered (gdb_stderr, "failed to open %s - %d (%s)\n",
418                               buf, errno, safe_strerror (errno));
419           continue;
420         }
421       inner_cleanup = make_cleanup_close (fd);
422
423       pidinfo = (procfs_info *) buf;
424       if (devctl (fd, DCMD_PROC_INFO, pidinfo, sizeof (buf), 0) != EOK)
425         {
426           fprintf_unfiltered (gdb_stderr,
427                               "devctl DCMD_PROC_INFO failed - %d (%s)\n",
428                               errno, safe_strerror (errno));
429           break;
430         }
431       num_threads = pidinfo->num_threads;
432
433       info = (procfs_debuginfo *) buf;
434       if (devctl (fd, DCMD_PROC_MAPDEBUG_BASE, info, sizeof (buf), 0) != EOK)
435         strcpy (name, "unavailable");
436       else
437         strcpy (name, info->path);
438
439       /* Collect state info on all the threads.  */
440       status = (procfs_status *) buf;
441       for (status->tid = 1; status->tid <= num_threads; status->tid++)
442         {
443           const int err
444             = devctl (fd, DCMD_PROC_TIDSTATUS, status, sizeof (buf), 0);
445           printf_filtered ("%s - %d", name, pid);
446           if (err == EOK && status->tid != 0)
447             printf_filtered ("/%d\n", status->tid);
448           else
449             {
450               printf_filtered ("\n");
451               break;
452             }
453         }
454
455       do_cleanups (inner_cleanup);
456     }
457   while (dirp != NULL);
458
459   do_cleanups (cleanups);
460   return;
461 }
462
463 static void
464 procfs_meminfo (char *args, int from_tty)
465 {
466   procfs_mapinfo *mapinfos = NULL;
467   static int num_mapinfos = 0;
468   procfs_mapinfo *mapinfo_p, *mapinfo_p2;
469   int flags = ~0, err, num, i, j;
470
471   struct
472   {
473     procfs_debuginfo info;
474     char buff[_POSIX_PATH_MAX];
475   } map;
476
477   struct info
478   {
479     unsigned addr;
480     unsigned size;
481     unsigned flags;
482     unsigned debug_vaddr;
483     unsigned long long offset;
484   };
485
486   struct printinfo
487   {
488     unsigned long long ino;
489     unsigned dev;
490     struct info text;
491     struct info data;
492     char name[256];
493   } printme;
494
495   /* Get the number of map entrys.  */
496   err = devctl (ctl_fd, DCMD_PROC_MAPINFO, NULL, 0, &num);
497   if (err != EOK)
498     {
499       printf ("failed devctl num mapinfos - %d (%s)\n", err,
500               safe_strerror (err));
501       return;
502     }
503
504   mapinfos = XNEWVEC (procfs_mapinfo, num);
505
506   num_mapinfos = num;
507   mapinfo_p = mapinfos;
508
509   /* Fill the map entrys.  */
510   err = devctl (ctl_fd, DCMD_PROC_MAPINFO, mapinfo_p, num
511                 * sizeof (procfs_mapinfo), &num);
512   if (err != EOK)
513     {
514       printf ("failed devctl mapinfos - %d (%s)\n", err, safe_strerror (err));
515       xfree (mapinfos);
516       return;
517     }
518
519   num = min (num, num_mapinfos);
520
521   /* Run through the list of mapinfos, and store the data and text info
522      so we can print it at the bottom of the loop.  */
523   for (mapinfo_p = mapinfos, i = 0; i < num; i++, mapinfo_p++)
524     {
525       if (!(mapinfo_p->flags & flags))
526         mapinfo_p->ino = 0;
527
528       if (mapinfo_p->ino == 0)  /* Already visited.  */
529         continue;
530
531       map.info.vaddr = mapinfo_p->vaddr;
532
533       err = devctl (ctl_fd, DCMD_PROC_MAPDEBUG, &map, sizeof (map), 0);
534       if (err != EOK)
535         continue;
536
537       memset (&printme, 0, sizeof printme);
538       printme.dev = mapinfo_p->dev;
539       printme.ino = mapinfo_p->ino;
540       printme.text.addr = mapinfo_p->vaddr;
541       printme.text.size = mapinfo_p->size;
542       printme.text.flags = mapinfo_p->flags;
543       printme.text.offset = mapinfo_p->offset;
544       printme.text.debug_vaddr = map.info.vaddr;
545       strcpy (printme.name, map.info.path);
546
547       /* Check for matching data.  */
548       for (mapinfo_p2 = mapinfos, j = 0; j < num; j++, mapinfo_p2++)
549         {
550           if (mapinfo_p2->vaddr != mapinfo_p->vaddr
551               && mapinfo_p2->ino == mapinfo_p->ino
552               && mapinfo_p2->dev == mapinfo_p->dev)
553             {
554               map.info.vaddr = mapinfo_p2->vaddr;
555               err =
556                 devctl (ctl_fd, DCMD_PROC_MAPDEBUG, &map, sizeof (map), 0);
557               if (err != EOK)
558                 continue;
559
560               if (strcmp (map.info.path, printme.name))
561                 continue;
562
563               /* Lower debug_vaddr is always text, if nessessary, swap.  */
564               if ((int) map.info.vaddr < (int) printme.text.debug_vaddr)
565                 {
566                   memcpy (&(printme.data), &(printme.text),
567                           sizeof (printme.data));
568                   printme.text.addr = mapinfo_p2->vaddr;
569                   printme.text.size = mapinfo_p2->size;
570                   printme.text.flags = mapinfo_p2->flags;
571                   printme.text.offset = mapinfo_p2->offset;
572                   printme.text.debug_vaddr = map.info.vaddr;
573                 }
574               else
575                 {
576                   printme.data.addr = mapinfo_p2->vaddr;
577                   printme.data.size = mapinfo_p2->size;
578                   printme.data.flags = mapinfo_p2->flags;
579                   printme.data.offset = mapinfo_p2->offset;
580                   printme.data.debug_vaddr = map.info.vaddr;
581                 }
582               mapinfo_p2->ino = 0;
583             }
584         }
585       mapinfo_p->ino = 0;
586
587       printf_filtered ("%s\n", printme.name);
588       printf_filtered ("\ttext=%08x bytes @ 0x%08x\n", printme.text.size,
589                        printme.text.addr);
590       printf_filtered ("\t\tflags=%08x\n", printme.text.flags);
591       printf_filtered ("\t\tdebug=%08x\n", printme.text.debug_vaddr);
592       printf_filtered ("\t\toffset=%s\n", phex (printme.text.offset, 8));
593       if (printme.data.size)
594         {
595           printf_filtered ("\tdata=%08x bytes @ 0x%08x\n", printme.data.size,
596                            printme.data.addr);
597           printf_filtered ("\t\tflags=%08x\n", printme.data.flags);
598           printf_filtered ("\t\tdebug=%08x\n", printme.data.debug_vaddr);
599           printf_filtered ("\t\toffset=%s\n", phex (printme.data.offset, 8));
600         }
601       printf_filtered ("\tdev=0x%x\n", printme.dev);
602       printf_filtered ("\tino=0x%x\n", (unsigned int) printme.ino);
603     }
604   xfree (mapinfos);
605   return;
606 }
607
608 /* Print status information about what we're accessing.  */
609 static void
610 procfs_files_info (struct target_ops *ignore)
611 {
612   struct inferior *inf = current_inferior ();
613
614   printf_unfiltered ("\tUsing the running image of %s %s via %s.\n",
615                      inf->attach_flag ? "attached" : "child",
616                      target_pid_to_str (inferior_ptid),
617                      (nodestr != NULL) ? nodestr : "local node");
618 }
619
620 /* Target to_pid_to_exec_file implementation.  */
621
622 static char *
623 procfs_pid_to_exec_file (struct target_ops *ops, const int pid)
624 {
625   int proc_fd;
626   static char proc_path[PATH_MAX];
627   ssize_t rd;
628
629   /* Read exe file name.  */
630   snprintf (proc_path, sizeof (proc_path), "%s/proc/%d/exefile",
631             (nodestr != NULL) ? nodestr : "", pid);
632   proc_fd = open (proc_path, O_RDONLY);
633   if (proc_fd == -1)
634     return NULL;
635
636   rd = read (proc_fd, proc_path, sizeof (proc_path) - 1);
637   close (proc_fd);
638   if (rd <= 0)
639     {
640       proc_path[0] = '\0';
641       return NULL;
642     }
643   proc_path[rd] = '\0';
644   return proc_path;
645 }
646
647 /* Attach to process PID, then initialize for debugging it.  */
648 static void
649 procfs_attach (struct target_ops *ops, const char *args, int from_tty)
650 {
651   char *exec_file;
652   int pid;
653   struct inferior *inf;
654
655   pid = parse_pid_to_attach (args);
656
657   if (pid == getpid ())
658     error (_("Attaching GDB to itself is not a good idea..."));
659
660   if (from_tty)
661     {
662       exec_file = (char *) get_exec_file (0);
663
664       if (exec_file)
665         printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
666                            target_pid_to_str (pid_to_ptid (pid)));
667       else
668         printf_unfiltered ("Attaching to %s\n",
669                            target_pid_to_str (pid_to_ptid (pid)));
670
671       gdb_flush (gdb_stdout);
672     }
673   inferior_ptid = do_attach (pid_to_ptid (pid));
674   inf = current_inferior ();
675   inferior_appeared (inf, pid);
676   inf->attach_flag = 1;
677
678   if (!target_is_pushed (ops))
679     push_target (ops);
680
681   procfs_update_thread_list (ops);
682 }
683
684 static void
685 procfs_post_attach (struct target_ops *self, pid_t pid)
686 {
687   if (exec_bfd)
688     solib_create_inferior_hook (0);
689 }
690
691 static ptid_t
692 do_attach (ptid_t ptid)
693 {
694   procfs_status status;
695   struct sigevent event;
696   char path[PATH_MAX];
697
698   snprintf (path, PATH_MAX - 1, "%s%s/%d/as",
699             (nodestr != NULL) ? nodestr : "", "/proc", ptid_get_pid (ptid));
700   ctl_fd = open (path, O_RDWR);
701   if (ctl_fd == -1)
702     error (_("Couldn't open proc file %s, error %d (%s)"), path, errno,
703            safe_strerror (errno));
704   if (devctl (ctl_fd, DCMD_PROC_STOP, &status, sizeof (status), 0) != EOK)
705     error (_("Couldn't stop process"));
706
707   /* Define a sigevent for process stopped notification.  */
708   event.sigev_notify = SIGEV_SIGNAL_THREAD;
709   event.sigev_signo = SIGUSR1;
710   event.sigev_code = 0;
711   event.sigev_value.sival_ptr = NULL;
712   event.sigev_priority = -1;
713   devctl (ctl_fd, DCMD_PROC_EVENT, &event, sizeof (event), 0);
714
715   if (devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0) == EOK
716       && status.flags & _DEBUG_FLAG_STOPPED)
717     SignalKill (nto_node (), ptid_get_pid (ptid), 0, SIGCONT, 0, 0);
718   nto_init_solib_absolute_prefix ();
719   return ptid_build (ptid_get_pid (ptid), 0, status.tid);
720 }
721
722 /* Ask the user what to do when an interrupt is received.  */
723 static void
724 interrupt_query (void)
725 {
726   target_terminal_ours ();
727
728   if (query (_("Interrupted while waiting for the program.\n\
729 Give up (and stop debugging it)? ")))
730     {
731       target_mourn_inferior ();
732       quit ();
733     }
734
735   target_terminal_inferior ();
736 }
737
738 /* The user typed ^C twice.  */
739 static void
740 nto_handle_sigint_twice (int signo)
741 {
742   signal (signo, ofunc);
743   interrupt_query ();
744   signal (signo, nto_handle_sigint_twice);
745 }
746
747 static void
748 nto_handle_sigint (int signo)
749 {
750   /* If this doesn't work, try more severe steps.  */
751   signal (signo, nto_handle_sigint_twice);
752
753   target_interrupt (inferior_ptid);
754 }
755
756 static ptid_t
757 procfs_wait (struct target_ops *ops,
758              ptid_t ptid, struct target_waitstatus *ourstatus, int options)
759 {
760   sigset_t set;
761   siginfo_t info;
762   procfs_status status;
763   static int exit_signo = 0;    /* To track signals that cause termination.  */
764
765   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
766
767   if (ptid_equal (inferior_ptid, null_ptid))
768     {
769       ourstatus->kind = TARGET_WAITKIND_STOPPED;
770       ourstatus->value.sig = GDB_SIGNAL_0;
771       exit_signo = 0;
772       return null_ptid;
773     }
774
775   sigemptyset (&set);
776   sigaddset (&set, SIGUSR1);
777
778   devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
779   while (!(status.flags & _DEBUG_FLAG_ISTOP))
780     {
781       ofunc = signal (SIGINT, nto_handle_sigint);
782       sigwaitinfo (&set, &info);
783       signal (SIGINT, ofunc);
784       devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
785     }
786
787   nto_inferior_data (NULL)->stopped_flags = status.flags;
788   nto_inferior_data (NULL)->stopped_pc = status.ip;
789
790   if (status.flags & _DEBUG_FLAG_SSTEP)
791     {
792       ourstatus->kind = TARGET_WAITKIND_STOPPED;
793       ourstatus->value.sig = GDB_SIGNAL_TRAP;
794     }
795   /* Was it a breakpoint?  */
796   else if (status.flags & _DEBUG_FLAG_TRACE)
797     {
798       ourstatus->kind = TARGET_WAITKIND_STOPPED;
799       ourstatus->value.sig = GDB_SIGNAL_TRAP;
800     }
801   else if (status.flags & _DEBUG_FLAG_ISTOP)
802     {
803       switch (status.why)
804         {
805         case _DEBUG_WHY_SIGNALLED:
806           ourstatus->kind = TARGET_WAITKIND_STOPPED;
807           ourstatus->value.sig =
808             gdb_signal_from_host (status.info.si_signo);
809           exit_signo = 0;
810           break;
811         case _DEBUG_WHY_FAULTED:
812           ourstatus->kind = TARGET_WAITKIND_STOPPED;
813           if (status.info.si_signo == SIGTRAP)
814             {
815               ourstatus->value.sig = 0;
816               exit_signo = 0;
817             }
818           else
819             {
820               ourstatus->value.sig =
821                 gdb_signal_from_host (status.info.si_signo);
822               exit_signo = ourstatus->value.sig;
823             }
824           break;
825
826         case _DEBUG_WHY_TERMINATED:
827           {
828             int waitval = 0;
829
830             waitpid (ptid_get_pid (inferior_ptid), &waitval, WNOHANG);
831             if (exit_signo)
832               {
833                 /* Abnormal death.  */
834                 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
835                 ourstatus->value.sig = exit_signo;
836               }
837             else
838               {
839                 /* Normal death.  */
840                 ourstatus->kind = TARGET_WAITKIND_EXITED;
841                 ourstatus->value.integer = WEXITSTATUS (waitval);
842               }
843             exit_signo = 0;
844             break;
845           }
846
847         case _DEBUG_WHY_REQUESTED:
848           /* We are assuming a requested stop is due to a SIGINT.  */
849           ourstatus->kind = TARGET_WAITKIND_STOPPED;
850           ourstatus->value.sig = GDB_SIGNAL_INT;
851           exit_signo = 0;
852           break;
853         }
854     }
855
856   return ptid_build (status.pid, 0, status.tid);
857 }
858
859 /* Read the current values of the inferior's registers, both the
860    general register set and floating point registers (if supported)
861    and update gdb's idea of their current values.  */
862 static void
863 procfs_fetch_registers (struct target_ops *ops,
864                         struct regcache *regcache, int regno)
865 {
866   union
867   {
868     procfs_greg greg;
869     procfs_fpreg fpreg;
870     procfs_altreg altreg;
871   }
872   reg;
873   int regsize;
874
875   procfs_set_thread (inferior_ptid);
876   if (devctl (ctl_fd, DCMD_PROC_GETGREG, &reg, sizeof (reg), &regsize) == EOK)
877     nto_supply_gregset (regcache, (char *) &reg.greg);
878   if (devctl (ctl_fd, DCMD_PROC_GETFPREG, &reg, sizeof (reg), &regsize)
879       == EOK)
880     nto_supply_fpregset (regcache, (char *) &reg.fpreg);
881   if (devctl (ctl_fd, DCMD_PROC_GETALTREG, &reg, sizeof (reg), &regsize)
882       == EOK)
883     nto_supply_altregset (regcache, (char *) &reg.altreg);
884 }
885
886 /* Helper for procfs_xfer_partial that handles memory transfers.
887    Arguments are like target_xfer_partial.  */
888
889 static enum target_xfer_status
890 procfs_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
891                     ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
892 {
893   int nbytes;
894
895   if (lseek (ctl_fd, (off_t) memaddr, SEEK_SET) != (off_t) memaddr)
896     return TARGET_XFER_E_IO;
897
898   if (writebuf != NULL)
899     nbytes = write (ctl_fd, writebuf, len);
900   else
901     nbytes = read (ctl_fd, readbuf, len);
902   if (nbytes <= 0)
903     return TARGET_XFER_E_IO;
904   *xfered_len = nbytes;
905   return TARGET_XFER_OK;
906 }
907
908 /* Target to_xfer_partial implementation.  */
909
910 static enum target_xfer_status
911 procfs_xfer_partial (struct target_ops *ops, enum target_object object,
912                      const char *annex, gdb_byte *readbuf,
913                      const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
914                      ULONGEST *xfered_len)
915 {
916   switch (object)
917     {
918     case TARGET_OBJECT_MEMORY:
919       return procfs_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
920     case TARGET_OBJECT_AUXV:
921       if (readbuf != NULL)
922         {
923           int err;
924           CORE_ADDR initial_stack;
925           debug_process_t procinfo;
926           /* For 32-bit architecture, size of auxv_t is 8 bytes.  */
927           const unsigned int sizeof_auxv_t = sizeof (auxv_t);
928           const unsigned int sizeof_tempbuf = 20 * sizeof_auxv_t;
929           int tempread;
930           gdb_byte *const tempbuf = alloca (sizeof_tempbuf);
931
932           if (tempbuf == NULL)
933             return TARGET_XFER_E_IO;
934
935           err = devctl (ctl_fd, DCMD_PROC_INFO, &procinfo,
936                         sizeof procinfo, 0);
937           if (err != EOK)
938             return TARGET_XFER_E_IO;
939
940           initial_stack = procinfo.initial_stack;
941
942           /* procfs is always 'self-hosted', no byte-order manipulation.  */
943           tempread = nto_read_auxv_from_initial_stack (initial_stack, tempbuf,
944                                                        sizeof_tempbuf,
945                                                        sizeof (auxv_t));
946           tempread = min (tempread, len) - offset;
947           memcpy (readbuf, tempbuf + offset, tempread);
948           *xfered_len = tempread;
949           return tempread ? TARGET_XFER_OK : TARGET_XFER_EOF;
950         }
951         /* Fallthru */
952     default:
953       return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
954                                             readbuf, writebuf, offset, len,
955                                             xfered_len);
956     }
957 }
958
959 /* Take a program previously attached to and detaches it.
960    The program resumes execution and will no longer stop
961    on signals, etc.  We'd better not have left any breakpoints
962    in the program or it'll die when it hits one.  */
963 static void
964 procfs_detach (struct target_ops *ops, const char *args, int from_tty)
965 {
966   int siggnal = 0;
967   int pid;
968
969   if (from_tty)
970     {
971       char *exec_file = get_exec_file (0);
972       if (exec_file == 0)
973         exec_file = "";
974       printf_unfiltered ("Detaching from program: %s %s\n",
975                          exec_file, target_pid_to_str (inferior_ptid));
976       gdb_flush (gdb_stdout);
977     }
978   if (args)
979     siggnal = atoi (args);
980
981   if (siggnal)
982     SignalKill (nto_node (), ptid_get_pid (inferior_ptid), 0, siggnal, 0, 0);
983
984   close (ctl_fd);
985   ctl_fd = -1;
986
987   pid = ptid_get_pid (inferior_ptid);
988   inferior_ptid = null_ptid;
989   detach_inferior (pid);
990   init_thread_list ();
991   inf_child_maybe_unpush_target (ops);
992 }
993
994 static int
995 procfs_breakpoint (CORE_ADDR addr, int type, int size)
996 {
997   procfs_break brk;
998
999   brk.type = type;
1000   brk.addr = addr;
1001   brk.size = size;
1002   errno = devctl (ctl_fd, DCMD_PROC_BREAK, &brk, sizeof (brk), 0);
1003   if (errno != EOK)
1004     return 1;
1005   return 0;
1006 }
1007
1008 static int
1009 procfs_insert_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch,
1010                           struct bp_target_info *bp_tgt)
1011 {
1012   bp_tgt->placed_address = bp_tgt->reqstd_address;
1013   return procfs_breakpoint (bp_tgt->placed_address, _DEBUG_BREAK_EXEC, 0);
1014 }
1015
1016 static int
1017 procfs_remove_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch,
1018                           struct bp_target_info *bp_tgt)
1019 {
1020   return procfs_breakpoint (bp_tgt->placed_address, _DEBUG_BREAK_EXEC, -1);
1021 }
1022
1023 static int
1024 procfs_insert_hw_breakpoint (struct target_ops *self, struct gdbarch *gdbarch,
1025                              struct bp_target_info *bp_tgt)
1026 {
1027   bp_tgt->placed_address = bp_tgt->reqstd_address;
1028   return procfs_breakpoint (bp_tgt->placed_address,
1029                             _DEBUG_BREAK_EXEC | _DEBUG_BREAK_HW, 0);
1030 }
1031
1032 static int
1033 procfs_remove_hw_breakpoint (struct target_ops *self,
1034                              struct gdbarch *gdbarch,
1035                              struct bp_target_info *bp_tgt)
1036 {
1037   return procfs_breakpoint (bp_tgt->placed_address,
1038                             _DEBUG_BREAK_EXEC | _DEBUG_BREAK_HW, -1);
1039 }
1040
1041 static void
1042 procfs_resume (struct target_ops *ops,
1043                ptid_t ptid, int step, enum gdb_signal signo)
1044 {
1045   int signal_to_pass;
1046   procfs_status status;
1047   sigset_t *run_fault = (sigset_t *) (void *) &run.fault;
1048
1049   if (ptid_equal (inferior_ptid, null_ptid))
1050     return;
1051
1052   procfs_set_thread (ptid_equal (ptid, minus_one_ptid) ? inferior_ptid :
1053                      ptid);
1054
1055   run.flags = _DEBUG_RUN_FAULT | _DEBUG_RUN_TRACE;
1056   if (step)
1057     run.flags |= _DEBUG_RUN_STEP;
1058
1059   sigemptyset (run_fault);
1060   sigaddset (run_fault, FLTBPT);
1061   sigaddset (run_fault, FLTTRACE);
1062   sigaddset (run_fault, FLTILL);
1063   sigaddset (run_fault, FLTPRIV);
1064   sigaddset (run_fault, FLTBOUNDS);
1065   sigaddset (run_fault, FLTIOVF);
1066   sigaddset (run_fault, FLTIZDIV);
1067   sigaddset (run_fault, FLTFPE);
1068   /* Peter V will be changing this at some point.  */
1069   sigaddset (run_fault, FLTPAGE);
1070
1071   run.flags |= _DEBUG_RUN_ARM;
1072
1073   signal_to_pass = gdb_signal_to_host (signo);
1074
1075   if (signal_to_pass)
1076     {
1077       devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
1078       signal_to_pass = gdb_signal_to_host (signo);
1079       if (status.why & (_DEBUG_WHY_SIGNALLED | _DEBUG_WHY_FAULTED))
1080         {
1081           if (signal_to_pass != status.info.si_signo)
1082             {
1083               SignalKill (nto_node (), ptid_get_pid (inferior_ptid), 0,
1084                           signal_to_pass, 0, 0);
1085               run.flags |= _DEBUG_RUN_CLRFLT | _DEBUG_RUN_CLRSIG;
1086             }
1087           else          /* Let it kill the program without telling us.  */
1088             sigdelset (&run.trace, signal_to_pass);
1089         }
1090     }
1091   else
1092     run.flags |= _DEBUG_RUN_CLRSIG | _DEBUG_RUN_CLRFLT;
1093
1094   errno = devctl (ctl_fd, DCMD_PROC_RUN, &run, sizeof (run), 0);
1095   if (errno != EOK)
1096     {
1097       perror (_("run error!\n"));
1098       return;
1099     }
1100 }
1101
1102 static void
1103 procfs_mourn_inferior (struct target_ops *ops)
1104 {
1105   if (!ptid_equal (inferior_ptid, null_ptid))
1106     {
1107       SignalKill (nto_node (), ptid_get_pid (inferior_ptid), 0, SIGKILL, 0, 0);
1108       close (ctl_fd);
1109     }
1110   inferior_ptid = null_ptid;
1111   init_thread_list ();
1112   inf_child_mourn_inferior (ops);
1113 }
1114
1115 /* This function breaks up an argument string into an argument
1116    vector suitable for passing to execvp().
1117    E.g., on "run a b c d" this routine would get as input
1118    the string "a b c d", and as output it would fill in argv with
1119    the four arguments "a", "b", "c", "d".  The only additional
1120    functionality is simple quoting.  The gdb command:
1121         run a "b c d" f
1122    will fill in argv with the three args "a", "b c d", "e".  */
1123 static void
1124 breakup_args (char *scratch, char **argv)
1125 {
1126   char *pp, *cp = scratch;
1127   char quoting = 0;
1128
1129   for (;;)
1130     {
1131       /* Scan past leading separators.  */
1132       quoting = 0;
1133       while (*cp == ' ' || *cp == '\t' || *cp == '\n')
1134         cp++;
1135
1136       /* Break if at end of string.  */
1137       if (*cp == '\0')
1138         break;
1139
1140       /* Take an arg.  */
1141       if (*cp == '"')
1142         {
1143           cp++;
1144           quoting = strchr (cp, '"') ? 1 : 0;
1145         }
1146
1147       *argv++ = cp;
1148
1149       /* Scan for next arg separator.  */
1150       pp = cp;
1151       if (quoting)
1152         cp = strchr (pp, '"');
1153       if ((cp == NULL) || (!quoting))
1154         cp = strchr (pp, ' ');
1155       if (cp == NULL)
1156         cp = strchr (pp, '\t');
1157       if (cp == NULL)
1158         cp = strchr (pp, '\n');
1159
1160       /* No separators => end of string => break.  */
1161       if (cp == NULL)
1162         {
1163           pp = cp;
1164           break;
1165         }
1166
1167       /* Replace the separator with a terminator.  */
1168       *cp++ = '\0';
1169     }
1170
1171   /* Execv requires a null-terminated arg vector.  */
1172   *argv = NULL;
1173 }
1174
1175 static void
1176 procfs_create_inferior (struct target_ops *ops, char *exec_file,
1177                         char *allargs, char **env, int from_tty)
1178 {
1179   struct inheritance inherit;
1180   pid_t pid;
1181   int flags, errn;
1182   char **argv, *args;
1183   const char *in = "", *out = "", *err = "";
1184   int fd, fds[3];
1185   sigset_t set;
1186   const char *inferior_io_terminal = get_inferior_io_terminal ();
1187   struct inferior *inf;
1188
1189   argv = xmalloc (((strlen (allargs) + 1) / (unsigned) 2 + 2) *
1190                   sizeof (*argv));
1191   argv[0] = get_exec_file (1);
1192   if (!argv[0])
1193     {
1194       if (exec_file)
1195         argv[0] = exec_file;
1196       else
1197         return;
1198     }
1199
1200   args = xstrdup (allargs);
1201   breakup_args (args, (exec_file != NULL) ? &argv[1] : &argv[0]);
1202
1203   argv = nto_parse_redirection (argv, &in, &out, &err);
1204
1205   fds[0] = STDIN_FILENO;
1206   fds[1] = STDOUT_FILENO;
1207   fds[2] = STDERR_FILENO;
1208
1209   /* If the user specified I/O via gdb's --tty= arg, use it, but only
1210      if the i/o is not also being specified via redirection.  */
1211   if (inferior_io_terminal)
1212     {
1213       if (!in[0])
1214         in = inferior_io_terminal;
1215       if (!out[0])
1216         out = inferior_io_terminal;
1217       if (!err[0])
1218         err = inferior_io_terminal;
1219     }
1220
1221   if (in[0])
1222     {
1223       fd = open (in, O_RDONLY);
1224       if (fd == -1)
1225         perror (in);
1226       else
1227         fds[0] = fd;
1228     }
1229   if (out[0])
1230     {
1231       fd = open (out, O_WRONLY);
1232       if (fd == -1)
1233         perror (out);
1234       else
1235         fds[1] = fd;
1236     }
1237   if (err[0])
1238     {
1239       fd = open (err, O_WRONLY);
1240       if (fd == -1)
1241         perror (err);
1242       else
1243         fds[2] = fd;
1244     }
1245
1246   /* Clear any pending SIGUSR1's but keep the behavior the same.  */
1247   signal (SIGUSR1, signal (SIGUSR1, SIG_IGN));
1248
1249   sigemptyset (&set);
1250   sigaddset (&set, SIGUSR1);
1251   sigprocmask (SIG_UNBLOCK, &set, NULL);
1252
1253   memset (&inherit, 0, sizeof (inherit));
1254
1255   if (ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) != 0)
1256     {
1257       inherit.nd = nto_node ();
1258       inherit.flags |= SPAWN_SETND;
1259       inherit.flags &= ~SPAWN_EXEC;
1260     }
1261   inherit.flags |= SPAWN_SETGROUP | SPAWN_HOLD;
1262   inherit.pgroup = SPAWN_NEWPGROUP;
1263   pid = spawnp (argv[0], 3, fds, &inherit, argv,
1264                 ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) == 0 ? env : 0);
1265   xfree (args);
1266
1267   sigprocmask (SIG_BLOCK, &set, NULL);
1268
1269   if (pid == -1)
1270     error (_("Error spawning %s: %d (%s)"), argv[0], errno,
1271            safe_strerror (errno));
1272
1273   if (fds[0] != STDIN_FILENO)
1274     close (fds[0]);
1275   if (fds[1] != STDOUT_FILENO)
1276     close (fds[1]);
1277   if (fds[2] != STDERR_FILENO)
1278     close (fds[2]);
1279
1280   inferior_ptid = do_attach (pid_to_ptid (pid));
1281   procfs_update_thread_list (ops);
1282
1283   inf = current_inferior ();
1284   inferior_appeared (inf, pid);
1285   inf->attach_flag = 0;
1286
1287   flags = _DEBUG_FLAG_KLC;      /* Kill-on-Last-Close flag.  */
1288   errn = devctl (ctl_fd, DCMD_PROC_SET_FLAG, &flags, sizeof (flags), 0);
1289   if (errn != EOK)
1290     {
1291       /* FIXME: expected warning?  */
1292       /* warning( "Failed to set Kill-on-Last-Close flag: errno = %d(%s)\n",
1293          errn, strerror(errn) ); */
1294     }
1295   if (!target_is_pushed (ops))
1296     push_target (ops);
1297   target_terminal_init ();
1298
1299   if (exec_bfd != NULL
1300       || (symfile_objfile != NULL && symfile_objfile->obfd != NULL))
1301     solib_create_inferior_hook (0);
1302 }
1303
1304 static void
1305 procfs_interrupt (struct target_ops *self, ptid_t ptid)
1306 {
1307   devctl (ctl_fd, DCMD_PROC_STOP, NULL, 0, 0);
1308 }
1309
1310 static void
1311 procfs_kill_inferior (struct target_ops *ops)
1312 {
1313   target_mourn_inferior ();
1314 }
1315
1316 /* Fill buf with regset and return devctl cmd to do the setting.  Return
1317    -1 if we fail to get the regset.  Store size of regset in regsize.  */
1318 static int
1319 get_regset (int regset, char *buf, int bufsize, int *regsize)
1320 {
1321   int dev_get, dev_set;
1322   switch (regset)
1323     {
1324     case NTO_REG_GENERAL:
1325       dev_get = DCMD_PROC_GETGREG;
1326       dev_set = DCMD_PROC_SETGREG;
1327       break;
1328
1329     case NTO_REG_FLOAT:
1330       dev_get = DCMD_PROC_GETFPREG;
1331       dev_set = DCMD_PROC_SETFPREG;
1332       break;
1333
1334     case NTO_REG_ALT:
1335       dev_get = DCMD_PROC_GETALTREG;
1336       dev_set = DCMD_PROC_SETALTREG;
1337       break;
1338
1339     case NTO_REG_SYSTEM:
1340     default:
1341       return -1;
1342     }
1343   if (devctl (ctl_fd, dev_get, buf, bufsize, regsize) != EOK)
1344     return -1;
1345
1346   return dev_set;
1347 }
1348
1349 static void
1350 procfs_store_registers (struct target_ops *ops,
1351                         struct regcache *regcache, int regno)
1352 {
1353   union
1354   {
1355     procfs_greg greg;
1356     procfs_fpreg fpreg;
1357     procfs_altreg altreg;
1358   }
1359   reg;
1360   unsigned off;
1361   int len, regset, regsize, dev_set, err;
1362   char *data;
1363
1364   if (ptid_equal (inferior_ptid, null_ptid))
1365     return;
1366   procfs_set_thread (inferior_ptid);
1367
1368   if (regno == -1)
1369     {
1370       for (regset = NTO_REG_GENERAL; regset < NTO_REG_END; regset++)
1371         {
1372           dev_set = get_regset (regset, (char *) &reg,
1373                                 sizeof (reg), &regsize);
1374           if (dev_set == -1)
1375             continue;
1376
1377           if (nto_regset_fill (regcache, regset, (char *) &reg) == -1)
1378             continue;
1379
1380           err = devctl (ctl_fd, dev_set, &reg, regsize, 0);
1381           if (err != EOK)
1382             fprintf_unfiltered (gdb_stderr,
1383                                 "Warning unable to write regset %d: %s\n",
1384                                 regno, safe_strerror (err));
1385         }
1386     }
1387   else
1388     {
1389       regset = nto_regset_id (regno);
1390       if (regset == -1)
1391         return;
1392
1393       dev_set = get_regset (regset, (char *) &reg, sizeof (reg), &regsize);
1394       if (dev_set == -1)
1395         return;
1396
1397       len = nto_register_area (get_regcache_arch (regcache),
1398                                regno, regset, &off);
1399
1400       if (len < 1)
1401         return;
1402
1403       regcache_raw_collect (regcache, regno, (char *) &reg + off);
1404
1405       err = devctl (ctl_fd, dev_set, &reg, regsize, 0);
1406       if (err != EOK)
1407         fprintf_unfiltered (gdb_stderr,
1408                             "Warning unable to write regset %d: %s\n", regno,
1409                             safe_strerror (err));
1410     }
1411 }
1412
1413 /* Set list of signals to be handled in the target.  */
1414
1415 static void
1416 procfs_pass_signals (struct target_ops *self,
1417                      int numsigs, unsigned char *pass_signals)
1418 {
1419   int signo;
1420
1421   sigfillset (&run.trace);
1422
1423   for (signo = 1; signo < NSIG; signo++)
1424     {
1425       int target_signo = gdb_signal_from_host (signo);
1426       if (target_signo < numsigs && pass_signals[target_signo])
1427         sigdelset (&run.trace, signo);
1428     }
1429 }
1430
1431 static char *
1432 procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
1433 {
1434   static char buf[1024];
1435   int pid, tid, n;
1436   struct tidinfo *tip;
1437
1438   pid = ptid_get_pid (ptid);
1439   tid = ptid_get_tid (ptid);
1440
1441   n = snprintf (buf, 1023, "process %d", pid);
1442
1443 #if 0                           /* NYI */
1444   tip = procfs_thread_info (pid, tid);
1445   if (tip != NULL)
1446     snprintf (&buf[n], 1023, " (state = 0x%02x)", tip->state);
1447 #endif
1448
1449   return buf;
1450 }
1451
1452 /* to_can_run implementation for "target procfs".  Note this really
1453   means "can this target be the default run target", which there can
1454   be only one, and we make it be "target native" like other ports.
1455   "target procfs <node>" wouldn't make sense as default run target, as
1456   it needs <node>.  */
1457
1458 static int
1459 procfs_can_run (struct target_ops *self)
1460 {
1461   return 0;
1462 }
1463
1464 /* "target procfs".  */
1465 static struct target_ops nto_procfs_ops;
1466
1467 /* "target native".  */
1468 static struct target_ops *nto_native_ops;
1469
1470 /* to_open implementation for "target procfs".  */
1471
1472 static void
1473 procfs_open (const char *arg, int from_tty)
1474 {
1475   procfs_open_1 (&nto_procfs_ops, arg, from_tty);
1476 }
1477
1478 /* to_open implementation for "target native".  */
1479
1480 static void
1481 procfs_native_open (const char *arg, int from_tty)
1482 {
1483   procfs_open_1 (nto_native_ops, arg, from_tty);
1484 }
1485
1486 /* Create the "native" and "procfs" targets.  */
1487
1488 static void
1489 init_procfs_targets (void)
1490 {
1491   struct target_ops *t = inf_child_target ();
1492
1493   /* Leave to_shortname as "native".  */
1494   t->to_longname = "QNX Neutrino local process";
1495   t->to_doc = "QNX Neutrino local process (started by the \"run\" command).";
1496   t->to_open = procfs_native_open;
1497   t->to_attach = procfs_attach;
1498   t->to_post_attach = procfs_post_attach;
1499   t->to_detach = procfs_detach;
1500   t->to_resume = procfs_resume;
1501   t->to_wait = procfs_wait;
1502   t->to_fetch_registers = procfs_fetch_registers;
1503   t->to_store_registers = procfs_store_registers;
1504   t->to_xfer_partial = procfs_xfer_partial;
1505   t->to_files_info = procfs_files_info;
1506   t->to_insert_breakpoint = procfs_insert_breakpoint;
1507   t->to_remove_breakpoint = procfs_remove_breakpoint;
1508   t->to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint;
1509   t->to_insert_hw_breakpoint = procfs_insert_hw_breakpoint;
1510   t->to_remove_hw_breakpoint = procfs_remove_hw_breakpoint;
1511   t->to_insert_watchpoint = procfs_insert_hw_watchpoint;
1512   t->to_remove_watchpoint = procfs_remove_hw_watchpoint;
1513   t->to_stopped_by_watchpoint = procfs_stopped_by_watchpoint;
1514   t->to_kill = procfs_kill_inferior;
1515   t->to_create_inferior = procfs_create_inferior;
1516   t->to_mourn_inferior = procfs_mourn_inferior;
1517   t->to_pass_signals = procfs_pass_signals;
1518   t->to_thread_alive = procfs_thread_alive;
1519   t->to_update_thread_list = procfs_update_thread_list;
1520   t->to_pid_to_str = procfs_pid_to_str;
1521   t->to_interrupt = procfs_interrupt;
1522   t->to_have_continuable_watchpoint = 1;
1523   t->to_extra_thread_info = nto_extra_thread_info;
1524   t->to_pid_to_exec_file = procfs_pid_to_exec_file;
1525
1526   nto_native_ops = t;
1527
1528   /* Register "target native".  This is the default run target.  */
1529   add_target (t);
1530
1531   /* Register "target procfs <node>".  */
1532   nto_procfs_ops = *t;
1533   nto_procfs_ops.to_shortname = "procfs";
1534   nto_procfs_ops.to_can_run = procfs_can_run;
1535   t->to_longname = "QNX Neutrino local or remote process";
1536   t->to_doc = "QNX Neutrino process.  target procfs <node>";
1537   t->to_open = procfs_open;
1538
1539   add_target (&nto_procfs_ops);
1540 }
1541
1542 #define OSTYPE_NTO 1
1543
1544 extern initialize_file_ftype _initialize_procfs;
1545
1546 void
1547 _initialize_procfs (void)
1548 {
1549   sigset_t set;
1550
1551   init_procfs_targets ();
1552
1553   /* We use SIGUSR1 to gain control after we block waiting for a process.
1554      We use sigwaitevent to wait.  */
1555   sigemptyset (&set);
1556   sigaddset (&set, SIGUSR1);
1557   sigprocmask (SIG_BLOCK, &set, NULL);
1558
1559   /* Initially, make sure all signals are reported.  */
1560   sigfillset (&run.trace);
1561
1562   /* Stuff some information.  */
1563   nto_cpuinfo_flags = SYSPAGE_ENTRY (cpuinfo)->flags;
1564   nto_cpuinfo_valid = 1;
1565
1566   add_info ("pidlist", procfs_pidlist, _("pidlist"));
1567   add_info ("meminfo", procfs_meminfo, _("memory information"));
1568
1569   nto_is_nto_target = procfs_is_nto_target;
1570 }
1571
1572
1573 static int
1574 procfs_hw_watchpoint (int addr, int len, enum target_hw_bp_type type)
1575 {
1576   procfs_break brk;
1577
1578   switch (type)
1579     {
1580     case hw_read:
1581       brk.type = _DEBUG_BREAK_RD;
1582       break;
1583     case hw_access:
1584       brk.type = _DEBUG_BREAK_RW;
1585       break;
1586     default:                    /* Modify.  */
1587 /* FIXME: brk.type = _DEBUG_BREAK_RWM gives EINVAL for some reason.  */
1588       brk.type = _DEBUG_BREAK_RW;
1589     }
1590   brk.type |= _DEBUG_BREAK_HW;  /* Always ask for HW.  */
1591   brk.addr = addr;
1592   brk.size = len;
1593
1594   errno = devctl (ctl_fd, DCMD_PROC_BREAK, &brk, sizeof (brk), 0);
1595   if (errno != EOK)
1596     {
1597       perror (_("Failed to set hardware watchpoint"));
1598       return -1;
1599     }
1600   return 0;
1601 }
1602
1603 static int
1604 procfs_can_use_hw_breakpoint (struct target_ops *self,
1605                               enum bptype type,
1606                               int cnt, int othertype)
1607 {
1608   return 1;
1609 }
1610
1611 static int
1612 procfs_remove_hw_watchpoint (struct target_ops *self,
1613                              CORE_ADDR addr, int len,
1614                              enum target_hw_bp_type type,
1615                              struct expression *cond)
1616 {
1617   return procfs_hw_watchpoint (addr, -1, type);
1618 }
1619
1620 static int
1621 procfs_insert_hw_watchpoint (struct target_ops *self,
1622                              CORE_ADDR addr, int len,
1623                              enum target_hw_bp_type type,
1624                              struct expression *cond)
1625 {
1626   return procfs_hw_watchpoint (addr, len, type);
1627 }
1628
1629 static int
1630 procfs_stopped_by_watchpoint (struct target_ops *ops)
1631 {
1632   /* NOTE: nto_stopped_by_watchpoint will be called ONLY while we are
1633      stopped due to a SIGTRAP.  This assumes gdb works in 'all-stop' mode;
1634      future gdb versions will likely run in 'non-stop' mode in which case
1635      we will have to store/examine statuses per thread in question.
1636      Until then, this will work fine.  */
1637
1638   struct inferior *inf = current_inferior ();
1639   struct nto_inferior_data *inf_data;
1640
1641   gdb_assert (inf != NULL);
1642
1643   inf_data = nto_inferior_data (inf);
1644
1645   return inf_data->stopped_flags
1646          & (_DEBUG_FLAG_TRACE_RD
1647             | _DEBUG_FLAG_TRACE_WR
1648             | _DEBUG_FLAG_TRACE_MODIFY);
1649 }