[PATCH 30/57][Arm][GAS] Add support for MVE instructions: vqmovnt, vqmovnb, vqmovunt...
[binutils-gdb.git] / gdb / nto-procfs.c
blob9dd35a4c8aafcce2e9c7bec459941dcb7831c47c
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-2019 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 "common/filestuff.h"
46 #include "common/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 *, int) 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 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 printf_filtered ("QNX Net Manager not found.\n");
224 printf_filtered ("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 printf_filtered ("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 printf_filtered ("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 printf_filtered ("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 printf_filtered ("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 (gdbarch_bfd_arch_info
279 (target_gdbarch ())->arch_name))
280 error (_("Invalid target CPU."));
285 inf_child_target::open (arg, from_tty);
286 printf_filtered ("Debugging using %s\n", nto_procfs_path);
289 static void
290 procfs_set_thread (ptid_t ptid)
292 pid_t tid;
294 tid = ptid.tid ();
295 devctl (ctl_fd, DCMD_PROC_CURTHREAD, &tid, sizeof (tid), 0);
298 /* Return true if the thread TH is still alive. */
300 bool
301 nto_procfs_target::thread_alive (ptid_t ptid)
303 pid_t tid;
304 pid_t pid;
305 procfs_status status;
306 int err;
308 tid = ptid.tid ();
309 pid = ptid.pid ();
311 if (kill (pid, 0) == -1)
312 return false;
314 status.tid = tid;
315 if ((err = devctl (ctl_fd, DCMD_PROC_TIDSTATUS,
316 &status, sizeof (status), 0)) != EOK)
317 return false;
319 /* Thread is alive or dead but not yet joined,
320 or dead and there is an alive (or dead unjoined) thread with
321 higher tid.
323 If the tid is not the same as requested, requested tid is dead. */
324 return (status.tid == tid) && (status.state != STATE_DEAD);
327 static void
328 update_thread_private_data_name (struct thread_info *new_thread,
329 const char *newname)
331 nto_thread_info *pti = get_nto_thread_info (new_thread);
333 gdb_assert (newname != NULL);
334 gdb_assert (new_thread != NULL);
336 if (pti)
338 pti = new nto_thread_info;
339 new_thread->priv.reset (pti);
342 pti->name = newname;
345 static void
346 update_thread_private_data (struct thread_info *new_thread,
347 pthread_t tid, int state, int flags)
349 procfs_info pidinfo;
350 struct _thread_name *tn;
351 procfs_threadctl tctl;
353 #if _NTO_VERSION > 630
354 gdb_assert (new_thread != NULL);
356 if (devctl (ctl_fd, DCMD_PROC_INFO, &pidinfo,
357 sizeof(pidinfo), 0) != EOK)
358 return;
360 memset (&tctl, 0, sizeof (tctl));
361 tctl.cmd = _NTO_TCTL_NAME;
362 tn = (struct _thread_name *) (&tctl.data);
364 /* Fetch name for the given thread. */
365 tctl.tid = tid;
366 tn->name_buf_len = sizeof (tctl.data) - sizeof (*tn);
367 tn->new_name_len = -1; /* Getting, not setting. */
368 if (devctl (ctl_fd, DCMD_PROC_THREADCTL, &tctl, sizeof (tctl), NULL) != EOK)
369 tn->name_buf[0] = '\0';
371 tn->name_buf[_NTO_THREAD_NAME_MAX] = '\0';
373 update_thread_private_data_name (new_thread, tn->name_buf);
375 nto_thread_info *pti = get_nto_thread_info (new_thread);
376 pti->tid = tid;
377 pti->state = state;
378 pti->flags = flags;
379 #endif /* _NTO_VERSION */
382 void
383 nto_procfs_target::update_thread_list ()
385 procfs_status status;
386 pid_t pid;
387 ptid_t ptid;
388 pthread_t tid;
389 struct thread_info *new_thread;
391 if (ctl_fd == -1)
392 return;
394 prune_threads ();
396 pid = inferior_ptid.pid ();
398 status.tid = 1;
400 for (tid = 1;; ++tid)
402 if (status.tid == tid
403 && (devctl (ctl_fd, DCMD_PROC_TIDSTATUS, &status, sizeof (status), 0)
404 != EOK))
405 break;
406 if (status.tid != tid)
407 /* The reason why this would not be equal is that devctl might have
408 returned different tid, meaning the requested tid no longer exists
409 (e.g. thread exited). */
410 continue;
411 ptid = ptid_t (pid, 0, tid);
412 new_thread = find_thread_ptid (ptid);
413 if (!new_thread)
414 new_thread = add_thread (ptid);
415 update_thread_private_data (new_thread, tid, status.state, 0);
416 status.tid++;
418 return;
421 static void
422 procfs_pidlist (const char *args, int from_tty)
424 struct dirent *dirp = NULL;
425 char buf[PATH_MAX];
426 procfs_info *pidinfo = NULL;
427 procfs_debuginfo *info = NULL;
428 procfs_status *status = NULL;
429 pid_t num_threads = 0;
430 pid_t pid;
431 char name[512];
432 char procfs_dir[PATH_MAX];
434 snprintf (procfs_dir, sizeof (procfs_dir), "%s%s",
435 (nodestr != NULL) ? nodestr : "", "/proc");
437 gdb_dir_up dp (opendir (procfs_dir));
438 if (dp == NULL)
440 fprintf_unfiltered (gdb_stderr, "failed to opendir \"%s\" - %d (%s)",
441 procfs_dir, errno, safe_strerror (errno));
442 return;
445 /* Start scan at first pid. */
446 rewinddir (dp.get ());
450 /* Get the right pid and procfs path for the pid. */
453 dirp = readdir (dp.get ());
454 if (dirp == NULL)
455 return;
456 snprintf (buf, sizeof (buf), "%s%s/%s/as",
457 (nodestr != NULL) ? nodestr : "",
458 "/proc", dirp->d_name);
459 pid = atoi (dirp->d_name);
461 while (pid == 0);
463 /* Open the procfs path. */
464 scoped_fd fd (open (buf, O_RDONLY));
465 if (fd.get () == -1)
467 fprintf_unfiltered (gdb_stderr, "failed to open %s - %d (%s)\n",
468 buf, errno, safe_strerror (errno));
469 continue;
472 pidinfo = (procfs_info *) buf;
473 if (devctl (fd.get (), DCMD_PROC_INFO, pidinfo, sizeof (buf), 0) != EOK)
475 fprintf_unfiltered (gdb_stderr,
476 "devctl DCMD_PROC_INFO failed - %d (%s)\n",
477 errno, safe_strerror (errno));
478 break;
480 num_threads = pidinfo->num_threads;
482 info = (procfs_debuginfo *) buf;
483 if (devctl (fd.get (), DCMD_PROC_MAPDEBUG_BASE, info, sizeof (buf), 0)
484 != EOK)
485 strcpy (name, "unavailable");
486 else
487 strcpy (name, info->path);
489 /* Collect state info on all the threads. */
490 status = (procfs_status *) buf;
491 for (status->tid = 1; status->tid <= num_threads; status->tid++)
493 const int err
494 = devctl (fd.get (), DCMD_PROC_TIDSTATUS, status, sizeof (buf), 0);
495 printf_filtered ("%s - %d", name, pid);
496 if (err == EOK && status->tid != 0)
497 printf_filtered ("/%d\n", status->tid);
498 else
500 printf_filtered ("\n");
501 break;
505 while (dirp != NULL);
508 static void
509 procfs_meminfo (const char *args, int from_tty)
511 procfs_mapinfo *mapinfos = NULL;
512 static int num_mapinfos = 0;
513 procfs_mapinfo *mapinfo_p, *mapinfo_p2;
514 int flags = ~0, err, num, i, j;
516 struct
518 procfs_debuginfo info;
519 char buff[_POSIX_PATH_MAX];
520 } map;
522 struct info
524 unsigned addr;
525 unsigned size;
526 unsigned flags;
527 unsigned debug_vaddr;
528 unsigned long long offset;
531 struct printinfo
533 unsigned long long ino;
534 unsigned dev;
535 struct info text;
536 struct info data;
537 char name[256];
538 } printme;
540 /* Get the number of map entrys. */
541 err = devctl (ctl_fd, DCMD_PROC_MAPINFO, NULL, 0, &num);
542 if (err != EOK)
544 printf ("failed devctl num mapinfos - %d (%s)\n", err,
545 safe_strerror (err));
546 return;
549 mapinfos = XNEWVEC (procfs_mapinfo, num);
551 num_mapinfos = num;
552 mapinfo_p = mapinfos;
554 /* Fill the map entrys. */
555 err = devctl (ctl_fd, DCMD_PROC_MAPINFO, mapinfo_p, num
556 * sizeof (procfs_mapinfo), &num);
557 if (err != EOK)
559 printf ("failed devctl mapinfos - %d (%s)\n", err, safe_strerror (err));
560 xfree (mapinfos);
561 return;
564 num = std::min (num, num_mapinfos);
566 /* Run through the list of mapinfos, and store the data and text info
567 so we can print it at the bottom of the loop. */
568 for (mapinfo_p = mapinfos, i = 0; i < num; i++, mapinfo_p++)
570 if (!(mapinfo_p->flags & flags))
571 mapinfo_p->ino = 0;
573 if (mapinfo_p->ino == 0) /* Already visited. */
574 continue;
576 map.info.vaddr = mapinfo_p->vaddr;
578 err = devctl (ctl_fd, DCMD_PROC_MAPDEBUG, &map, sizeof (map), 0);
579 if (err != EOK)
580 continue;
582 memset (&printme, 0, sizeof printme);
583 printme.dev = mapinfo_p->dev;
584 printme.ino = mapinfo_p->ino;
585 printme.text.addr = mapinfo_p->vaddr;
586 printme.text.size = mapinfo_p->size;
587 printme.text.flags = mapinfo_p->flags;
588 printme.text.offset = mapinfo_p->offset;
589 printme.text.debug_vaddr = map.info.vaddr;
590 strcpy (printme.name, map.info.path);
592 /* Check for matching data. */
593 for (mapinfo_p2 = mapinfos, j = 0; j < num; j++, mapinfo_p2++)
595 if (mapinfo_p2->vaddr != mapinfo_p->vaddr
596 && mapinfo_p2->ino == mapinfo_p->ino
597 && mapinfo_p2->dev == mapinfo_p->dev)
599 map.info.vaddr = mapinfo_p2->vaddr;
600 err =
601 devctl (ctl_fd, DCMD_PROC_MAPDEBUG, &map, sizeof (map), 0);
602 if (err != EOK)
603 continue;
605 if (strcmp (map.info.path, printme.name))
606 continue;
608 /* Lower debug_vaddr is always text, if nessessary, swap. */
609 if ((int) map.info.vaddr < (int) printme.text.debug_vaddr)
611 memcpy (&(printme.data), &(printme.text),
612 sizeof (printme.data));
613 printme.text.addr = mapinfo_p2->vaddr;
614 printme.text.size = mapinfo_p2->size;
615 printme.text.flags = mapinfo_p2->flags;
616 printme.text.offset = mapinfo_p2->offset;
617 printme.text.debug_vaddr = map.info.vaddr;
619 else
621 printme.data.addr = mapinfo_p2->vaddr;
622 printme.data.size = mapinfo_p2->size;
623 printme.data.flags = mapinfo_p2->flags;
624 printme.data.offset = mapinfo_p2->offset;
625 printme.data.debug_vaddr = map.info.vaddr;
627 mapinfo_p2->ino = 0;
630 mapinfo_p->ino = 0;
632 printf_filtered ("%s\n", printme.name);
633 printf_filtered ("\ttext=%08x bytes @ 0x%08x\n", printme.text.size,
634 printme.text.addr);
635 printf_filtered ("\t\tflags=%08x\n", printme.text.flags);
636 printf_filtered ("\t\tdebug=%08x\n", printme.text.debug_vaddr);
637 printf_filtered ("\t\toffset=%s\n", phex (printme.text.offset, 8));
638 if (printme.data.size)
640 printf_filtered ("\tdata=%08x bytes @ 0x%08x\n", printme.data.size,
641 printme.data.addr);
642 printf_filtered ("\t\tflags=%08x\n", printme.data.flags);
643 printf_filtered ("\t\tdebug=%08x\n", printme.data.debug_vaddr);
644 printf_filtered ("\t\toffset=%s\n", phex (printme.data.offset, 8));
646 printf_filtered ("\tdev=0x%x\n", printme.dev);
647 printf_filtered ("\tino=0x%x\n", (unsigned int) printme.ino);
649 xfree (mapinfos);
650 return;
653 /* Print status information about what we're accessing. */
654 void
655 nto_procfs_target::files_info ()
657 struct inferior *inf = current_inferior ();
659 printf_unfiltered ("\tUsing the running image of %s %s via %s.\n",
660 inf->attach_flag ? "attached" : "child",
661 target_pid_to_str (inferior_ptid).c_str (),
662 (nodestr != NULL) ? nodestr : "local node");
665 /* Target to_pid_to_exec_file implementation. */
667 char *
668 nto_procfs_target::pid_to_exec_file (const int pid)
670 int proc_fd;
671 static char proc_path[PATH_MAX];
672 ssize_t rd;
674 /* Read exe file name. */
675 snprintf (proc_path, sizeof (proc_path), "%s/proc/%d/exefile",
676 (nodestr != NULL) ? nodestr : "", pid);
677 proc_fd = open (proc_path, O_RDONLY);
678 if (proc_fd == -1)
679 return NULL;
681 rd = read (proc_fd, proc_path, sizeof (proc_path) - 1);
682 close (proc_fd);
683 if (rd <= 0)
685 proc_path[0] = '\0';
686 return NULL;
688 proc_path[rd] = '\0';
689 return proc_path;
692 /* Attach to process PID, then initialize for debugging it. */
693 void
694 nto_procfs_target::attach (const char *args, int from_tty)
696 char *exec_file;
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 if (from_tty)
707 exec_file = (char *) get_exec_file (0);
709 if (exec_file)
710 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
711 target_pid_to_str (ptid_t (pid)).c_str ());
712 else
713 printf_unfiltered ("Attaching to %s\n",
714 target_pid_to_str (ptid_t (pid)).c_str ());
716 inferior_ptid = do_attach (ptid_t (pid));
717 inf = current_inferior ();
718 inferior_appeared (inf, pid);
719 inf->attach_flag = 1;
721 if (!target_is_pushed (ops))
722 push_target (ops);
724 procfs_update_thread_list (ops);
727 void
728 nto_procfs_target::post_attach (pid_t pid)
730 if (exec_bfd)
731 solib_create_inferior_hook (0);
734 static ptid_t
735 do_attach (ptid_t ptid)
737 procfs_status status;
738 struct sigevent event;
739 char path[PATH_MAX];
741 snprintf (path, PATH_MAX - 1, "%s%s/%d/as",
742 (nodestr != NULL) ? nodestr : "", "/proc", ptid.pid ());
743 ctl_fd = open (path, O_RDWR);
744 if (ctl_fd == -1)
745 error (_("Couldn't open proc file %s, error %d (%s)"), path, errno,
746 safe_strerror (errno));
747 if (devctl (ctl_fd, DCMD_PROC_STOP, &status, sizeof (status), 0) != EOK)
748 error (_("Couldn't stop process"));
750 /* Define a sigevent for process stopped notification. */
751 event.sigev_notify = SIGEV_SIGNAL_THREAD;
752 event.sigev_signo = SIGUSR1;
753 event.sigev_code = 0;
754 event.sigev_value.sival_ptr = NULL;
755 event.sigev_priority = -1;
756 devctl (ctl_fd, DCMD_PROC_EVENT, &event, sizeof (event), 0);
758 if (devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0) == EOK
759 && status.flags & _DEBUG_FLAG_STOPPED)
760 SignalKill (nto_node (), ptid.pid (), 0, SIGCONT, 0, 0);
761 nto_init_solib_absolute_prefix ();
762 return ptid_t (ptid.pid (), 0, status.tid);
765 /* Ask the user what to do when an interrupt is received. */
766 static void
767 interrupt_query (void)
769 if (query (_("Interrupted while waiting for the program.\n\
770 Give up (and stop debugging it)? ")))
772 target_mourn_inferior (inferior_ptid);
773 quit ();
777 /* The user typed ^C twice. */
778 static void
779 nto_handle_sigint_twice (int signo)
781 signal (signo, ofunc);
782 interrupt_query ();
783 signal (signo, nto_handle_sigint_twice);
786 static void
787 nto_handle_sigint (int signo)
789 /* If this doesn't work, try more severe steps. */
790 signal (signo, nto_handle_sigint_twice);
792 target_interrupt ();
795 sptid_t
796 nto_procfs_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
797 int options)
799 sigset_t set;
800 siginfo_t info;
801 procfs_status status;
802 static int exit_signo = 0; /* To track signals that cause termination. */
804 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
806 if (inferior_ptid == null_ptid)
808 ourstatus->kind = TARGET_WAITKIND_STOPPED;
809 ourstatus->value.sig = GDB_SIGNAL_0;
810 exit_signo = 0;
811 return null_ptid;
814 sigemptyset (&set);
815 sigaddset (&set, SIGUSR1);
817 devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
818 while (!(status.flags & _DEBUG_FLAG_ISTOP))
820 ofunc = signal (SIGINT, nto_handle_sigint);
821 sigwaitinfo (&set, &info);
822 signal (SIGINT, ofunc);
823 devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
826 nto_inferior_data (NULL)->stopped_flags = status.flags;
827 nto_inferior_data (NULL)->stopped_pc = status.ip;
829 if (status.flags & _DEBUG_FLAG_SSTEP)
831 ourstatus->kind = TARGET_WAITKIND_STOPPED;
832 ourstatus->value.sig = GDB_SIGNAL_TRAP;
834 /* Was it a breakpoint? */
835 else if (status.flags & _DEBUG_FLAG_TRACE)
837 ourstatus->kind = TARGET_WAITKIND_STOPPED;
838 ourstatus->value.sig = GDB_SIGNAL_TRAP;
840 else if (status.flags & _DEBUG_FLAG_ISTOP)
842 switch (status.why)
844 case _DEBUG_WHY_SIGNALLED:
845 ourstatus->kind = TARGET_WAITKIND_STOPPED;
846 ourstatus->value.sig =
847 gdb_signal_from_host (status.info.si_signo);
848 exit_signo = 0;
849 break;
850 case _DEBUG_WHY_FAULTED:
851 ourstatus->kind = TARGET_WAITKIND_STOPPED;
852 if (status.info.si_signo == SIGTRAP)
854 ourstatus->value.sig = 0;
855 exit_signo = 0;
857 else
859 ourstatus->value.sig =
860 gdb_signal_from_host (status.info.si_signo);
861 exit_signo = ourstatus->value.sig;
863 break;
865 case _DEBUG_WHY_TERMINATED:
867 int waitval = 0;
869 waitpid (inferior_ptid.pid (), &waitval, WNOHANG);
870 if (exit_signo)
872 /* Abnormal death. */
873 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
874 ourstatus->value.sig = exit_signo;
876 else
878 /* Normal death. */
879 ourstatus->kind = TARGET_WAITKIND_EXITED;
880 ourstatus->value.integer = WEXITSTATUS (waitval);
882 exit_signo = 0;
883 break;
886 case _DEBUG_WHY_REQUESTED:
887 /* We are assuming a requested stop is due to a SIGINT. */
888 ourstatus->kind = TARGET_WAITKIND_STOPPED;
889 ourstatus->value.sig = GDB_SIGNAL_INT;
890 exit_signo = 0;
891 break;
895 return ptid_t (status.pid, 0, status.tid);
898 /* Read the current values of the inferior's registers, both the
899 general register set and floating point registers (if supported)
900 and update gdb's idea of their current values. */
901 void
902 nto_procfs_target::fetch_registers (struct regcache *regcache, int regno)
904 union
906 procfs_greg greg;
907 procfs_fpreg fpreg;
908 procfs_altreg altreg;
910 reg;
911 int regsize;
913 procfs_set_thread (regcache->ptid ());
914 if (devctl (ctl_fd, DCMD_PROC_GETGREG, &reg, sizeof (reg), &regsize) == EOK)
915 nto_supply_gregset (regcache, (char *) &reg.greg);
916 if (devctl (ctl_fd, DCMD_PROC_GETFPREG, &reg, sizeof (reg), &regsize)
917 == EOK)
918 nto_supply_fpregset (regcache, (char *) &reg.fpreg);
919 if (devctl (ctl_fd, DCMD_PROC_GETALTREG, &reg, sizeof (reg), &regsize)
920 == EOK)
921 nto_supply_altregset (regcache, (char *) &reg.altreg);
924 /* Helper for procfs_xfer_partial that handles memory transfers.
925 Arguments are like target_xfer_partial. */
927 static enum target_xfer_status
928 procfs_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
929 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
931 int nbytes;
933 if (lseek (ctl_fd, (off_t) memaddr, SEEK_SET) != (off_t) memaddr)
934 return TARGET_XFER_E_IO;
936 if (writebuf != NULL)
937 nbytes = write (ctl_fd, writebuf, len);
938 else
939 nbytes = read (ctl_fd, readbuf, len);
940 if (nbytes <= 0)
941 return TARGET_XFER_E_IO;
942 *xfered_len = nbytes;
943 return TARGET_XFER_OK;
946 /* Target to_xfer_partial implementation. */
948 enum target_xfer_status
949 nto_procfs_target::xfer_partial (enum target_object object,
950 const char *annex, gdb_byte *readbuf,
951 const gdb_byte *writebuf, ULONGEST offset,
952 ULONGEST len, ULONGEST *xfered_len)
954 switch (object)
956 case TARGET_OBJECT_MEMORY:
957 return procfs_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
958 case TARGET_OBJECT_AUXV:
959 if (readbuf != NULL)
961 int err;
962 CORE_ADDR initial_stack;
963 debug_process_t procinfo;
964 /* For 32-bit architecture, size of auxv_t is 8 bytes. */
965 const unsigned int sizeof_auxv_t = sizeof (auxv_t);
966 const unsigned int sizeof_tempbuf = 20 * sizeof_auxv_t;
967 int tempread;
968 gdb_byte *const tempbuf = alloca (sizeof_tempbuf);
970 if (tempbuf == NULL)
971 return TARGET_XFER_E_IO;
973 err = devctl (ctl_fd, DCMD_PROC_INFO, &procinfo,
974 sizeof procinfo, 0);
975 if (err != EOK)
976 return TARGET_XFER_E_IO;
978 initial_stack = procinfo.initial_stack;
980 /* procfs is always 'self-hosted', no byte-order manipulation. */
981 tempread = nto_read_auxv_from_initial_stack (initial_stack, tempbuf,
982 sizeof_tempbuf,
983 sizeof (auxv_t));
984 tempread = std::min (tempread, len) - offset;
985 memcpy (readbuf, tempbuf + offset, tempread);
986 *xfered_len = tempread;
987 return tempread ? TARGET_XFER_OK : TARGET_XFER_EOF;
989 /* Fallthru */
990 default:
991 return this->beneath ()->xfer_partial (object, annex,
992 readbuf, writebuf, offset, len,
993 xfered_len);
997 /* Take a program previously attached to and detaches it.
998 The program resumes execution and will no longer stop
999 on signals, etc. We'd better not have left any breakpoints
1000 in the program or it'll die when it hits one. */
1001 void
1002 nto_procfs_target::detach (inferior *inf, int from_tty)
1004 int pid;
1006 target_announce_detach ();
1008 if (siggnal)
1009 SignalKill (nto_node (), inferior_ptid.pid (), 0, 0, 0, 0);
1011 close (ctl_fd);
1012 ctl_fd = -1;
1014 pid = inferior_ptid.pid ();
1015 inferior_ptid = null_ptid;
1016 detach_inferior (pid);
1017 init_thread_list ();
1018 inf_child_maybe_unpush_target (ops);
1021 static int
1022 procfs_breakpoint (CORE_ADDR addr, int type, int size)
1024 procfs_break brk;
1026 brk.type = type;
1027 brk.addr = addr;
1028 brk.size = size;
1029 errno = devctl (ctl_fd, DCMD_PROC_BREAK, &brk, sizeof (brk), 0);
1030 if (errno != EOK)
1031 return 1;
1032 return 0;
1036 nto_procfs_target::insert_breakpoint (struct gdbarch *gdbarch,
1037 struct bp_target_info *bp_tgt)
1039 bp_tgt->placed_address = bp_tgt->reqstd_address;
1040 return procfs_breakpoint (bp_tgt->placed_address, _DEBUG_BREAK_EXEC, 0);
1044 nto_procfs_target::remove_breakpoint (struct gdbarch *gdbarch,
1045 struct bp_target_info *bp_tgt,
1046 enum remove_bp_reason reason)
1048 return procfs_breakpoint (bp_tgt->placed_address, _DEBUG_BREAK_EXEC, -1);
1052 nto_procfs_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
1053 struct bp_target_info *bp_tgt)
1055 bp_tgt->placed_address = bp_tgt->reqstd_address;
1056 return procfs_breakpoint (bp_tgt->placed_address,
1057 _DEBUG_BREAK_EXEC | _DEBUG_BREAK_HW, 0);
1061 nto_procfs_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
1062 struct bp_target_info *bp_tgt)
1064 return procfs_breakpoint (bp_tgt->placed_address,
1065 _DEBUG_BREAK_EXEC | _DEBUG_BREAK_HW, -1);
1068 void
1069 nto_procfs_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
1071 int signal_to_pass;
1072 procfs_status status;
1073 sigset_t *run_fault = (sigset_t *) (void *) &run.fault;
1075 if (inferior_ptid == null_ptid)
1076 return;
1078 procfs_set_thread (ptid == minus_one_ptid ? inferior_ptid :
1079 ptid);
1081 run.flags = _DEBUG_RUN_FAULT | _DEBUG_RUN_TRACE;
1082 if (step)
1083 run.flags |= _DEBUG_RUN_STEP;
1085 sigemptyset (run_fault);
1086 sigaddset (run_fault, FLTBPT);
1087 sigaddset (run_fault, FLTTRACE);
1088 sigaddset (run_fault, FLTILL);
1089 sigaddset (run_fault, FLTPRIV);
1090 sigaddset (run_fault, FLTBOUNDS);
1091 sigaddset (run_fault, FLTIOVF);
1092 sigaddset (run_fault, FLTIZDIV);
1093 sigaddset (run_fault, FLTFPE);
1094 /* Peter V will be changing this at some point. */
1095 sigaddset (run_fault, FLTPAGE);
1097 run.flags |= _DEBUG_RUN_ARM;
1099 signal_to_pass = gdb_signal_to_host (signo);
1101 if (signal_to_pass)
1103 devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
1104 signal_to_pass = gdb_signal_to_host (signo);
1105 if (status.why & (_DEBUG_WHY_SIGNALLED | _DEBUG_WHY_FAULTED))
1107 if (signal_to_pass != status.info.si_signo)
1109 SignalKill (nto_node (), inferior_ptid.pid (), 0,
1110 signal_to_pass, 0, 0);
1111 run.flags |= _DEBUG_RUN_CLRFLT | _DEBUG_RUN_CLRSIG;
1113 else /* Let it kill the program without telling us. */
1114 sigdelset (&run.trace, signal_to_pass);
1117 else
1118 run.flags |= _DEBUG_RUN_CLRSIG | _DEBUG_RUN_CLRFLT;
1120 errno = devctl (ctl_fd, DCMD_PROC_RUN, &run, sizeof (run), 0);
1121 if (errno != EOK)
1123 perror (_("run error!\n"));
1124 return;
1128 void
1129 nto_procfs_target::mourn_inferior ()
1131 if (inferior_ptid != null_ptid)
1133 SignalKill (nto_node (), inferior_ptid.pid (), 0, SIGKILL, 0, 0);
1134 close (ctl_fd);
1136 inferior_ptid = null_ptid;
1137 init_thread_list ();
1138 inf_child_mourn_inferior (ops);
1141 /* This function breaks up an argument string into an argument
1142 vector suitable for passing to execvp().
1143 E.g., on "run a b c d" this routine would get as input
1144 the string "a b c d", and as output it would fill in argv with
1145 the four arguments "a", "b", "c", "d". The only additional
1146 functionality is simple quoting. The gdb command:
1147 run a "b c d" f
1148 will fill in argv with the three args "a", "b c d", "e". */
1149 static void
1150 breakup_args (char *scratch, char **argv)
1152 char *pp, *cp = scratch;
1153 char quoting = 0;
1155 for (;;)
1157 /* Scan past leading separators. */
1158 quoting = 0;
1159 while (*cp == ' ' || *cp == '\t' || *cp == '\n')
1160 cp++;
1162 /* Break if at end of string. */
1163 if (*cp == '\0')
1164 break;
1166 /* Take an arg. */
1167 if (*cp == '"')
1169 cp++;
1170 quoting = strchr (cp, '"') ? 1 : 0;
1173 *argv++ = cp;
1175 /* Scan for next arg separator. */
1176 pp = cp;
1177 if (quoting)
1178 cp = strchr (pp, '"');
1179 if ((cp == NULL) || (!quoting))
1180 cp = strchr (pp, ' ');
1181 if (cp == NULL)
1182 cp = strchr (pp, '\t');
1183 if (cp == NULL)
1184 cp = strchr (pp, '\n');
1186 /* No separators => end of string => break. */
1187 if (cp == NULL)
1189 pp = cp;
1190 break;
1193 /* Replace the separator with a terminator. */
1194 *cp++ = '\0';
1197 /* Execv requires a null-terminated arg vector. */
1198 *argv = NULL;
1201 void
1202 nto_procfs_target::create_inferior (const char *exec_file,
1203 const std::string &allargs,
1204 char **env, int from_tty)
1206 struct inheritance inherit;
1207 pid_t pid;
1208 int flags, errn;
1209 char **argv, *args;
1210 const char *in = "", *out = "", *err = "";
1211 int fd, fds[3];
1212 sigset_t set;
1213 const char *inferior_io_terminal = get_inferior_io_terminal ();
1214 struct inferior *inf;
1216 argv = xmalloc ((allargs.size () / (unsigned) 2 + 2) *
1217 sizeof (*argv));
1218 argv[0] = get_exec_file (1);
1219 if (!argv[0])
1221 if (exec_file)
1222 argv[0] = exec_file;
1223 else
1224 return;
1227 args = xstrdup (allargs.c_str ());
1228 breakup_args (args, (exec_file != NULL) ? &argv[1] : &argv[0]);
1230 argv = nto_parse_redirection (argv, &in, &out, &err);
1232 fds[0] = STDIN_FILENO;
1233 fds[1] = STDOUT_FILENO;
1234 fds[2] = STDERR_FILENO;
1236 /* If the user specified I/O via gdb's --tty= arg, use it, but only
1237 if the i/o is not also being specified via redirection. */
1238 if (inferior_io_terminal)
1240 if (!in[0])
1241 in = inferior_io_terminal;
1242 if (!out[0])
1243 out = inferior_io_terminal;
1244 if (!err[0])
1245 err = inferior_io_terminal;
1248 if (in[0])
1250 fd = open (in, O_RDONLY);
1251 if (fd == -1)
1252 perror (in);
1253 else
1254 fds[0] = fd;
1256 if (out[0])
1258 fd = open (out, O_WRONLY);
1259 if (fd == -1)
1260 perror (out);
1261 else
1262 fds[1] = fd;
1264 if (err[0])
1266 fd = open (err, O_WRONLY);
1267 if (fd == -1)
1268 perror (err);
1269 else
1270 fds[2] = fd;
1273 /* Clear any pending SIGUSR1's but keep the behavior the same. */
1274 signal (SIGUSR1, signal (SIGUSR1, SIG_IGN));
1276 sigemptyset (&set);
1277 sigaddset (&set, SIGUSR1);
1278 sigprocmask (SIG_UNBLOCK, &set, NULL);
1280 memset (&inherit, 0, sizeof (inherit));
1282 if (ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) != 0)
1284 inherit.nd = nto_node ();
1285 inherit.flags |= SPAWN_SETND;
1286 inherit.flags &= ~SPAWN_EXEC;
1288 inherit.flags |= SPAWN_SETGROUP | SPAWN_HOLD;
1289 inherit.pgroup = SPAWN_NEWPGROUP;
1290 pid = spawnp (argv[0], 3, fds, &inherit, argv,
1291 ND_NODE_CMP (nto_procfs_node, ND_LOCAL_NODE) == 0 ? env : 0);
1292 xfree (args);
1294 sigprocmask (SIG_BLOCK, &set, NULL);
1296 if (pid == -1)
1297 error (_("Error spawning %s: %d (%s)"), argv[0], errno,
1298 safe_strerror (errno));
1300 if (fds[0] != STDIN_FILENO)
1301 close (fds[0]);
1302 if (fds[1] != STDOUT_FILENO)
1303 close (fds[1]);
1304 if (fds[2] != STDERR_FILENO)
1305 close (fds[2]);
1307 inferior_ptid = do_attach (ptid_t (pid));
1308 procfs_update_thread_list (ops);
1310 inf = current_inferior ();
1311 inferior_appeared (inf, pid);
1312 inf->attach_flag = 0;
1314 flags = _DEBUG_FLAG_KLC; /* Kill-on-Last-Close flag. */
1315 errn = devctl (ctl_fd, DCMD_PROC_SET_FLAG, &flags, sizeof (flags), 0);
1316 if (errn != EOK)
1318 /* FIXME: expected warning? */
1319 /* warning( "Failed to set Kill-on-Last-Close flag: errno = %d(%s)\n",
1320 errn, strerror(errn) ); */
1322 if (!target_is_pushed (ops))
1323 push_target (ops);
1324 target_terminal::init ();
1326 if (exec_bfd != NULL
1327 || (symfile_objfile != NULL && symfile_objfile->obfd != NULL))
1328 solib_create_inferior_hook (0);
1331 void
1332 nto_procfs_target::interrupt ()
1334 devctl (ctl_fd, DCMD_PROC_STOP, NULL, 0, 0);
1337 void
1338 nto_procfs_target::kill ()
1340 target_mourn_inferior (inferior_ptid);
1343 /* Fill buf with regset and return devctl cmd to do the setting. Return
1344 -1 if we fail to get the regset. Store size of regset in regsize. */
1345 static int
1346 get_regset (int regset, char *buf, int bufsize, int *regsize)
1348 int dev_get, dev_set;
1349 switch (regset)
1351 case NTO_REG_GENERAL:
1352 dev_get = DCMD_PROC_GETGREG;
1353 dev_set = DCMD_PROC_SETGREG;
1354 break;
1356 case NTO_REG_FLOAT:
1357 dev_get = DCMD_PROC_GETFPREG;
1358 dev_set = DCMD_PROC_SETFPREG;
1359 break;
1361 case NTO_REG_ALT:
1362 dev_get = DCMD_PROC_GETALTREG;
1363 dev_set = DCMD_PROC_SETALTREG;
1364 break;
1366 case NTO_REG_SYSTEM:
1367 default:
1368 return -1;
1370 if (devctl (ctl_fd, dev_get, buf, bufsize, regsize) != EOK)
1371 return -1;
1373 return dev_set;
1376 void
1377 nto_procfs_target::store_registers (struct regcache *regcache, int regno)
1379 union
1381 procfs_greg greg;
1382 procfs_fpreg fpreg;
1383 procfs_altreg altreg;
1385 reg;
1386 unsigned off;
1387 int len, regset, regsize, dev_set, err;
1388 char *data;
1389 ptid_t ptid = regcache->ptid ();
1391 if (ptid == null_ptid)
1392 return;
1393 procfs_set_thread (ptid);
1395 if (regno == -1)
1397 for (regset = NTO_REG_GENERAL; regset < NTO_REG_END; regset++)
1399 dev_set = get_regset (regset, (char *) &reg,
1400 sizeof (reg), &regsize);
1401 if (dev_set == -1)
1402 continue;
1404 if (nto_regset_fill (regcache, regset, (char *) &reg) == -1)
1405 continue;
1407 err = devctl (ctl_fd, dev_set, &reg, regsize, 0);
1408 if (err != EOK)
1409 fprintf_unfiltered (gdb_stderr,
1410 "Warning unable to write regset %d: %s\n",
1411 regno, safe_strerror (err));
1414 else
1416 regset = nto_regset_id (regno);
1417 if (regset == -1)
1418 return;
1420 dev_set = get_regset (regset, (char *) &reg, sizeof (reg), &regsize);
1421 if (dev_set == -1)
1422 return;
1424 len = nto_register_area (regcache->arch (),
1425 regno, regset, &off);
1427 if (len < 1)
1428 return;
1430 regcache->raw_collect (regno, (char *) &reg + off);
1432 err = devctl (ctl_fd, dev_set, &reg, regsize, 0);
1433 if (err != EOK)
1434 fprintf_unfiltered (gdb_stderr,
1435 "Warning unable to write regset %d: %s\n", regno,
1436 safe_strerror (err));
1440 /* Set list of signals to be handled in the target. */
1442 void
1443 nto_procfs_target::pass_signals
1444 (gdb::array_view<const unsigned char> pass_signals)
1446 int signo;
1448 sigfillset (&run.trace);
1450 for (signo = 1; signo < NSIG; signo++)
1452 int target_signo = gdb_signal_from_host (signo);
1453 if (target_signo < pass_signals.size () && pass_signals[target_signo])
1454 sigdelset (&run.trace, signo);
1458 std::string
1459 nto_procfs_target::pid_to_str (ptid_t ptid)
1461 int pid, tid;
1462 struct tidinfo *tip;
1464 pid = ptid.pid ();
1465 tid = ptid.tid ();
1467 #if 0 /* NYI */
1468 tip = procfs_thread_info (pid, tid);
1469 if (tip != NULL)
1470 snprintf (&buf[n], 1023, " (state = 0x%02x)", tip->state);
1471 #endif
1473 return string_printf ("process %d", pid);
1476 /* to_can_run implementation for "target procfs". Note this really
1477 means "can this target be the default run target", which there can
1478 be only one, and we make it be "target native" like other ports.
1479 "target procfs <node>" wouldn't make sense as default run target, as
1480 it needs <node>. */
1483 nto_procfs_target::can_run ()
1485 return 0;
1488 /* "target procfs". */
1489 static nto_procfs_target_procfs nto_procfs_ops;
1491 /* "target native". */
1492 static nto_procfs_target_native nto_native_ops;
1494 /* Create the "native" and "procfs" targets. */
1496 static void
1497 init_procfs_targets (void)
1499 /* Register "target native". This is the default run target. */
1500 add_target (nto_native_target_info, inf_child_open_target);
1501 set_native_target (&nto_native_ops);
1503 /* Register "target procfs <node>". */
1504 add_target (nto_procfs_target_info, inf_child_open_target);
1507 #define OSTYPE_NTO 1
1509 void
1510 _initialize_procfs (void)
1512 sigset_t set;
1514 init_procfs_targets ();
1516 /* We use SIGUSR1 to gain control after we block waiting for a process.
1517 We use sigwaitevent to wait. */
1518 sigemptyset (&set);
1519 sigaddset (&set, SIGUSR1);
1520 sigprocmask (SIG_BLOCK, &set, NULL);
1522 /* Initially, make sure all signals are reported. */
1523 sigfillset (&run.trace);
1525 /* Stuff some information. */
1526 nto_cpuinfo_flags = SYSPAGE_ENTRY (cpuinfo)->flags;
1527 nto_cpuinfo_valid = 1;
1529 add_info ("pidlist", procfs_pidlist, _("pidlist"));
1530 add_info ("meminfo", procfs_meminfo, _("memory information"));
1532 nto_is_nto_target = procfs_is_nto_target;
1536 static int
1537 procfs_hw_watchpoint (int addr, int len, enum target_hw_bp_type type)
1539 procfs_break brk;
1541 switch (type)
1543 case hw_read:
1544 brk.type = _DEBUG_BREAK_RD;
1545 break;
1546 case hw_access:
1547 brk.type = _DEBUG_BREAK_RW;
1548 break;
1549 default: /* Modify. */
1550 /* FIXME: brk.type = _DEBUG_BREAK_RWM gives EINVAL for some reason. */
1551 brk.type = _DEBUG_BREAK_RW;
1553 brk.type |= _DEBUG_BREAK_HW; /* Always ask for HW. */
1554 brk.addr = addr;
1555 brk.size = len;
1557 errno = devctl (ctl_fd, DCMD_PROC_BREAK, &brk, sizeof (brk), 0);
1558 if (errno != EOK)
1560 perror (_("Failed to set hardware watchpoint"));
1561 return -1;
1563 return 0;
1566 bool
1567 nto_procfs_target::can_use_hw_breakpoint (enum bptype type,
1568 int cnt, int othertype)
1570 return 1;
1574 nto_procfs_target::remove_hw_watchpoint (CORE_ADDR addr, int len,
1575 enum target_hw_bp_type type,
1576 struct expression *cond)
1578 return procfs_hw_watchpoint (addr, -1, type);
1582 nto_procfs_target::insert_hw_watchpoint (CORE_ADDR addr, int len,
1583 enum target_hw_bp_type type,
1584 struct expression *cond)
1586 return procfs_hw_watchpoint (addr, len, type);
1589 bool
1590 nto_procfs_target::stopped_by_watchpoint ()
1592 /* NOTE: nto_stopped_by_watchpoint will be called ONLY while we are
1593 stopped due to a SIGTRAP. This assumes gdb works in 'all-stop' mode;
1594 future gdb versions will likely run in 'non-stop' mode in which case
1595 we will have to store/examine statuses per thread in question.
1596 Until then, this will work fine. */
1598 struct inferior *inf = current_inferior ();
1599 struct nto_inferior_data *inf_data;
1601 gdb_assert (inf != NULL);
1603 inf_data = nto_inferior_data (inf);
1605 return inf_data->stopped_flags
1606 & (_DEBUG_FLAG_TRACE_RD
1607 | _DEBUG_FLAG_TRACE_WR
1608 | _DEBUG_FLAG_TRACE_MODIFY);