[gdb/tdep] Fix reverse execution of LDR(immediate) T4
[binutils-gdb.git] / gdb / nto-procfs.c
bloba076a237f2698757192b25133b09a9e00211b91a
1 /* Machine independent support for QNX Neutrino /proc (process file system)
2 for GDB. Written by Colin Burgess at QNX Software Systems Limited.
4 Copyright (C) 2003-2024 Free Software Foundation, Inc.
6 Contributed by QNX Software Systems Ltd.
8 This file is part of GDB.
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.
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.
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/>. */
23 #include "defs.h"
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>
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 "gdbsupport/filestuff.h"
46 #include "gdbsupport/scoped_fd.h"
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)
52 int ctl_fd;
54 static sighandler_t ofunc;
56 static procfs_run run;
58 /* Create the "native" and "procfs" targets. */
60 struct nto_procfs_target : public inf_child_target
62 void open (const char *arg, int from_tty) override;
64 void attach (const char *, int) override = 0;
66 void post_attach (int);
68 void detach (inferior *, int) override;
70 void resume (ptid_t, int, enum gdb_signal) override;
72 ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override;
74 void fetch_registers (struct regcache *, int) override;
75 void store_registers (struct regcache *, int) override;
77 enum target_xfer_status xfer_partial (enum target_object object,
78 const char *annex,
79 gdb_byte *readbuf,
80 const gdb_byte *writebuf,
81 ULONGEST offset, ULONGEST len,
82 ULONGEST *xfered_len) override;
84 void files_info () override;
86 int insert_breakpoint (struct gdbarch *, struct bp_target_info *) override;
88 int remove_breakpoint (struct gdbarch *, struct bp_target_info *,
89 enum remove_bp_reason) override;
91 int can_use_hw_breakpoint (enum bptype, int, int) override;
93 int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
95 int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
97 int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
98 struct expression *) override;
100 int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
101 struct expression *) override;
103 bool stopped_by_watchpoint () override;
105 void kill () override;
107 void create_inferior (const char *, const std::string &,
108 char **, int) override;
110 void mourn_inferior () override;
112 void pass_signals (gdb::array_view<const unsigned char>) override;
114 bool thread_alive (ptid_t ptid) override;
116 void update_thread_list () override;
118 std::string pid_to_str (ptid_t) override;
120 void interrupt () override;
122 const char *extra_thread_info (struct thread_info *) override;
124 const char *pid_to_exec_file (int pid) override;
127 /* For "target native". */
129 static const target_info nto_native_target_info = {
130 "native",
131 N_("QNX Neutrino local process"),
132 N_("QNX Neutrino local process (started by the \"run\" command).")
135 class nto_procfs_target_native final : public nto_procfs_target
137 const target_info &info () const override
138 { return nto_native_target_info; }
141 /* For "target procfs <node>". */
143 static const target_info nto_procfs_target_info = {
144 "procfs",
145 N_("QNX Neutrino local or remote process"),
146 N_("QNX Neutrino process. target procfs NODE")
149 struct nto_procfs_target_procfs final : public nto_procfs_target
151 const target_info &info () const override
152 { return nto_procfs_target_info; }
155 static ptid_t do_attach (ptid_t ptid);
157 /* These two globals are only ever set in procfs_open_1, but are
158 referenced elsewhere. 'nto_procfs_node' is a flag used to say
159 whether we are local, or we should get the current node descriptor
160 for the remote QNX node. */
161 static char *nodestr;
162 static unsigned nto_procfs_node = ND_LOCAL_NODE;
164 /* Return the current QNX Node, or error out. This is a simple
165 wrapper for the netmgr_strtond() function. The reason this
166 is required is because QNX node descriptors are transient so
167 we have to re-acquire them every time. */
168 static unsigned
169 nto_node (void)
171 unsigned node;
173 if (ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) == 0
174 || nodestr == NULL)
175 return ND_LOCAL_NODE;
177 node = netmgr_strtond (nodestr, 0);
178 if (node == -1)
179 error (_("Lost the QNX node. Debug session probably over."));
181 return (node);
184 static enum gdb_osabi
185 procfs_is_nto_target (bfd *abfd)
187 return GDB_OSABI_QNXNTO;
190 /* This is called when we call 'target native' or 'target procfs
191 <arg>' from the (gdb) prompt. For QNX6 (nto), the only valid arg
192 will be a QNX node string, eg: "/net/some_node". If arg is not a
193 valid QNX node, we will default to local. */
194 void
195 nto_procfs_target::open (const char *arg, int from_tty)
197 char *endstr;
198 char buffer[50];
199 int total_size;
200 procfs_sysinfo *sysinfo;
201 char nto_procfs_path[PATH_MAX];
203 /* Offer to kill previous inferiors before opening this target. */
204 target_preopen (from_tty);
206 nto_is_nto_target = procfs_is_nto_target;
208 /* Set the default node used for spawning to this one,
209 and only override it if there is a valid arg. */
211 xfree (nodestr);
212 nodestr = NULL;
214 nto_procfs_node = ND_LOCAL_NODE;
215 nodestr = (arg != NULL) ? xstrdup (arg) : NULL;
217 if (nodestr)
219 nto_procfs_node = netmgr_strtond (nodestr, &endstr);
220 if (nto_procfs_node == -1)
222 if (errno == ENOTSUP)
223 gdb_printf ("QNX Net Manager not found.\n");
224 gdb_printf ("Invalid QNX node %s: error %d (%s).\n", nodestr,
225 errno, safe_strerror (errno));
226 xfree (nodestr);
227 nodestr = NULL;
228 nto_procfs_node = ND_LOCAL_NODE;
230 else if (*endstr)
232 if (*(endstr - 1) == '/')
233 *(endstr - 1) = 0;
234 else
235 *endstr = 0;
238 snprintf (nto_procfs_path, PATH_MAX - 1, "%s%s",
239 (nodestr != NULL) ? nodestr : "", "/proc");
241 scoped_fd fd (open (nto_procfs_path, O_RDONLY));
242 if (fd.get () == -1)
244 gdb_printf ("Error opening %s : %d (%s)\n", nto_procfs_path, errno,
245 safe_strerror (errno));
246 error (_("Invalid procfs arg"));
249 sysinfo = (void *) buffer;
250 if (devctl (fd.get (), DCMD_PROC_SYSINFO, sysinfo, sizeof buffer, 0) != EOK)
252 gdb_printf ("Error getting size: %d (%s)\n", errno,
253 safe_strerror (errno));
254 error (_("Devctl failed."));
256 else
258 total_size = sysinfo->total_size;
259 sysinfo = alloca (total_size);
260 if (sysinfo == NULL)
262 gdb_printf ("Memory error: %d (%s)\n", errno,
263 safe_strerror (errno));
264 error (_("alloca failed."));
266 else
268 if (devctl (fd.get (), DCMD_PROC_SYSINFO, sysinfo, total_size, 0)
269 != EOK)
271 gdb_printf ("Error getting sysinfo: %d (%s)\n", errno,
272 safe_strerror (errno));
273 error (_("Devctl failed."));
275 else
277 if (sysinfo->type !=
278 nto_map_arch_to_cputype
279 (gdbarch_bfd_arch_info
280 (current_inferior ()->arch ())->arch_name))
281 error (_("Invalid target CPU."));
286 inf_child_target::open (arg, from_tty);
287 gdb_printf ("Debugging using %s\n", nto_procfs_path);
290 static void
291 procfs_set_thread (ptid_t ptid)
293 pid_t tid;
295 tid = ptid.tid ();
296 devctl (ctl_fd, DCMD_PROC_CURTHREAD, &tid, sizeof (tid), 0);
299 /* Return true if the thread TH is still alive. */
301 bool
302 nto_procfs_target::thread_alive (ptid_t ptid)
304 pid_t tid;
305 pid_t pid;
306 procfs_status status;
307 int err;
309 tid = ptid.tid ();
310 pid = ptid.pid ();
312 if (kill (pid, 0) == -1)
313 return false;
315 status.tid = tid;
316 if ((err = devctl (ctl_fd, DCMD_PROC_TIDSTATUS,
317 &status, sizeof (status), 0)) != EOK)
318 return false;
320 /* Thread is alive or dead but not yet joined,
321 or dead and there is an alive (or dead unjoined) thread with
322 higher tid.
324 If the tid is not the same as requested, requested tid is dead. */
325 return (status.tid == tid) && (status.state != STATE_DEAD);
328 static void
329 update_thread_private_data_name (struct thread_info *new_thread,
330 const char *newname)
332 nto_thread_info *pti = get_nto_thread_info (new_thread);
334 gdb_assert (newname != NULL);
335 gdb_assert (new_thread != NULL);
337 if (pti)
339 pti = new nto_thread_info;
340 new_thread->priv.reset (pti);
343 pti->name = newname;
346 static void
347 update_thread_private_data (struct thread_info *new_thread,
348 pthread_t tid, int state, int flags)
350 procfs_info pidinfo;
351 struct _thread_name *tn;
352 procfs_threadctl tctl;
354 #if _NTO_VERSION > 630
355 gdb_assert (new_thread != NULL);
357 if (devctl (ctl_fd, DCMD_PROC_INFO, &pidinfo,
358 sizeof(pidinfo), 0) != EOK)
359 return;
361 memset (&tctl, 0, sizeof (tctl));
362 tctl.cmd = _NTO_TCTL_NAME;
363 tn = (struct _thread_name *) (&tctl.data);
365 /* Fetch name for the given thread. */
366 tctl.tid = tid;
367 tn->name_buf_len = sizeof (tctl.data) - sizeof (*tn);
368 tn->new_name_len = -1; /* Getting, not setting. */
369 if (devctl (ctl_fd, DCMD_PROC_THREADCTL, &tctl, sizeof (tctl), NULL) != EOK)
370 tn->name_buf[0] = '\0';
372 tn->name_buf[_NTO_THREAD_NAME_MAX] = '\0';
374 update_thread_private_data_name (new_thread, tn->name_buf);
376 nto_thread_info *pti = get_nto_thread_info (new_thread);
377 pti->tid = tid;
378 pti->state = state;
379 pti->flags = flags;
380 #endif /* _NTO_VERSION */
383 void
384 nto_procfs_target::update_thread_list ()
386 procfs_status status;
387 pid_t pid;
388 ptid_t ptid;
389 pthread_t tid;
390 struct thread_info *new_thread;
392 if (ctl_fd == -1)
393 return;
395 prune_threads ();
397 pid = current_inferior ()->pid;
399 status.tid = 1;
401 for (tid = 1;; ++tid)
403 if (status.tid == tid
404 && (devctl (ctl_fd, DCMD_PROC_TIDSTATUS, &status, sizeof (status), 0)
405 != EOK))
406 break;
407 if (status.tid != tid)
408 /* The reason why this would not be equal is that devctl might have
409 returned different tid, meaning the requested tid no longer exists
410 (e.g. thread exited). */
411 continue;
412 ptid = ptid_t (pid, 0, tid);
413 new_thread = this->find_thread (ptid);
414 if (!new_thread)
415 new_thread = add_thread (ptid);
416 update_thread_private_data (new_thread, tid, status.state, 0);
417 status.tid++;
419 return;
422 static void
423 procfs_pidlist (const char *args, int from_tty)
425 struct dirent *dirp = NULL;
426 char buf[PATH_MAX];
427 procfs_info *pidinfo = NULL;
428 procfs_debuginfo *info = NULL;
429 procfs_status *status = NULL;
430 pid_t num_threads = 0;
431 pid_t pid;
432 char name[512];
433 char procfs_dir[PATH_MAX];
435 snprintf (procfs_dir, sizeof (procfs_dir), "%s%s",
436 (nodestr != NULL) ? nodestr : "", "/proc");
438 gdb_dir_up dp (opendir (procfs_dir));
439 if (dp == NULL)
441 gdb_printf (gdb_stderr, "failed to opendir \"%s\" - %d (%s)",
442 procfs_dir, errno, safe_strerror (errno));
443 return;
446 /* Start scan at first pid. */
447 rewinddir (dp.get ());
451 /* Get the right pid and procfs path for the pid. */
454 dirp = readdir (dp.get ());
455 if (dirp == NULL)
456 return;
457 snprintf (buf, sizeof (buf), "%s%s/%s/as",
458 (nodestr != NULL) ? nodestr : "",
459 "/proc", dirp->d_name);
460 pid = atoi (dirp->d_name);
462 while (pid == 0);
464 /* Open the procfs path. */
465 scoped_fd fd (open (buf, O_RDONLY));
466 if (fd.get () == -1)
468 gdb_printf (gdb_stderr, "failed to open %s - %d (%s)\n",
469 buf, errno, safe_strerror (errno));
470 continue;
473 pidinfo = (procfs_info *) buf;
474 if (devctl (fd.get (), DCMD_PROC_INFO, pidinfo, sizeof (buf), 0) != EOK)
476 gdb_printf (gdb_stderr,
477 "devctl DCMD_PROC_INFO failed - %d (%s)\n",
478 errno, safe_strerror (errno));
479 break;
481 num_threads = pidinfo->num_threads;
483 info = (procfs_debuginfo *) buf;
484 if (devctl (fd.get (), DCMD_PROC_MAPDEBUG_BASE, info, sizeof (buf), 0)
485 != EOK)
486 strcpy (name, "unavailable");
487 else
488 strcpy (name, info->path);
490 /* Collect state info on all the threads. */
491 status = (procfs_status *) buf;
492 for (status->tid = 1; status->tid <= num_threads; status->tid++)
494 const int err
495 = devctl (fd.get (), DCMD_PROC_TIDSTATUS, status, sizeof (buf), 0);
496 gdb_printf ("%s - %d", name, pid);
497 if (err == EOK && status->tid != 0)
498 gdb_printf ("/%d\n", status->tid);
499 else
501 gdb_printf ("\n");
502 break;
506 while (dirp != NULL);
509 static void
510 procfs_meminfo (const char *args, int from_tty)
512 procfs_mapinfo *mapinfos = NULL;
513 static int num_mapinfos = 0;
514 procfs_mapinfo *mapinfo_p, *mapinfo_p2;
515 int flags = ~0, err, num, i, j;
517 struct
519 procfs_debuginfo info;
520 char buff[_POSIX_PATH_MAX];
521 } map;
523 struct info
525 unsigned addr;
526 unsigned size;
527 unsigned flags;
528 unsigned debug_vaddr;
529 unsigned long long offset;
532 struct printinfo
534 unsigned long long ino;
535 unsigned dev;
536 struct info text;
537 struct info data;
538 char name[256];
539 } printme;
541 /* Get the number of map entrys. */
542 err = devctl (ctl_fd, DCMD_PROC_MAPINFO, NULL, 0, &num);
543 if (err != EOK)
545 printf ("failed devctl num mapinfos - %d (%s)\n", err,
546 safe_strerror (err));
547 return;
550 mapinfos = XNEWVEC (procfs_mapinfo, num);
552 num_mapinfos = num;
553 mapinfo_p = mapinfos;
555 /* Fill the map entrys. */
556 err = devctl (ctl_fd, DCMD_PROC_MAPINFO, mapinfo_p, num
557 * sizeof (procfs_mapinfo), &num);
558 if (err != EOK)
560 printf ("failed devctl mapinfos - %d (%s)\n", err, safe_strerror (err));
561 xfree (mapinfos);
562 return;
565 num = std::min (num, num_mapinfos);
567 /* Run through the list of mapinfos, and store the data and text info
568 so we can print it at the bottom of the loop. */
569 for (mapinfo_p = mapinfos, i = 0; i < num; i++, mapinfo_p++)
571 if (!(mapinfo_p->flags & flags))
572 mapinfo_p->ino = 0;
574 if (mapinfo_p->ino == 0) /* Already visited. */
575 continue;
577 map.info.vaddr = mapinfo_p->vaddr;
579 err = devctl (ctl_fd, DCMD_PROC_MAPDEBUG, &map, sizeof (map), 0);
580 if (err != EOK)
581 continue;
583 memset (&printme, 0, sizeof printme);
584 printme.dev = mapinfo_p->dev;
585 printme.ino = mapinfo_p->ino;
586 printme.text.addr = mapinfo_p->vaddr;
587 printme.text.size = mapinfo_p->size;
588 printme.text.flags = mapinfo_p->flags;
589 printme.text.offset = mapinfo_p->offset;
590 printme.text.debug_vaddr = map.info.vaddr;
591 strcpy (printme.name, map.info.path);
593 /* Check for matching data. */
594 for (mapinfo_p2 = mapinfos, j = 0; j < num; j++, mapinfo_p2++)
596 if (mapinfo_p2->vaddr != mapinfo_p->vaddr
597 && mapinfo_p2->ino == mapinfo_p->ino
598 && mapinfo_p2->dev == mapinfo_p->dev)
600 map.info.vaddr = mapinfo_p2->vaddr;
601 err =
602 devctl (ctl_fd, DCMD_PROC_MAPDEBUG, &map, sizeof (map), 0);
603 if (err != EOK)
604 continue;
606 if (strcmp (map.info.path, printme.name))
607 continue;
609 /* Lower debug_vaddr is always text, if necessary, swap. */
610 if ((int) map.info.vaddr < (int) printme.text.debug_vaddr)
612 memcpy (&(printme.data), &(printme.text),
613 sizeof (printme.data));
614 printme.text.addr = mapinfo_p2->vaddr;
615 printme.text.size = mapinfo_p2->size;
616 printme.text.flags = mapinfo_p2->flags;
617 printme.text.offset = mapinfo_p2->offset;
618 printme.text.debug_vaddr = map.info.vaddr;
620 else
622 printme.data.addr = mapinfo_p2->vaddr;
623 printme.data.size = mapinfo_p2->size;
624 printme.data.flags = mapinfo_p2->flags;
625 printme.data.offset = mapinfo_p2->offset;
626 printme.data.debug_vaddr = map.info.vaddr;
628 mapinfo_p2->ino = 0;
631 mapinfo_p->ino = 0;
633 gdb_printf ("%s\n", printme.name);
634 gdb_printf ("\ttext=%08x bytes @ 0x%08x\n", printme.text.size,
635 printme.text.addr);
636 gdb_printf ("\t\tflags=%08x\n", printme.text.flags);
637 gdb_printf ("\t\tdebug=%08x\n", printme.text.debug_vaddr);
638 gdb_printf ("\t\toffset=%s\n", phex (printme.text.offset, 8));
639 if (printme.data.size)
641 gdb_printf ("\tdata=%08x bytes @ 0x%08x\n", printme.data.size,
642 printme.data.addr);
643 gdb_printf ("\t\tflags=%08x\n", printme.data.flags);
644 gdb_printf ("\t\tdebug=%08x\n", printme.data.debug_vaddr);
645 gdb_printf ("\t\toffset=%s\n", phex (printme.data.offset, 8));
647 gdb_printf ("\tdev=0x%x\n", printme.dev);
648 gdb_printf ("\tino=0x%x\n", (unsigned int) printme.ino);
650 xfree (mapinfos);
651 return;
654 /* Print status information about what we're accessing. */
655 void
656 nto_procfs_target::files_info ()
658 struct inferior *inf = current_inferior ();
660 gdb_printf ("\tUsing the running image of %s %s via %s.\n",
661 inf->attach_flag ? "attached" : "child",
662 target_pid_to_str (ptid_t (inf->pid)).c_str (),
663 (nodestr != NULL) ? nodestr : "local node");
666 /* Target to_pid_to_exec_file implementation. */
668 const char *
669 nto_procfs_target::pid_to_exec_file (const int pid)
671 int proc_fd;
672 static char proc_path[PATH_MAX];
673 ssize_t rd;
675 /* Read exe file name. */
676 snprintf (proc_path, sizeof (proc_path), "%s/proc/%d/exefile",
677 (nodestr != NULL) ? nodestr : "", pid);
678 proc_fd = open (proc_path, O_RDONLY);
679 if (proc_fd == -1)
680 return NULL;
682 rd = read (proc_fd, proc_path, sizeof (proc_path) - 1);
683 close (proc_fd);
684 if (rd <= 0)
686 proc_path[0] = '\0';
687 return NULL;
689 proc_path[rd] = '\0';
690 return proc_path;
693 /* Attach to process PID, then initialize for debugging it. */
694 void
695 nto_procfs_target::attach (const char *args, int from_tty)
697 int pid;
698 struct inferior *inf;
700 pid = parse_pid_to_attach (args);
702 if (pid == getpid ())
703 error (_("Attaching GDB to itself is not a good idea..."));
705 target_announce_attach (from_tty, pid);
707 ptid_t ptid = do_attach (ptid_t (pid));
708 inf = current_inferior ();
709 inferior_appeared (inf, pid);
710 inf->attach_flag = true;
712 if (!inf->target_is_pushed (ops))
713 inf->push_target (ops);
715 update_thread_list ();
717 switch_to_thread (this->find_thread (ptid));
720 void
721 nto_procfs_target::post_attach (pid_t pid)
723 if (current_program_space->exec_bfd ())
724 solib_create_inferior_hook (0);
727 static ptid_t
728 do_attach (ptid_t ptid)
730 procfs_status status;
731 struct sigevent event;
732 char path[PATH_MAX];
734 snprintf (path, PATH_MAX - 1, "%s%s/%d/as",
735 (nodestr != NULL) ? nodestr : "", "/proc", ptid.pid ());
736 ctl_fd = open (path, O_RDWR);
737 if (ctl_fd == -1)
738 error (_("Couldn't open proc file %s, error %d (%s)"), path, errno,
739 safe_strerror (errno));
740 if (devctl (ctl_fd, DCMD_PROC_STOP, &status, sizeof (status), 0) != EOK)
741 error (_("Couldn't stop process"));
743 /* Define a sigevent for process stopped notification. */
744 event.sigev_notify = SIGEV_SIGNAL_THREAD;
745 event.sigev_signo = SIGUSR1;
746 event.sigev_code = 0;
747 event.sigev_value.sival_ptr = NULL;
748 event.sigev_priority = -1;
749 devctl (ctl_fd, DCMD_PROC_EVENT, &event, sizeof (event), 0);
751 if (devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0) == EOK
752 && status.flags & _DEBUG_FLAG_STOPPED)
753 SignalKill (nto_node (), ptid.pid (), 0, SIGCONT, 0, 0);
754 nto_init_solib_absolute_prefix ();
755 return ptid_t (ptid.pid (), 0, status.tid);
758 /* Ask the user what to do when an interrupt is received. */
759 static void
760 interrupt_query (void)
762 if (query (_("Interrupted while waiting for the program.\n\
763 Give up (and stop debugging it)? ")))
765 target_mourn_inferior (inferior_ptid);
766 quit ();
770 /* The user typed ^C twice. */
771 static void
772 nto_handle_sigint_twice (int signo)
774 signal (signo, ofunc);
775 interrupt_query ();
776 signal (signo, nto_handle_sigint_twice);
779 static void
780 nto_handle_sigint (int signo)
782 /* If this doesn't work, try more severe steps. */
783 signal (signo, nto_handle_sigint_twice);
785 target_interrupt ();
788 sptid_t
789 nto_procfs_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
790 target_wait_flags options)
792 sigset_t set;
793 siginfo_t info;
794 procfs_status status;
795 static int exit_signo = 0; /* To track signals that cause termination. */
797 ourstatus->set_spurious ();
799 if (inferior_ptid == null_ptid)
801 ourstatus->set_stopped (GDB_SIGNAL_0);
802 exit_signo = 0;
803 return null_ptid;
806 sigemptyset (&set);
807 sigaddset (&set, SIGUSR1);
809 devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
810 while (!(status.flags & _DEBUG_FLAG_ISTOP))
812 ofunc = signal (SIGINT, nto_handle_sigint);
813 sigwaitinfo (&set, &info);
814 signal (SIGINT, ofunc);
815 devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
818 nto_inferior_data (NULL)->stopped_flags = status.flags;
819 nto_inferior_data (NULL)->stopped_pc = status.ip;
821 if (status.flags & _DEBUG_FLAG_SSTEP)
822 ourstatus->set_stopped (GDB_SIGNAL_TRAP);
823 /* Was it a breakpoint? */
824 else if (status.flags & _DEBUG_FLAG_TRACE)
825 ourstatus->set_stopped (GDB_SIGNAL_TRAP);
826 else if (status.flags & _DEBUG_FLAG_ISTOP)
828 switch (status.why)
830 case _DEBUG_WHY_SIGNALLED:
831 ourstatus->set_stopped (gdb_signal_from_host (status.info.si_signo));
832 exit_signo = 0;
833 break;
834 case _DEBUG_WHY_FAULTED:
835 if (status.info.si_signo == SIGTRAP)
837 ourstatus->set_stopped (0);
838 exit_signo = 0;
840 else
842 ourstatus->set_stopped
843 (gdb_signal_from_host (status.info.si_signo));
844 exit_signo = ourstatus->sig ();
846 break;
848 case _DEBUG_WHY_TERMINATED:
850 int waitval = 0;
852 waitpid (inferior_ptid.pid (), &waitval, WNOHANG);
853 if (exit_signo)
855 /* Abnormal death. */
856 ourstatus->set_signalled (exit_signo);
858 else
860 /* Normal death. */
861 ourstatus->set_exited (WEXITSTATUS (waitval));
863 exit_signo = 0;
864 break;
867 case _DEBUG_WHY_REQUESTED:
868 /* We are assuming a requested stop is due to a SIGINT. */
869 ourstatus->set_stopped (GDB_SIGNAL_INT);
870 exit_signo = 0;
871 break;
875 return ptid_t (status.pid, 0, status.tid);
878 /* Read the current values of the inferior's registers, both the
879 general register set and floating point registers (if supported)
880 and update gdb's idea of their current values. */
881 void
882 nto_procfs_target::fetch_registers (struct regcache *regcache, int regno)
884 union
886 procfs_greg greg;
887 procfs_fpreg fpreg;
888 procfs_altreg altreg;
890 reg;
891 int regsize;
893 procfs_set_thread (regcache->ptid ());
894 if (devctl (ctl_fd, DCMD_PROC_GETGREG, &reg, sizeof (reg), &regsize) == EOK)
895 nto_supply_gregset (regcache, (char *) &reg.greg);
896 if (devctl (ctl_fd, DCMD_PROC_GETFPREG, &reg, sizeof (reg), &regsize)
897 == EOK)
898 nto_supply_fpregset (regcache, (char *) &reg.fpreg);
899 if (devctl (ctl_fd, DCMD_PROC_GETALTREG, &reg, sizeof (reg), &regsize)
900 == EOK)
901 nto_supply_altregset (regcache, (char *) &reg.altreg);
904 /* Helper for procfs_xfer_partial that handles memory transfers.
905 Arguments are like target_xfer_partial. */
907 static enum target_xfer_status
908 procfs_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
909 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
911 int nbytes;
913 if (lseek (ctl_fd, (off_t) memaddr, SEEK_SET) != (off_t) memaddr)
914 return TARGET_XFER_E_IO;
916 if (writebuf != NULL)
917 nbytes = write (ctl_fd, writebuf, len);
918 else
919 nbytes = read (ctl_fd, readbuf, len);
920 if (nbytes <= 0)
921 return TARGET_XFER_E_IO;
922 *xfered_len = nbytes;
923 return TARGET_XFER_OK;
926 /* Target to_xfer_partial implementation. */
928 enum target_xfer_status
929 nto_procfs_target::xfer_partial (enum target_object object,
930 const char *annex, gdb_byte *readbuf,
931 const gdb_byte *writebuf, ULONGEST offset,
932 ULONGEST len, ULONGEST *xfered_len)
934 switch (object)
936 case TARGET_OBJECT_MEMORY:
937 return procfs_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
938 case TARGET_OBJECT_AUXV:
939 if (readbuf != NULL)
941 int err;
942 CORE_ADDR initial_stack;
943 debug_process_t procinfo;
944 /* For 32-bit architecture, size of auxv_t is 8 bytes. */
945 const unsigned int sizeof_auxv_t = sizeof (auxv_t);
946 const unsigned int sizeof_tempbuf = 20 * sizeof_auxv_t;
947 int tempread;
948 gdb_byte *const tempbuf = alloca (sizeof_tempbuf);
950 if (tempbuf == NULL)
951 return TARGET_XFER_E_IO;
953 err = devctl (ctl_fd, DCMD_PROC_INFO, &procinfo,
954 sizeof procinfo, 0);
955 if (err != EOK)
956 return TARGET_XFER_E_IO;
958 initial_stack = procinfo.initial_stack;
960 /* procfs is always 'self-hosted', no byte-order manipulation. */
961 tempread = nto_read_auxv_from_initial_stack (initial_stack, tempbuf,
962 sizeof_tempbuf,
963 sizeof (auxv_t));
964 tempread = std::min (tempread, len) - offset;
965 memcpy (readbuf, tempbuf + offset, tempread);
966 *xfered_len = tempread;
967 return tempread ? TARGET_XFER_OK : TARGET_XFER_EOF;
969 /* Fallthru */
970 default:
971 return this->beneath ()->xfer_partial (object, annex,
972 readbuf, writebuf, offset, len,
973 xfered_len);
977 /* Take a program previously attached to and detaches it.
978 The program resumes execution and will no longer stop
979 on signals, etc. We'd better not have left any breakpoints
980 in the program or it'll die when it hits one. */
981 void
982 nto_procfs_target::detach (inferior *inf, int from_tty)
984 target_announce_detach ();
986 if (siggnal)
987 SignalKill (nto_node (), inf->pid, 0, 0, 0, 0);
989 close (ctl_fd);
990 ctl_fd = -1;
992 switch_to_no_thread ();
993 detach_inferior (inf->pid);
994 init_thread_list ();
995 inf_child_maybe_unpush_target (ops);
998 static int
999 procfs_breakpoint (CORE_ADDR addr, int type, int size)
1001 procfs_break brk;
1003 brk.type = type;
1004 brk.addr = addr;
1005 brk.size = size;
1006 errno = devctl (ctl_fd, DCMD_PROC_BREAK, &brk, sizeof (brk), 0);
1007 if (errno != EOK)
1008 return 1;
1009 return 0;
1013 nto_procfs_target::insert_breakpoint (struct gdbarch *gdbarch,
1014 struct bp_target_info *bp_tgt)
1016 bp_tgt->placed_address = bp_tgt->reqstd_address;
1017 return procfs_breakpoint (bp_tgt->placed_address, _DEBUG_BREAK_EXEC, 0);
1021 nto_procfs_target::remove_breakpoint (struct gdbarch *gdbarch,
1022 struct bp_target_info *bp_tgt,
1023 enum remove_bp_reason reason)
1025 return procfs_breakpoint (bp_tgt->placed_address, _DEBUG_BREAK_EXEC, -1);
1029 nto_procfs_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
1030 struct bp_target_info *bp_tgt)
1032 bp_tgt->placed_address = bp_tgt->reqstd_address;
1033 return procfs_breakpoint (bp_tgt->placed_address,
1034 _DEBUG_BREAK_EXEC | _DEBUG_BREAK_HW, 0);
1038 nto_procfs_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
1039 struct bp_target_info *bp_tgt)
1041 return procfs_breakpoint (bp_tgt->placed_address,
1042 _DEBUG_BREAK_EXEC | _DEBUG_BREAK_HW, -1);
1045 void
1046 nto_procfs_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
1048 int signal_to_pass;
1049 procfs_status status;
1050 sigset_t *run_fault = (sigset_t *) (void *) &run.fault;
1052 if (inferior_ptid == null_ptid)
1053 return;
1055 procfs_set_thread (ptid == minus_one_ptid ? inferior_ptid :
1056 ptid);
1058 run.flags = _DEBUG_RUN_FAULT | _DEBUG_RUN_TRACE;
1059 if (step)
1060 run.flags |= _DEBUG_RUN_STEP;
1062 sigemptyset (run_fault);
1063 sigaddset (run_fault, FLTBPT);
1064 sigaddset (run_fault, FLTTRACE);
1065 sigaddset (run_fault, FLTILL);
1066 sigaddset (run_fault, FLTPRIV);
1067 sigaddset (run_fault, FLTBOUNDS);
1068 sigaddset (run_fault, FLTIOVF);
1069 sigaddset (run_fault, FLTIZDIV);
1070 sigaddset (run_fault, FLTFPE);
1071 /* Peter V will be changing this at some point. */
1072 sigaddset (run_fault, FLTPAGE);
1074 run.flags |= _DEBUG_RUN_ARM;
1076 signal_to_pass = gdb_signal_to_host (signo);
1078 if (signal_to_pass)
1080 devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
1081 signal_to_pass = gdb_signal_to_host (signo);
1082 if (status.why & (_DEBUG_WHY_SIGNALLED | _DEBUG_WHY_FAULTED))
1084 if (signal_to_pass != status.info.si_signo)
1086 SignalKill (nto_node (), inferior_ptid.pid (), 0,
1087 signal_to_pass, 0, 0);
1088 run.flags |= _DEBUG_RUN_CLRFLT | _DEBUG_RUN_CLRSIG;
1090 else /* Let it kill the program without telling us. */
1091 sigdelset (&run.trace, signal_to_pass);
1094 else
1095 run.flags |= _DEBUG_RUN_CLRSIG | _DEBUG_RUN_CLRFLT;
1097 errno = devctl (ctl_fd, DCMD_PROC_RUN, &run, sizeof (run), 0);
1098 if (errno != EOK)
1100 perror (_("run error!\n"));
1101 return;
1105 void
1106 nto_procfs_target::mourn_inferior ()
1108 if (inferior_ptid != null_ptid)
1110 SignalKill (nto_node (), inferior_ptid.pid (), 0, SIGKILL, 0, 0);
1111 close (ctl_fd);
1113 switch_to_no_thread ();
1114 init_thread_list ();
1115 inf_child_mourn_inferior (ops);
1118 /* This function breaks up an argument string into an argument
1119 vector suitable for passing to execvp().
1120 E.g., on "run a b c d" this routine would get as input
1121 the string "a b c d", and as output it would fill in argv with
1122 the four arguments "a", "b", "c", "d". The only additional
1123 functionality is simple quoting. The gdb command:
1124 run a "b c d" f
1125 will fill in argv with the three args "a", "b c d", "e". */
1126 static void
1127 breakup_args (char *scratch, char **argv)
1129 char *pp, *cp = scratch;
1130 char quoting = 0;
1132 for (;;)
1134 /* Scan past leading separators. */
1135 quoting = 0;
1136 while (*cp == ' ' || *cp == '\t' || *cp == '\n')
1137 cp++;
1139 /* Break if at end of string. */
1140 if (*cp == '\0')
1141 break;
1143 /* Take an arg. */
1144 if (*cp == '"')
1146 cp++;
1147 quoting = strchr (cp, '"') ? 1 : 0;
1150 *argv++ = cp;
1152 /* Scan for next arg separator. */
1153 pp = cp;
1154 if (quoting)
1155 cp = strchr (pp, '"');
1156 if ((cp == NULL) || (!quoting))
1157 cp = strchr (pp, ' ');
1158 if (cp == NULL)
1159 cp = strchr (pp, '\t');
1160 if (cp == NULL)
1161 cp = strchr (pp, '\n');
1163 /* No separators => end of string => break. */
1164 if (cp == NULL)
1166 pp = cp;
1167 break;
1170 /* Replace the separator with a terminator. */
1171 *cp++ = '\0';
1174 /* Execv requires a null-terminated arg vector. */
1175 *argv = NULL;
1178 void
1179 nto_procfs_target::create_inferior (const char *exec_file,
1180 const std::string &allargs,
1181 char **env, int from_tty)
1183 struct inheritance inherit;
1184 pid_t pid;
1185 int flags, errn;
1186 char **argv, *args;
1187 const char *in = "", *out = "", *err = "";
1188 int fd, fds[3];
1189 sigset_t set;
1190 struct inferior *inf;
1192 argv = xmalloc ((allargs.size () / (unsigned) 2 + 2) *
1193 sizeof (*argv));
1194 argv[0] = const_cast<char *> (get_exec_file (1));
1195 if (!argv[0])
1197 if (exec_file)
1198 argv[0] = exec_file;
1199 else
1200 return;
1203 args = xstrdup (allargs.c_str ());
1204 breakup_args (args, (exec_file != NULL) ? &argv[1] : &argv[0]);
1206 argv = nto_parse_redirection (argv, &in, &out, &err);
1208 fds[0] = STDIN_FILENO;
1209 fds[1] = STDOUT_FILENO;
1210 fds[2] = STDERR_FILENO;
1212 /* If the user specified I/O via gdb's --tty= arg, use it, but only
1213 if the i/o is not also being specified via redirection. */
1214 const char *inferior_tty = current_inferior ()->tty ();
1215 if (inferior_tty != nullptr)
1217 if (!in[0])
1218 in = inferior_tty;
1219 if (!out[0])
1220 out = inferior_tty;
1221 if (!err[0])
1222 err = inferior_tty;
1225 if (in[0])
1227 fd = open (in, O_RDONLY);
1228 if (fd == -1)
1229 perror (in);
1230 else
1231 fds[0] = fd;
1233 if (out[0])
1235 fd = open (out, O_WRONLY);
1236 if (fd == -1)
1237 perror (out);
1238 else
1239 fds[1] = fd;
1241 if (err[0])
1243 fd = open (err, O_WRONLY);
1244 if (fd == -1)
1245 perror (err);
1246 else
1247 fds[2] = fd;
1250 /* Clear any pending SIGUSR1's but keep the behavior the same. */
1251 signal (SIGUSR1, signal (SIGUSR1, SIG_IGN));
1253 sigemptyset (&set);
1254 sigaddset (&set, SIGUSR1);
1255 sigprocmask (SIG_UNBLOCK, &set, NULL);
1257 memset (&inherit, 0, sizeof (inherit));
1259 if (ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) != 0)
1261 inherit.nd = nto_node ();
1262 inherit.flags |= SPAWN_SETND;
1263 inherit.flags &= ~SPAWN_EXEC;
1265 inherit.flags |= SPAWN_SETGROUP | SPAWN_HOLD;
1266 inherit.pgroup = SPAWN_NEWPGROUP;
1267 pid = spawnp (argv[0], 3, fds, &inherit, argv,
1268 ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) == 0 ? env : 0);
1269 xfree (args);
1271 sigprocmask (SIG_BLOCK, &set, NULL);
1273 if (pid == -1)
1274 error (_("Error spawning %s: %d (%s)"), argv[0], errno,
1275 safe_strerror (errno));
1277 if (fds[0] != STDIN_FILENO)
1278 close (fds[0]);
1279 if (fds[1] != STDOUT_FILENO)
1280 close (fds[1]);
1281 if (fds[2] != STDERR_FILENO)
1282 close (fds[2]);
1284 ptid_t ptid = do_attach (ptid_t (pid));
1285 update_thread_list ();
1286 switch_to_thread (this->find_thread (ptid));
1288 inf = current_inferior ();
1289 inferior_appeared (inf, pid);
1290 inf->attach_flag = false;
1292 flags = _DEBUG_FLAG_KLC; /* Kill-on-Last-Close flag. */
1293 errn = devctl (ctl_fd, DCMD_PROC_SET_FLAG, &flags, sizeof (flags), 0);
1294 if (errn != EOK)
1296 /* FIXME: expected warning? */
1297 /* warning( "Failed to set Kill-on-Last-Close flag: errno = %d(%s)\n",
1298 errn, safe_strerror(errn) ); */
1300 if (!inf->target_is_pushed (ops))
1301 inf->push_target (ops);
1302 target_terminal::init ();
1304 if (current_program_space->exec_bfd () != NULL
1305 || (current_program_space->symfile_object_file != NULL
1306 && current_program_space->symfile_object_file->obfd != NULL))
1307 solib_create_inferior_hook (0);
1310 void
1311 nto_procfs_target::interrupt ()
1313 devctl (ctl_fd, DCMD_PROC_STOP, NULL, 0, 0);
1316 void
1317 nto_procfs_target::kill ()
1319 target_mourn_inferior (inferior_ptid);
1322 /* Fill buf with regset and return devctl cmd to do the setting. Return
1323 -1 if we fail to get the regset. Store size of regset in regsize. */
1324 static int
1325 get_regset (int regset, char *buf, int bufsize, int *regsize)
1327 int dev_get, dev_set;
1328 switch (regset)
1330 case NTO_REG_GENERAL:
1331 dev_get = DCMD_PROC_GETGREG;
1332 dev_set = DCMD_PROC_SETGREG;
1333 break;
1335 case NTO_REG_FLOAT:
1336 dev_get = DCMD_PROC_GETFPREG;
1337 dev_set = DCMD_PROC_SETFPREG;
1338 break;
1340 case NTO_REG_ALT:
1341 dev_get = DCMD_PROC_GETALTREG;
1342 dev_set = DCMD_PROC_SETALTREG;
1343 break;
1345 case NTO_REG_SYSTEM:
1346 default:
1347 return -1;
1349 if (devctl (ctl_fd, dev_get, buf, bufsize, regsize) != EOK)
1350 return -1;
1352 return dev_set;
1355 void
1356 nto_procfs_target::store_registers (struct regcache *regcache, int regno)
1358 union
1360 procfs_greg greg;
1361 procfs_fpreg fpreg;
1362 procfs_altreg altreg;
1364 reg;
1365 unsigned off;
1366 int len, regset, regsize, dev_set, err;
1367 char *data;
1368 ptid_t ptid = regcache->ptid ();
1370 if (ptid == null_ptid)
1371 return;
1372 procfs_set_thread (ptid);
1374 if (regno == -1)
1376 for (regset = NTO_REG_GENERAL; regset < NTO_REG_END; regset++)
1378 dev_set = get_regset (regset, (char *) &reg,
1379 sizeof (reg), &regsize);
1380 if (dev_set == -1)
1381 continue;
1383 if (nto_regset_fill (regcache, regset, (char *) &reg) == -1)
1384 continue;
1386 err = devctl (ctl_fd, dev_set, &reg, regsize, 0);
1387 if (err != EOK)
1388 gdb_printf (gdb_stderr,
1389 "Warning unable to write regset %d: %s\n",
1390 regno, safe_strerror (err));
1393 else
1395 regset = nto_regset_id (regno);
1396 if (regset == -1)
1397 return;
1399 dev_set = get_regset (regset, (char *) &reg, sizeof (reg), &regsize);
1400 if (dev_set == -1)
1401 return;
1403 len = nto_register_area (regcache->arch (),
1404 regno, regset, &off);
1406 if (len < 1)
1407 return;
1409 regcache->raw_collect (regno, (char *) &reg + off);
1411 err = devctl (ctl_fd, dev_set, &reg, regsize, 0);
1412 if (err != EOK)
1413 gdb_printf (gdb_stderr,
1414 "Warning unable to write regset %d: %s\n", regno,
1415 safe_strerror (err));
1419 /* Set list of signals to be handled in the target. */
1421 void
1422 nto_procfs_target::pass_signals
1423 (gdb::array_view<const unsigned char> pass_signals)
1425 int signo;
1427 sigfillset (&run.trace);
1429 for (signo = 1; signo < NSIG; signo++)
1431 int target_signo = gdb_signal_from_host (signo);
1432 if (target_signo < pass_signals.size () && pass_signals[target_signo])
1433 sigdelset (&run.trace, signo);
1437 std::string
1438 nto_procfs_target::pid_to_str (ptid_t ptid)
1440 int pid, tid;
1441 struct tidinfo *tip;
1443 pid = ptid.pid ();
1444 tid = ptid.tid ();
1446 #if 0 /* NYI */
1447 tip = procfs_thread_info (pid, tid);
1448 if (tip != NULL)
1449 snprintf (&buf[n], 1023, " (state = 0x%02x)", tip->state);
1450 #endif
1452 return string_printf ("process %d", pid);
1455 /* to_can_run implementation for "target procfs". Note this really
1456 means "can this target be the default run target", which there can
1457 be only one, and we make it be "target native" like other ports.
1458 "target procfs <node>" wouldn't make sense as default run target, as
1459 it needs <node>. */
1462 nto_procfs_target::can_run ()
1464 return 0;
1467 /* "target procfs". */
1468 static nto_procfs_target_procfs nto_procfs_ops;
1470 /* "target native". */
1471 static nto_procfs_target_native nto_native_ops;
1473 /* Create the "native" and "procfs" targets. */
1475 static void
1476 init_procfs_targets (void)
1478 /* Register "target native". This is the default run target. */
1479 add_target (nto_native_target_info, inf_child_open_target);
1480 set_native_target (&nto_native_ops);
1482 /* Register "target procfs <node>". */
1483 add_target (nto_procfs_target_info, inf_child_open_target);
1486 #define OSTYPE_NTO 1
1488 void _initialize_procfs ();
1489 void
1490 _initialize_procfs ()
1492 sigset_t set;
1494 init_procfs_targets ();
1496 /* We use SIGUSR1 to gain control after we block waiting for a process.
1497 We use sigwaitevent to wait. */
1498 sigemptyset (&set);
1499 sigaddset (&set, SIGUSR1);
1500 sigprocmask (SIG_BLOCK, &set, NULL);
1502 /* Initially, make sure all signals are reported. */
1503 sigfillset (&run.trace);
1505 /* Stuff some information. */
1506 nto_cpuinfo_flags = SYSPAGE_ENTRY (cpuinfo)->flags;
1507 nto_cpuinfo_valid = 1;
1509 add_info ("pidlist", procfs_pidlist, _("pidlist"));
1510 add_info ("meminfo", procfs_meminfo, _("memory information"));
1512 nto_is_nto_target = procfs_is_nto_target;
1516 static int
1517 procfs_hw_watchpoint (int addr, int len, enum target_hw_bp_type type)
1519 procfs_break brk;
1521 switch (type)
1523 case hw_read:
1524 brk.type = _DEBUG_BREAK_RD;
1525 break;
1526 case hw_access:
1527 brk.type = _DEBUG_BREAK_RW;
1528 break;
1529 default: /* Modify. */
1530 /* FIXME: brk.type = _DEBUG_BREAK_RWM gives EINVAL for some reason. */
1531 brk.type = _DEBUG_BREAK_RW;
1533 brk.type |= _DEBUG_BREAK_HW; /* Always ask for HW. */
1534 brk.addr = addr;
1535 brk.size = len;
1537 errno = devctl (ctl_fd, DCMD_PROC_BREAK, &brk, sizeof (brk), 0);
1538 if (errno != EOK)
1540 perror (_("Failed to set hardware watchpoint"));
1541 return -1;
1543 return 0;
1546 bool
1547 nto_procfs_target::can_use_hw_breakpoint (enum bptype type,
1548 int cnt, int othertype)
1550 return 1;
1554 nto_procfs_target::remove_hw_watchpoint (CORE_ADDR addr, int len,
1555 enum target_hw_bp_type type,
1556 struct expression *cond)
1558 return procfs_hw_watchpoint (addr, -1, type);
1562 nto_procfs_target::insert_hw_watchpoint (CORE_ADDR addr, int len,
1563 enum target_hw_bp_type type,
1564 struct expression *cond)
1566 return procfs_hw_watchpoint (addr, len, type);
1569 bool
1570 nto_procfs_target::stopped_by_watchpoint ()
1572 /* NOTE: nto_stopped_by_watchpoint will be called ONLY while we are
1573 stopped due to a SIGTRAP. This assumes gdb works in 'all-stop' mode;
1574 future gdb versions will likely run in 'non-stop' mode in which case
1575 we will have to store/examine statuses per thread in question.
1576 Until then, this will work fine. */
1578 struct inferior *inf = current_inferior ();
1579 struct nto_inferior_data *inf_data;
1581 gdb_assert (inf != NULL);
1583 inf_data = nto_inferior_data (inf);
1585 return inf_data->stopped_flags
1586 & (_DEBUG_FLAG_TRACE_RD
1587 | _DEBUG_FLAG_TRACE_WR
1588 | _DEBUG_FLAG_TRACE_MODIFY);