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