36 #define _STRUCTURED_PROC 1 38 #include <sys/procfs.h> 39 #include <sys/fault.h> 40 #include <sys/syscall.h> 68 #include <sys/types.h> 91 ptid_t,
int,
enum gdb_signal);
99 int,
unsigned char *);
129 #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) 143 if (endptr - ptr < 8 * 2)
186 #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) 231 #define MAIN_PROC_NAME_FMT "/proc/%d" 232 #define CTL_PROC_NAME_FMT "/proc/%d/ctl" 233 #define AS_PROC_NAME_FMT "/proc/%d/as" 234 #define MAP_PROC_NAME_FMT "/proc/%d/map" 235 #define STATUS_PROC_NAME_FMT "/proc/%d/status" 236 #define MAX_PROC_NAME_SIZE sizeof("/proc/99999/lwp/8096/lstatus") 331 error (
_(
"procfs: couldn't find pid %d " 332 "(kernel thread %d) in procinfo list."),
335 error (
_(
"procfs: couldn't find pid %d in procinfo list."),
pid);
353 int retries_remaining,
status;
355 retries_remaining = 2;
361 if (
status >= 0 || retries_remaining == 0)
363 else if (errno != EINTR && errno != EAGAIN)
417 strcat (tmp,
"/lwpctl");
419 strcat (tmp,
"/ctl");
436 strcat (tmp,
"/lwpstatus");
438 strcat (tmp,
"/status");
518 for (ptr = *list; ptr; ptr = ptr->
next)
577 sprintf (procfile,
"process %d", pi->
pid);
581 kill (pi->
pid, SIGKILL);
592 return (sysset_t *)
xmalloc (
sizeof (sysset_t));
659 sizeof (lwpstatus_t))
660 ==
sizeof (lwpstatus_t));
666 ==
sizeof (pstatus_t));
695 return pi->
prstatus.pr_lwp.pr_flags;
750 return pi->
prstatus.pr_lwp.pr_nsysarg;
763 return (
long *) &pi->
prstatus.pr_lwp.pr_sysarg;
805 win = (write (pi->
ctl_fd, (
void *) &arg, sizeof (arg)) ==
sizeof (arg));
812 warning (
_(
"procfs: modify_flag failed to turn %s %s"),
813 flag == PR_FORK ?
"PR_FORK" :
814 flag == PR_RLC ?
"PR_RLC" :
815 flag == PR_ASYNC ?
"PR_ASYNC" :
816 flag == PR_KLC ?
"PR_KLC" :
892 win = (write (pi->
ctl_fd, (
char *) &cmd, sizeof (cmd)) ==
sizeof (cmd));
916 win = (write (pi->
ctl_fd, (
char *) &cmd, sizeof (cmd)) ==
sizeof (cmd));
962 else if (signo != -1)
969 win = (write (pi->
ctl_fd, (
char *) &cmd, sizeof (cmd)) ==
sizeof (cmd));
993 char sigset[
sizeof (sigset_t)];
997 memcpy (&arg.sigset, sigset, sizeof (sigset_t));
999 win = (write (pi->
ctl_fd, (
char *) &arg, sizeof (arg)) ==
sizeof (arg));
1005 warning (
_(
"procfs: set_traced_signals failed"));
1028 char fltset[
sizeof (fltset_t)];
1032 memcpy (&arg.fltset, fltset, sizeof (fltset_t));
1034 win = (write (pi->
ctl_fd, (
char *) &arg, sizeof (arg)) ==
sizeof (arg));
1058 struct gdb_proc_ctl_pcsentry {
1061 char sysset[
sizeof (sysset_t)];
1063 int argp_size =
sizeof (
struct gdb_proc_ctl_pcsentry);
1065 argp = (
struct gdb_proc_ctl_pcsentry *)
xmalloc (argp_size);
1067 argp->cmd = PCSENTRY;
1068 memcpy (&argp->sysset, sysset, sizeof (sysset_t));
1070 win = (write (pi->
ctl_fd, (
char *) argp, argp_size) == argp_size);
1096 struct gdb_proc_ctl_pcsexit {
1099 char sysset[
sizeof (sysset_t)];
1101 int argp_size =
sizeof (
struct gdb_proc_ctl_pcsexit);
1103 argp = (
struct gdb_proc_ctl_pcsexit *)
xmalloc (argp_size);
1105 argp->cmd = PCSEXIT;
1106 memcpy (&argp->sysset, sysset, sizeof (sysset_t));
1108 win = (write (pi->
ctl_fd, (
char *) argp, argp_size) == argp_size);
1137 char hold[
sizeof (sigset_t)];
1141 memcpy (&arg.hold, sighold, sizeof (sigset_t));
1142 win = (write (pi->
ctl_fd, (
void *) &arg, sizeof (arg)) ==
sizeof (arg));
1157 sigset_t *ret = NULL;
1171 ret = &pi->
prstatus.pr_lwp.pr_lwphold;
1173 memcpy (save, ret,
sizeof (sigset_t));
1184 sigset_t *ret = NULL;
1200 memcpy (save, ret,
sizeof (sigset_t));
1211 fltset_t *ret = NULL;
1227 memcpy (save, ret,
sizeof (fltset_t));
1238 sysset_t *ret = NULL;
1254 memcpy (save, ret,
sizeof (sysset_t));
1265 sysset_t *ret = NULL;
1281 memcpy (save, ret,
sizeof (sysset_t));
1305 win = (write (pi->
ctl_fd, (
void *) &cmd, sizeof (cmd)) ==
sizeof (cmd));
1325 char sinfo[
sizeof (siginfo_t)];
1345 && pi->
prstatus.pr_lwp.pr_info.si_signo == signo
1349 memcpy (arg.sinfo, &pi->
prstatus.pr_lwp.pr_info, sizeof (siginfo_t));
1352 mysinfo.si_signo = signo;
1353 mysinfo.si_code = 0;
1354 mysinfo.si_pid = getpid ();
1355 mysinfo.si_uid = getuid ();
1356 memcpy (arg.sinfo, &mysinfo, sizeof (siginfo_t));
1360 win = (write (pi->
ctl_fd, (
void *) &arg, sizeof (arg)) ==
sizeof (arg));
1385 char sinfo[
sizeof (siginfo_t)];
1391 mysinfo.si_signo = 0;
1392 mysinfo.si_code = 0;
1393 mysinfo.si_errno = 0;
1394 mysinfo.si_pid = getpid ();
1395 mysinfo.si_uid = getuid ();
1396 memcpy (arg.sinfo, &mysinfo, sizeof (siginfo_t));
1398 win = (write (pi->
ctl_fd, (
void *) &arg, sizeof (arg)) ==
sizeof (arg));
1413 return &pi->
prstatus.pr_lwp.pr_reg;
1426 return &pi->
prstatus.pr_lwp.pr_fpreg;
1456 memcpy (&arg.gregs, gregs, sizeof (arg.gregs));
1457 win = (write (pi->
ctl_fd, (
void *) &arg, sizeof (arg)) ==
sizeof (arg));
1492 memcpy (&arg.fpregs, fpregs, sizeof (arg.fpregs));
1493 win = (write (pi->
ctl_fd, (
void *) &arg, sizeof (arg)) ==
sizeof (arg));
1523 win = (write (pi->
ctl_fd, (
char *) &cmd, sizeof (cmd)) ==
sizeof (cmd));
1570 char watch[
sizeof (prwatch_t)];
1578 pwatch.pr_size = len;
1579 pwatch.pr_wflags = wflags;
1581 memcpy (arg.watch, &pwatch, sizeof (prwatch_t));
1582 return (write (pi->
ctl_fd, &arg, sizeof (arg)) ==
sizeof (arg));
1585 #if (defined(__i386__) || defined(__x86_64__)) && defined (sun) 1587 #include <sys/sysi86.h> 1594 proc_get_LDT_entry (
procinfo *pi,
int key)
1596 static struct ssd *ldt_entry = NULL;
1598 struct cleanup *old_chain = NULL;
1603 if (ldt_entry == NULL)
1604 ldt_entry =
XNEW (
struct ssd);
1607 sprintf (pathname,
"/proc/%d/ldt", pi->
pid);
1610 proc_warn (pi,
"proc_get_LDT_entry (open)", __LINE__);
1617 while (
read (fd, ldt_entry,
sizeof (
struct ssd)) ==
sizeof (
struct ssd))
1619 if (ldt_entry->sel == 0 &&
1620 ldt_entry->bo == 0 &&
1621 ldt_entry->acc1 == 0 &&
1622 ldt_entry->acc2 == 0)
1625 if (ldt_entry->sel == key)
1639 procfs_find_LDT_entry (
ptid_t ptid)
1648 warning (
_(
"procfs_find_LDT_entry: could not find procinfo for %d:%ld."),
1655 warning (
_(
"procfs_find_LDT_entry: could not read gregs for %d:%ld."),
1660 key = (*gregs)[GS] & 0xffff;
1663 return proc_get_LDT_entry (pi, key);
1713 return pi->
prstatus.pr_lwp.pr_lwpid;
1724 if (thread && parent)
1736 closedir ((DIR *) dir);
1743 struct dirent *direntry;
1744 struct cleanup *old_chain = NULL;
1766 strcat (pathname,
"/lwp");
1767 if ((dirp = opendir (pathname)) == NULL)
1768 proc_error (pi,
"update_threads, opendir", __LINE__);
1771 while ((direntry = readdir (dirp)) != NULL)
1772 if (direntry->d_name[0] !=
'.')
1774 lwpid = atoi (&direntry->d_name[0]);
1776 proc_error (pi,
"update_threads, create_procinfo", __LINE__);
1815 if ((retval = (*
func) (pi, thread, ptr)) != 0)
1834 int entry_or_exit,
int mode,
int from_tty);
1845 fltset_t traced_faults;
1846 sigset_t traced_signals;
1847 sysset_t *traced_syscall_entries;
1848 sysset_t *traced_syscall_exits;
1852 prfillset (&traced_faults);
1853 prdelset (&traced_faults, FLTPAGE);
1858 prfillset (&traced_signals);
1865 premptyset (traced_syscall_entries);
1866 praddset (traced_syscall_entries, SYS_exit);
1867 praddset (traced_syscall_entries, SYS_lwp_exit);
1870 xfree (traced_syscall_entries);
1881 premptyset (traced_syscall_exits);
1883 praddset (traced_syscall_exits, SYS_exec);
1885 praddset (traced_syscall_exits, SYS_execve);
1886 praddset (traced_syscall_exits, SYS_lwp_create);
1887 praddset (traced_syscall_exits, SYS_lwp_exit);
1890 xfree (traced_syscall_exits);
1905 if (
pid == getpid ())
1906 error (
_(
"Attaching GDB to itself is not a good idea..."));
1937 const char *exec_file;
1940 if (exec_file == NULL)
1964 perror (
_(
"procfs: out of memory in 'attach'"));
1969 sprintf (
errmsg,
"do_attach: couldn't open /proc file for process %d",
1975 if (
proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
1998 dead_procinfo (pi,
"do_attach: couldn't save traced syscall entries.",
2001 dead_procinfo (pi,
"do_attach: couldn't save traced syscall exits.",
2012 inf->attach_flag = 1;
2035 proc_warn (pi,
"do_detach, set_current_signal", __LINE__);
2038 proc_warn (pi,
"do_detach, set_traced_signal", __LINE__);
2041 proc_warn (pi,
"do_detach, set_traced_faults", __LINE__);
2044 proc_warn (pi,
"do_detach, set_traced_sysentry", __LINE__);
2047 proc_warn (pi,
"do_detach, set_traced_sysexit", __LINE__);
2050 proc_warn (pi,
"do_detach, set_held_signals", __LINE__);
2052 if (signo || (
proc_flags (pi) & (PR_STOPPED | PR_ISTOP)))
2054 query (
_(
"Was stopped when attached, make it runnable again? ")))
2058 proc_warn (pi,
"do_detach, clear_current_fault", __LINE__);
2061 proc_warn (pi,
"do_detach, clear_current_signal", __LINE__);
2064 proc_warn (pi,
"do_detach, set_rlc", __LINE__);
2098 error (
_(
"procfs: fetch_registers failed to find procinfo for %s"),
2103 proc_error (pi,
"fetch_registers, get_gregs", __LINE__);
2118 proc_error (pi,
"fetch_registers, get_fpregs", __LINE__);
2148 error (
_(
"procfs: store_registers: failed to find procinfo for %s"),
2153 proc_error (pi,
"store_registers, get_gregs", __LINE__);
2157 proc_error (pi,
"store_registers, set_gregs", __LINE__);
2170 proc_error (pi,
"store_registers, get_fpregs", __LINE__);
2174 proc_error (pi,
"store_registers, set_fpregs", __LINE__);
2181 if (scall == SYS_lwp_exit)
2189 if (scall == SYS_exit)
2198 if (scall == SYS_exec)
2201 if (scall == SYS_execve)
2209 if (scall == SYS_lwp_create)
2228 ptid_t retval, temp_ptid;
2229 int why, what,
flags;
2250 if ((
flags & PR_STOPPED) && (why == PR_REQUESTED))
2254 if (!(
proc_flags (pi) & (PR_STOPPED | PR_ISTOP)) &&
2258 if (errno == ENOENT)
2263 wait_retval = wait (&wstat);
2267 error (
_(
"procfs: couldn't stop " 2268 "process %d: wait returned %d."),
2274 else if (errno == EINTR)
2279 proc_error (pi,
"target_wait (wait_for_stop)", __LINE__);
2298 if (
flags & (PR_STOPPED | PR_ISTOP))
2302 if (
flags & PR_ASYNC)
2304 proc_error (pi,
"target_wait, unset_async", __LINE__);
2315 wstat = (what << 8) | 0177;
2343 proc_error (pi,
"target_wait, run_process", __LINE__);
2346 if (
inf->attach_flag)
2356 int temp = wait (&wstat);
2377 long i, nsysargs, *sysargs;
2384 for (i = 0; i < nsysargs; i++)
2411 wstat = (SIGTRAP << 8) | 0177;
2461 long i, nsysargs, *sysargs;
2468 for (i = 0; i < nsysargs; i++)
2479 wstat = (SIGSTOP << 8) | 0177;
2501 status->value.sig = GDB_SIGNAL_0;
2506 wstat = (what << 8) | 0177;
2511 wstat = (SIGTRAP << 8) | 0177;
2516 wstat = (SIGILL << 8) | 0177;
2520 wstat = (SIGTRAP << 8) | 0177;
2525 wstat = (SIGSEGV << 8) | 0177;
2530 wstat = (SIGFPE << 8) | 0177;
2539 error (
_(
"... giving up..."));
2547 error (
_(
"... giving up..."));
2572 error (
_(
"procfs: ...giving up..."));
2588 const char *annex,
gdb_byte *readbuf,
2599 offset, len, xfered_len);
2603 readbuf, writebuf,
offset, len,
2620 if (pi->
as_fd == 0 &&
2623 proc_warn (pi,
"xfer_memory, open_proc_files", __LINE__);
2627 if (lseek (pi->
as_fd, (off_t) memaddr,
SEEK_SET) != (off_t) memaddr)
2630 if (writebuf != NULL)
2633 nbytes = write (pi->
as_fd, writebuf, len);
2638 nbytes =
read (pi->
as_fd, readbuf, len);
2642 *xfered_len = nbytes;
2668 if (pi->gregs_dirty)
2669 if (parent == NULL ||
2672 proc_warn (pi,
"target_resume, set_gregs",
2675 if (pi->fpregs_dirty)
2676 if (parent == NULL ||
2679 proc_warn (pi,
"target_resume, set_fpregs",
2694 pi->gregs_dirty = 0;
2695 pi->fpregs_dirty = 0;
2715 proc_error (pi,
"make_signal_thread_runnable", __LINE__);
2735 ptid_t ptid,
int step,
enum gdb_signal signo)
2784 if (thread->
tid != 0)
2789 proc_error (pi,
"target_resume, set_async", __LINE__);
2792 make_signal_thread_runnable,
2804 warning (
_(
"resume: target already running. " 2805 "Pretend to resume, and hope for the best!"));
2815 int numsigs,
unsigned char *pass_signals)
2823 for (signo = 0; signo < NSIG; signo++)
2826 if (target_signo < numsigs && pass_signals[target_signo])
2842 inf->attach_flag?
"attached":
"child",
2868 proc_error (pi,
"unconditionally_kill, proc_kill", __LINE__);
2872 if (parent_pid == getpid ())
2942 perror (
_(
"procfs: out of memory in 'init_inferior'"));
2945 proc_error (pi,
"init_inferior, open_proc_files", __LINE__);
2968 proc_error (pi,
"init_inferior, get_traced_signals", __LINE__);
2970 proc_error (pi,
"init_inferior, get_held_signals", __LINE__);
2972 proc_error (pi,
"init_inferior, get_traced_faults", __LINE__);
2974 proc_error (pi,
"init_inferior, get_traced_sysentry", __LINE__);
2976 proc_error (pi,
"init_inferior, get_traced_sysexit", __LINE__);
2979 proc_error (pi,
"init_inferior (procfs_debug_inferior)", fail);
2988 proc_error (pi,
"init_inferior, set_RLC", __LINE__);
3028 proc_warn (pi,
"set_exec_trap, open_proc_files", __LINE__);
3042 premptyset (exitset);
3044 praddset (exitset, SYS_exec);
3046 praddset (exitset, SYS_execve);
3050 proc_warn (pi,
"set_exec_trap, set_traced_sysexit", __LINE__);
3059 proc_warn (pi,
"set_exec_trap, unset_inherit", __LINE__);
3065 proc_warn (pi,
"set_exec_trap, unset_RLC", __LINE__);
3085 const std::string &allargs,
char **env,
int from_tty)
3087 char *shell_file = getenv (
"SHELL");
3091 if (shell_file != NULL && strchr (shell_file,
'/') == NULL)
3119 const char *path = getenv (
"PATH");
3121 struct stat statbuf;
3124 path =
"/bin:/usr/bin";
3126 tryname = (
char *) alloca (strlen (path) + strlen (shell_file) + 2);
3127 for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
3129 p1 = strchr (p,
':');
3134 strncpy (tryname, p, len);
3135 tryname[len] =
'\0';
3136 strcat (tryname,
"/");
3137 strcat (tryname, shell_file);
3138 if (access (tryname, X_OK) < 0)
3140 if (stat (tryname, &statbuf) < 0)
3142 if (!S_ISREG (statbuf.st_mode))
3153 error (
_(
"procfs:%d -- Can't find shell %s in PATH"),
3154 __LINE__, shell_file);
3156 shell_file = tryname;
3160 NULL, NULL, shell_file, NULL);
3240 static char buf[80];
3292 if (errno == ESRCH && len == 0)
3311 int cnt,
int othertype)
3341 if (
proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
3440 int (*
func) (
struct prmap *map,
3445 struct prmap *prmaps;
3446 struct prmap *prmap;
3456 sprintf (pathname,
"/proc/%d/map", pi->
pid);
3457 if ((map_fd = open (pathname, O_RDONLY)) < 0)
3458 proc_error (pi,
"iterate_over_mappings (open)", __LINE__);
3465 if (fstat (map_fd, &sbuf) != 0)
3466 proc_error (pi,
"iterate_over_mappings (fstat)", __LINE__);
3468 nmap = sbuf.st_size /
sizeof (prmap_t);
3469 prmaps = (
struct prmap *) alloca ((nmap + 1) *
sizeof (*prmaps));
3470 if (
read (map_fd, (
char *) prmaps, nmap *
sizeof (*prmaps))
3471 != (nmap *
sizeof (*prmaps)))
3472 proc_error (pi,
"iterate_over_mappings (read)", __LINE__);
3474 for (prmap = prmaps; nmap > 0; prmap++, nmap--)
3475 if ((funcstat = (*
func) (prmap, child_func, data)) != 0)
3495 (map->pr_mflags & MA_READ) != 0,
3496 (map->pr_mflags & MA_WRITE) != 0,
3497 (map->pr_mflags & MA_EXEC) != 0,
3529 static char asciiflags[8];
3531 strcpy (asciiflags,
"-------");
3532 if (
flags & MA_STACK)
3533 asciiflags[1] =
's';
3534 if (
flags & MA_BREAK)
3535 asciiflags[2] =
'b';
3536 if (
flags & MA_SHARED)
3537 asciiflags[3] =
's';
3538 if (
flags & MA_READ)
3539 asciiflags[4] =
'r';
3540 if (
flags & MA_WRITE)
3541 asciiflags[5] =
'w';
3542 if (
flags & MA_EXEC)
3543 asciiflags[6] =
'x';
3544 return (asciiflags);
3554 unsigned int pr_off;
3556 pr_off = (
unsigned int) map->pr_offset;
3560 (
unsigned long) map->pr_vaddr,
3561 (
unsigned long) map->pr_vaddr + map->pr_size - 1,
3562 (
unsigned long) map->pr_size,
3567 (
unsigned long) map->pr_vaddr,
3568 (
unsigned long) map->pr_vaddr + map->pr_size - 1,
3569 (
unsigned long) map->pr_size,
3629 error (
_(
"Not supported on this target."));
3634 for (
char *
arg : built_argv)
3636 if (isdigit (
arg[0]))
3638 pid = strtoul (
arg, &tmp, 10);
3640 tid = strtoul (++tmp, NULL, 10);
3642 else if (
arg[0] ==
'/')
3644 tid = strtoul (
arg + 1, NULL, 10);
3650 error (
_(
"No current process: you must name one."));
3656 if (process == NULL)
3663 proc_error (process,
"info proc, open_procinfo_files", __LINE__);
3673 if (
proc_flags (process) & (PR_STOPPED | PR_ISTOP))
3683 if (
proc_flags (thread) & (PR_STOPPED | PR_ISTOP))
3706 int mode,
int from_tty)
3710 if (entry_or_exit == PR_SYSENTRY)
3716 proc_error (pi,
"proc-trace, get_traced_sysset", __LINE__);
3719 praddset (sysset, syscallnum);
3721 prdelset (sysset, syscallnum);
3723 if (entry_or_exit == PR_SYSENTRY)
3726 proc_error (pi,
"proc-trace, set_traced_sysentry", __LINE__);
3731 proc_error (pi,
"proc-trace, set_traced_sysexit", __LINE__);
3741 error (
_(
"you must be debugging a process to use this command."));
3743 if (args == NULL || args[0] == 0)
3747 if (isdigit (args[0]))
3749 const int syscallnum = atoi (args);
3785 _(
"Give a trace of entries into the syscall."));
3787 _(
"Give a trace of exits from the syscall."));
3789 _(
"Cancel a trace of entries into the syscall."));
3791 _(
"Cancel a trace of exits from the syscall."));
3816 char *note_data,
int *note_size,
3817 enum gdb_signal stop_signal)
3822 unsigned long merged_pid;
3836 note_data = (
char *) elfcore_write_lwpstatus (obfd,
3843 note_data = (
char *) elfcore_write_prfpreg (obfd,
3887 static enum gdb_signal
3896 return GDB_SIGNAL_0;
3905 char fname[16] = {
'\0'};
3906 char psargs[80] = {
'\0'};
3908 char *note_data = NULL;
3917 strncpy (fname, lbasename (
get_exec_file (0)),
sizeof (fname));
3918 fname[
sizeof (fname) - 1] = 0;
3920 psargs[
sizeof (psargs) - 1] = 0;
3923 if (inf_args && *inf_args &&
3924 strlen (inf_args) < ((
int)
sizeof (psargs) - (
int) strlen (psargs)))
3926 strncat (psargs,
" ",
3927 sizeof (psargs) - strlen (psargs));
3928 strncat (psargs, inf_args,
3929 sizeof (psargs) - strlen (psargs));
3959 "CORE", NT_AUXV, auxv, auxv_len);
void error_no_arg(const char *why)
void get_last_target_status(ptid_t *ptidp, struct target_waitstatus *status)
struct gdbarch * target_gdbarch(void)
static int procfs_corefile_thread_callback(procinfo *pi, procinfo *thread, void *data)
static ptid_t procfs_wait(struct target_ops *, ptid_t, struct target_waitstatus *, int)
static void destroy_procinfo(procinfo *p)
ssize_t read(int fd, void *buf, size_t count)
ptid_t procfs_first_available(void)
static sigset_t * proc_get_traced_signals(procinfo *pi, sigset_t *save)
static int open_procinfo_files(procinfo *p, int which)
static int procfs_region_ok_for_hw_watchpoint(struct target_ops *self, CORE_ADDR addr, int len)
static constexpr ptid_t tid
struct thread_info * add_thread(ptid_t ptid)
static target_xfer_partial_ftype procfs_xfer_partial
static void destroy_one_procinfo(procinfo **list, procinfo *pi)
static int proc_what(procinfo *pi)
static void proc_trace_syscalls(const char *args, int from_tty, int entry_or_exit, int mode)
#define MAIN_PROC_NAME_FMT
static void do_destroy_procinfo_cleanup(void *)
static char * procfs_do_thread_registers(bfd *obfd, ptid_t ptid, char *note_data, int *note_size, enum gdb_signal stop_signal)
static int syscall_is_lwp_create(procinfo *pi, int scall)
int(* to_find_memory_regions)(struct target_ops *, find_memory_region_ftype func, void *data) TARGET_DEFAULT_FUNC(dummy_find_memory_regions)
int ptid_get_pid(const ptid_t &ptid)
struct regcache * get_thread_regcache(ptid_t ptid)
void fill_gregset(const struct regcache *regcache, gdb_gregset_t *gregsetp, int regno)
void delete_thread(ptid_t)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
char * get_inferior_args(void)
static int proc_set_traced_faults(procinfo *pi, fltset_t *fltset)
static int procfs_notice_thread(procinfo *pi, procinfo *thread, void *ptr)
static void procfs_mourn_inferior(struct target_ops *ops)
void warning(const char *fmt,...)
static int proc_get_current_thread(procinfo *pi)
static long * proc_sysargs(procinfo *pi)
static void procfs_interrupt(struct target_ops *self, ptid_t)
int query(const char *ctlstr,...)
static procinfo * find_procinfo(int pid, int tid)
static int proc_watchpoint_address(procinfo *pi, CORE_ADDR *addr)
int gdbarch_ptr_bit(struct gdbarch *gdbarch)
void push_target(struct target_ops *t)
LONGEST target_read_alloc(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte **buf_p)
char * get_exec_file(int err)
static int iterate_over_mappings(procinfo *pi, find_memory_region_ftype child_func, void *data, int(*func)(struct prmap *map, find_memory_region_ftype child_func, void *data))
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
ptid_t regcache_get_ptid(const struct regcache *regcache)
static void procfs_info_proc(struct target_ops *, const char *, enum info_proc_what)
void * memset(T *s, int c, size_t n)=delete
void print_sys_errmsg(const char *string, int errcode)
void generic_mourn_inferior(void)
void proc_prettyprint_syscall(int num, int verbose)
static void proc_untrace_sysentry_cmd(const char *args, int from_tty)
static int proc_set_held_signals(procinfo *pi, sigset_t *sighold)
static int procfs_thread_alive(struct target_ops *ops, ptid_t)
const char *(* to_pid_to_str)(struct target_ops *, ptid_t) TARGET_DEFAULT_FUNC(default_pid_to_str)
enum gdb_signal stop_signal
union target_waitstatus::@174 value
static void * procfs_address_to_host_pointer(CORE_ADDR addr)
static sigset_t * proc_get_held_signals(procinfo *pi, sigset_t *save)
static void procfs_attach(struct target_ops *, const char *, int)
void _initialize_procfs(void)
static int proc_unset_async(procinfo *pi)
static int procfs_debug_inferior(procinfo *pi)
static int proc_get_status(procinfo *pi)
int(* to_remove_watchpoint)(struct target_ops *, CORE_ADDR, int, enum target_hw_bp_type, struct expression *) TARGET_DEFAULT_RETURN(-1)
int(* to_region_ok_for_hw_watchpoint)(struct target_ops *, CORE_ADDR, int) TARGET_DEFAULT_FUNC(default_region_ok_for_hw_watchpoint)
void target_fetch_registers(struct regcache *regcache, int regno)
int(* to_can_use_hw_breakpoint)(struct target_ops *, enum bptype, int, int) TARGET_DEFAULT_RETURN(0)
enum gdb_signal stop_signal
static int syscall_is_exit(procinfo *pi, int scall)
static int proc_iterate_over_threads(procinfo *pi, int(*func)(procinfo *, procinfo *, void *), void *ptr)
int gdbarch_have_nonsteppable_watchpoint(struct gdbarch *gdbarch)
static int info_mappings_callback(struct prmap *map, find_memory_region_ftype ignore, void *unused)
void inf_child_maybe_unpush_target(struct target_ops *ops)
static procinfo * find_procinfo_or_die(int pid, int tid)
void fill_fpregset(const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regno)
struct regcache * get_current_regcache(void)
static int proc_why(procinfo *pi)
void printf_filtered(const char *format,...)
static void procfs_pass_signals(struct target_ops *self, int, unsigned char *)
ptid_t ptid_build(int pid, long lwp, long tid)
void(* to_files_info)(struct target_ops *) TARGET_DEFAULT_IGNORE()
static void close_procinfo_files(procinfo *p)
scoped_restore_tmpl< T > make_scoped_restore(T *var)
static gdb_fpregset_t * proc_get_fpregs(procinfo *pi)
static void proc_trace_sysexit_cmd(const char *args, int from_tty)
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
void null_cleanup(void *arg)
struct observer * observer_attach_inferior_created(observer_inferior_created_ftype *f)
int in_thread_list(ptid_t ptid)
static int procfs_remove_watchpoint(struct target_ops *self, CORE_ADDR addr, int len, enum target_hw_bp_type type, struct expression *cond)
static sysset_t * proc_get_traced_sysexit(procinfo *pi, sysset_t *save)
struct thread_info * iterate_over_threads(thread_callback_func, void *)
static int proc_set_gregs(procinfo *pi)
static void proc_error(procinfo *pi, const char *func, int line)
static int proc_clear_current_signal(procinfo *pi)
static int proc_set_traced_signals(procinfo *pi, sigset_t *sigset)
static const char * procfs_pid_to_str(struct target_ops *, ptid_t)
thread_suspend_state suspend
static void procfs_set_exec_trap(void)
struct target_ops current_target
static void procfs_resume(struct target_ops *, ptid_t, int, enum gdb_signal)
int gdbarch_sp_regnum(struct gdbarch *gdbarch)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
static void procfs_files_info(struct target_ops *)
struct procinfo * thread_list
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
static void proc_trace_sysentry_cmd(const char *args, int from_tty)
GDB_GREGSET_T gdb_gregset_t
static void procfs_detach(struct target_ops *, const char *, int)
void(* to_resume)(struct target_ops *, ptid_t, int TARGET_DEBUG_PRINTER(target_debug_print_step), enum gdb_signal) TARGET_DEFAULT_NORETURN(noprocess())
static enum target_xfer_status procfs_xfer_memory(gdb_byte *, const gdb_byte *, ULONGEST, ULONGEST, ULONGEST *)
static int proc_set_traced_sysexit(procinfo *pi, sysset_t *sysset)
GDB_FPREGSET_T gdb_fpregset_t
ptid_t pid_to_ptid(int pid)
static void proc_warn(procinfo *pi, const char *func, int line)
void supply_gregset(struct regcache *regcache, const gdb_gregset_t *gregsetp)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void proc_prettyprint_why(unsigned long why, unsigned long what, int verbose)
struct cleanup * make_cleanup(make_cleanup_ftype *function, void *arg)
void store_waitstatus(struct target_waitstatus *ourstatus, int hoststatus)
static int proc_modify_flag(procinfo *pi, long flag, long mode)
sysset_t * saved_entryset
static void do_detach(int signo)
static int proc_nsysarg(procinfo *pi)
struct inferior * find_inferior_pid(int pid)
int gdb_signal_to_host(enum gdb_signal)
static void procfs_create_inferior(struct target_ops *, const char *, const std::string &, char **, int)
static void procfs_update_thread_list(struct target_ops *ops)
struct cleanup * make_cleanup_close(int fd)
enum gdb_signal gdb_signal_from_host(int)
pid_t inferior_process_group(void)
void target_mourn_inferior(ptid_t ptid)
enum target_xfer_status target_xfer_partial_ftype(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
void thread_change_ptid(ptid_t old_ptid, ptid_t new_ptid)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
static void procfs_fetch_registers(struct target_ops *, struct regcache *, int)
static sysset_t * sysset_t_alloc(procinfo *pi)
int(* to_insert_watchpoint)(struct target_ops *, CORE_ADDR, int, enum target_hw_bp_type, struct expression *) TARGET_DEFAULT_RETURN(-1)
static int proc_stop_process(procinfo *pi)
static void procfs_store_registers(struct target_ops *, struct regcache *, int)
int gdbarch_addr_bit(struct gdbarch *gdbarch)
struct thread_info * add_thread_silent(ptid_t ptid)
enum target_xfer_status(* to_xfer_partial)(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) TARGET_DEFAULT_RETURN(TARGET_XFER_E_IO)
static void unconditionally_kill_inferior(procinfo *pi)
void printf_unfiltered(const char *format,...)
static enum gdb_signal find_stop_signal(void)
void(* to_detach)(struct target_ops *ops, const char *, int) TARGET_DEFAULT_IGNORE()
static sysset_t * proc_get_traced_sysentry(procinfo *pi, sysset_t *save)
ptid_t gdb_startup_inferior(pid_t pid, int num_traps)
static char * procfs_make_note_section(struct target_ops *self, bfd *, int *)
char *(* to_make_corefile_notes)(struct target_ops *, bfd *, int *) TARGET_DEFAULT_FUNC(dummy_make_corefile_notes)
CORE_ADDR gdbarch_pointer_to_address(struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf)
long ptid_get_lwp(const ptid_t &ptid)
static int proc_set_traced_sysentry(procinfo *pi, sysset_t *sysset)
int target_is_pushed(struct target_ops *t)
static void dead_procinfo(procinfo *p, const char *msg, int killp)
static int proc_wait_for_stop(procinfo *pi)
static const struct @28 signals[]
static int proc_parent_pid(procinfo *pi)
static int proc_delete_dead_threads(procinfo *parent, procinfo *thread, void *ignore)
#define PROC_PRETTYFPRINT_STATUS(X, Y, Z, T)
int(* to_auxv_parse)(struct target_ops *ops, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) TARGET_DEFAULT_FUNC(default_auxv_parse)
static gdb_gregset_t * proc_get_gregs(procinfo *pi)
static int procfs_insert_watchpoint(struct target_ops *self, CORE_ADDR addr, int len, enum target_hw_bp_type type, struct expression *cond)
static int proc_run_process(procinfo *pi, int step, int signo)
static char * mappingflags(long flags)
static int proc_clear_current_fault(procinfo *pi)
struct target_ops * inf_child_target(void)
static int proc_unset_run_on_last_close(procinfo *pi)
void(* to_fetch_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_IGNORE()
static int syscall_is_lwp_exit(procinfo *pi, int scall)
void(* to_mourn_inferior)(struct target_ops *) TARGET_DEFAULT_FUNC(default_mourn_inferior)
void void void void void void void void void perror_with_name(const char *string) ATTRIBUTE_NORETURN
static int find_signalled_thread(struct thread_info *info, void *data)
static int proc_set_fpregs(procinfo *pi)
static int find_memory_regions_callback(struct prmap *map, find_memory_region_ftype func, void *data)
int gdbarch_fp0_regnum(struct gdbarch *gdbarch)
void(* to_pass_signals)(struct target_ops *, int, unsigned char *TARGET_DEBUG_PRINTER(target_debug_print_signals)) TARGET_DEFAULT_IGNORE()
pid_t fork_inferior(const char *exec_file_arg, const std::string &allargs, char **env, void(*traceme_fun)(), void(*init_trace_fun)(int), void(*pre_trace_fun)(), const char *shell_file_arg, void(*exec_fun)(const char *file, char *const *argv, char *const *env))
static int procfs_stopped_data_address(struct target_ops *targ, CORE_ADDR *addr)
enum target_waitkind kind
void(* to_kill)(struct target_ops *) TARGET_DEFAULT_NORETURN(noprocess())
static void procfs_init_inferior(struct target_ops *ops, int pid)
struct type * builtin_data_ptr
void detach_inferior(int pid)
static procinfo * procinfo_list
static void proc_untrace_sysexit_cmd(const char *args, int from_tty)
void procfs_use_watchpoints(struct target_ops *t)
static int proc_kill(procinfo *pi, int signo)
static long proc_flags(procinfo *pi)
static int proc_get_nthreads(procinfo *pi)
const char * target_pid_to_str(ptid_t ptid)
static int syscall_is_exec(procinfo *pi, int scall)
static int invalidate_cache(procinfo *parent, procinfo *pi, void *ptr)
static int proc_set_current_signal(procinfo *pi, int signo)
int parse_pid_to_attach(const char *args)
struct target_ops * procfs_target(void)
int(* to_stopped_by_watchpoint)(struct target_ops *) TARGET_DEFAULT_RETURN(0)
static int open_with_retry(const char *pathname, int flags)
static void procfs_inferior_created(struct target_ops *ops, int from_tty)
int ptid_equal(const ptid_t &ptid1, const ptid_t &ptid2)
#define START_INFERIOR_TRAPS_EXPECTED
static const int mappings[]
struct inferior * current_inferior(void)
int is_exited(ptid_t ptid)
static int proc_set_watchpoint(procinfo *pi, CORE_ADDR addr, int len, int wflags)
static procinfo * create_procinfo(int pid, int tid)
unsigned long long ULONGEST
static int ignore(struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
static int procfs_can_use_hw_breakpoint(struct target_ops *self, enum bptype, int, int)
static void procfs_kill_inferior(struct target_ops *ops)
void proc_prettyprint_flags(unsigned long flags, int verbose)
static int procfs_stopped_by_watchpoint(struct target_ops *ops)
void(* to_interrupt)(struct target_ops *, ptid_t) TARGET_DEFAULT_IGNORE()
int gdbarch_pc_regnum(struct gdbarch *gdbarch)
static void do_closedir_cleanup(void *dir)
void(* to_create_inferior)(struct target_ops *, const char *, const std::string &, char **, int)
static int proc_set_run_on_last_close(procinfo *pi)
#define TYPE_LENGTH(thistype)
int to_has_thread_control
#define MAX_PROC_NAME_SIZE
int(* to_thread_alive)(struct target_ops *, ptid_t ptid) TARGET_DEFAULT_RETURN(0)
void(* to_info_proc)(struct target_ops *, const char *, enum info_proc_what)
void(* to_attach)(struct target_ops *ops, const char *, int)
#define target_have_steppable_watchpoint
void gdb_flush(struct ui_file *file)
int(* to_stopped_data_address)(struct target_ops *, CORE_ADDR *) TARGET_DEFAULT_RETURN(0)
struct cmd_list_element * add_com(const char *name, enum command_class theclass, cmd_const_cfunc_ftype *fun, const char *doc)
void(* to_update_thread_list)(struct target_ops *) TARGET_DEFAULT_IGNORE()
static void info_proc_mappings(procinfo *pi, int summary)
static int proc_set_async(procinfo *pi)
static ptid_t do_attach(ptid_t ptid)
void(* to_store_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_NORETURN(noprocess())
int(* find_memory_region_ftype)(CORE_ADDR addr, unsigned long size, int read, int write, int exec, int modified, void *data)
ptid_t(* to_wait)(struct target_ops *, ptid_t, struct target_waitstatus *, int TARGET_DEBUG_PRINTER(target_debug_print_options)) TARGET_DEFAULT_FUNC(default_target_wait)
static int proc_unset_inherit_on_fork(procinfo *pi)
void error(const char *fmt,...)
void gdbarch_address_to_pointer(struct gdbarch *gdbarch, struct type *type, gdb_byte *buf, CORE_ADDR addr)
static int procfs_set_watchpoint(ptid_t ptid, CORE_ADDR addr, int len, int rwflag, int after)
void target_continue_no_signal(ptid_t ptid)
static void proc_trace_syscalls_1(procinfo *pi, int syscallnum, int entry_or_exit, int mode, int from_tty)
struct target_ops * beneath
static int proc_update_threads(procinfo *pi)
void inferior_appeared(struct inferior *inf, int pid)
void do_cleanups(struct cleanup *old_chain)
static fltset_t * proc_get_traced_faults(procinfo *pi, fltset_t *save)
target_xfer_partial_ftype memory_xfer_auxv
void supply_fpregset(struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
static int proc_find_memory_regions(struct target_ops *self, find_memory_region_ftype, void *)
char pathname[MAX_PROC_NAME_SIZE]