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