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