X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fprocfs.c;h=13a71aac7bcad47a7bc332f489d77c7d74113263;hb=9f1b45b0da430a7a7abf9e54acbe6f2ef9d3a763;hp=917e122c9a5d9aa40a9e77279ee2d045fd41d193;hpb=13bdd2e791a9da0749efd74719cdf42421ac3875;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/procfs.c b/gdb/procfs.c index 917e122c9a..13a71aac7b 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -1,7 +1,6 @@ /* Machine independent support for SVR4 /proc (process file system) for GDB. - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2006, 2007, 2008, 2009, 2010, - 2011 Free Software Foundation, Inc. + Copyright (C) 1999-2014 Free Software Foundation, Inc. Written by Michael Snyder at Cygnus Solutions. Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others. @@ -46,7 +45,8 @@ #include "gdb_wait.h" #include #include -#include "gdb_string.h" +#include "gdb_bfd.h" +#include #include "gdb_assert.h" #include "inflow.h" #include "auxv.h" @@ -62,7 +62,6 @@ Irix Solaris OSF - Unixware AIX5 /proc works by imitating a file system: you open a simulated file @@ -90,12 +89,12 @@ #ifdef NEW_PROC_API #include -#include "gdb_dirent.h" /* opendir/readdir, for listing the LWP's */ +#include /* opendir/readdir, for listing the LWP's */ #endif #include /* for O_RDONLY */ #include /* for "X_OK" */ -#include "gdb_stat.h" /* for struct stat */ +#include /* for struct stat */ /* Note: procfs-utils.h must be included after the above system header files, because it redefines various system calls using macros. @@ -111,9 +110,9 @@ /* This module defines the GDB target vector and its methods. */ static void procfs_attach (struct target_ops *, char *, int); -static void procfs_detach (struct target_ops *, char *, int); +static void procfs_detach (struct target_ops *, const char *, int); static void procfs_resume (struct target_ops *, - ptid_t, int, enum target_signal); + ptid_t, int, enum gdb_signal); static void procfs_stop (ptid_t); static void procfs_files_info (struct target_ops *); static void procfs_fetch_registers (struct target_ops *, @@ -130,28 +129,22 @@ static ptid_t procfs_wait (struct target_ops *, static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int, struct mem_attrib *attrib, struct target_ops *); -static LONGEST procfs_xfer_partial (struct target_ops *ops, - enum target_object object, - const char *annex, - gdb_byte *readbuf, - const gdb_byte *writebuf, - ULONGEST offset, LONGEST len); +static target_xfer_partial_ftype procfs_xfer_partial; static int procfs_thread_alive (struct target_ops *ops, ptid_t); -void procfs_find_new_threads (struct target_ops *ops); -char *procfs_pid_to_str (struct target_ops *, ptid_t); +static void procfs_find_new_threads (struct target_ops *ops); +static char *procfs_pid_to_str (struct target_ops *, ptid_t); -static int proc_find_memory_regions (int (*) (CORE_ADDR, - unsigned long, - int, int, int, - void *), - void *); +static int proc_find_memory_regions (find_memory_region_ftype, void *); static char * procfs_make_note_section (bfd *, int *); static int procfs_can_use_hw_breakpoint (int, int, int); +static void procfs_info_proc (struct target_ops *, char *, + enum info_proc_what); + #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) /* When GDB is built as 64-bit application on Solaris, the auxv data is presented in 64-bit format. We need to provide a custom parser @@ -160,7 +153,7 @@ static int procfs_auxv_parse (struct target_ops *ops, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) { - enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); gdb_byte *ptr = *readptr; if (endptr == ptr) @@ -212,6 +205,7 @@ procfs_target (void) t->to_has_thread_control = tc_schedlock; t->to_find_memory_regions = proc_find_memory_regions; t->to_make_corefile_notes = procfs_make_note_section; + t->to_info_proc = procfs_info_proc; #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) t->to_auxv_parse = procfs_auxv_parse; @@ -263,7 +257,7 @@ typedef struct sigaction gdb_sigaction_t; #ifdef HAVE_PR_SIGINFO64_T typedef pr_siginfo64_t gdb_siginfo_t; #else -typedef struct siginfo gdb_siginfo_t; +typedef siginfo_t gdb_siginfo_t; #endif /* On mips-irix, praddset and prdelset are defined in such a way that @@ -549,7 +543,7 @@ open_procinfo_files (procinfo *pi, int which) /* This function is getting ALMOST long enough to break up into several. Here is some rationale: - NEW_PROC_API (Solaris 2.6, Solaris 2.7, Unixware): + NEW_PROC_API (Solaris 2.6, Solaris 2.7): There are several file descriptors that may need to be open for any given process or LWP. The ones we're intereted in are: - control (ctl) write-only change the state @@ -605,7 +599,7 @@ open_procinfo_files (procinfo *pi, int which) else strcat (tmp, "/ctl"); fd = open_with_retry (tmp, O_WRONLY); - if (fd <= 0) + if (fd < 0) return 0; /* fail */ pi->ctl_fd = fd; break; @@ -614,7 +608,7 @@ open_procinfo_files (procinfo *pi, int which) return 0; /* There is no 'as' file descriptor for an lwp. */ strcat (tmp, "/as"); fd = open_with_retry (tmp, O_RDWR); - if (fd <= 0) + if (fd < 0) return 0; /* fail */ pi->as_fd = fd; break; @@ -624,7 +618,7 @@ open_procinfo_files (procinfo *pi, int which) else strcat (tmp, "/status"); fd = open_with_retry (tmp, O_RDONLY); - if (fd <= 0) + if (fd < 0) return 0; /* fail */ pi->status_fd = fd; break; @@ -646,13 +640,13 @@ open_procinfo_files (procinfo *pi, int which) #ifdef PIOCTSTATUS /* OSF */ /* Only one FD; just open it. */ - if ((fd = open_with_retry (pi->pathname, O_RDWR)) == 0) + if ((fd = open_with_retry (pi->pathname, O_RDWR)) < 0) return 0; #else /* Sol 2.5, Irix, other? */ if (pi->tid == 0) /* Master procinfo for the process */ { fd = open_with_retry (pi->pathname, O_RDWR); - if (fd <= 0) + if (fd < 0) return 0; /* fail */ } else /* LWP thread procinfo */ @@ -666,7 +660,7 @@ open_procinfo_files (procinfo *pi, int which) return 0; /* fail */ /* Now obtain the file descriptor for the LWP. */ - if ((fd = ioctl (process->ctl_fd, PIOCOPENLWP, &lwpid)) <= 0) + if ((fd = ioctl (process->ctl_fd, PIOCOPENLWP, &lwpid)) < 0) return 0; /* fail */ #else /* Irix, other? */ return 0; /* Don't know how to open threads. */ @@ -878,6 +872,7 @@ load_syscalls (procinfo *pi) prsysent_t header; prsyscall_t *syscalls; int i, size, maxcall; + struct cleanup *cleanups; pi->num_syscalls = 0; pi->syscall_names = 0; @@ -889,6 +884,7 @@ load_syscalls (procinfo *pi) { error (_("load_syscalls: Can't open /proc/%d/sysent"), pi->pid); } + cleanups = make_cleanup_close (sysent_fd); size = sizeof header - sizeof (prsyscall_t); if (read (sysent_fd, &header, size) != size) @@ -904,12 +900,10 @@ load_syscalls (procinfo *pi) size = header.pr_nsyscalls * sizeof (prsyscall_t); syscalls = xmalloc (size); + make_cleanup (free_current_contents, &syscalls); if (read (sysent_fd, syscalls, size) != size) - { - xfree (syscalls); - error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid); - } + error (_("load_syscalls: Error reading /proc/%d/sysent"), pi->pid); /* Find maximum syscall number. This may not be the same as pr_nsyscalls since that value refers to the number of entries @@ -963,8 +957,7 @@ load_syscalls (procinfo *pi) pi->syscall_names[callnum][size-1] = '\0'; } - close (sysent_fd); - xfree (syscalls); + do_cleanups (cleanups); } /* Free the space allocated for the syscall names from the procinfo @@ -1017,63 +1010,24 @@ find_syscall (procinfo *pi, char *name) than have a bunch of #ifdefs all thru the gdb target vector functions, we do our best to hide them all in here. */ -int proc_get_status (procinfo * pi); -long proc_flags (procinfo * pi); -int proc_why (procinfo * pi); -int proc_what (procinfo * pi); -int proc_set_run_on_last_close (procinfo * pi); -int proc_unset_run_on_last_close (procinfo * pi); -int proc_set_inherit_on_fork (procinfo * pi); -int proc_unset_inherit_on_fork (procinfo * pi); -int proc_set_async (procinfo * pi); -int proc_unset_async (procinfo * pi); -int proc_stop_process (procinfo * pi); -int proc_trace_signal (procinfo * pi, int signo); -int proc_ignore_signal (procinfo * pi, int signo); -int proc_clear_current_fault (procinfo * pi); -int proc_set_current_signal (procinfo * pi, int signo); -int proc_clear_current_signal (procinfo * pi); -int proc_set_gregs (procinfo * pi); -int proc_set_fpregs (procinfo * pi); -int proc_wait_for_stop (procinfo * pi); -int proc_run_process (procinfo * pi, int step, int signo); -int proc_kill (procinfo * pi, int signo); -int proc_parent_pid (procinfo * pi); -int proc_get_nthreads (procinfo * pi); -int proc_get_current_thread (procinfo * pi); -int proc_set_held_signals (procinfo * pi, gdb_sigset_t * sighold); -int proc_set_traced_sysexit (procinfo * pi, sysset_t * sysset); -int proc_set_traced_sysentry (procinfo * pi, sysset_t * sysset); -int proc_set_traced_faults (procinfo * pi, fltset_t * fltset); -int proc_set_traced_signals (procinfo * pi, gdb_sigset_t * sigset); - -int proc_update_threads (procinfo * pi); -int proc_iterate_over_threads (procinfo * pi, - int (*func) (procinfo *, procinfo *, void *), - void *ptr); - -gdb_gregset_t *proc_get_gregs (procinfo * pi); -gdb_fpregset_t *proc_get_fpregs (procinfo * pi); -sysset_t *proc_get_traced_sysexit (procinfo * pi, sysset_t * save); -sysset_t *proc_get_traced_sysentry (procinfo * pi, sysset_t * save); -fltset_t *proc_get_traced_faults (procinfo * pi, fltset_t * save); -gdb_sigset_t *proc_get_traced_signals (procinfo * pi, gdb_sigset_t * save); -gdb_sigset_t *proc_get_held_signals (procinfo * pi, gdb_sigset_t * save); -gdb_sigset_t *proc_get_pending_signals (procinfo * pi, gdb_sigset_t * save); -gdb_sigaction_t *proc_get_signal_actions (procinfo * pi, - gdb_sigaction_t *save); - -void proc_warn (procinfo * pi, char *func, int line); -void proc_error (procinfo * pi, char *func, int line); +static long proc_flags (procinfo * pi); +static int proc_why (procinfo * pi); +static int proc_what (procinfo * pi); +static int proc_set_current_signal (procinfo * pi, int signo); +static int proc_get_current_thread (procinfo * pi); +static int proc_iterate_over_threads + (procinfo * pi, + int (*func) (procinfo *, procinfo *, void *), + void *ptr); -void +static void proc_warn (procinfo *pi, char *func, int line) { sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname); print_sys_errmsg (errmsg, errno); } -void +static void proc_error (procinfo *pi, char *func, int line) { sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname); @@ -1086,7 +1040,7 @@ proc_error (procinfo *pi, char *func, int line) file descriptor is also only opened when it is needed. Returns non-zero for success, zero for failure. */ -int +static int proc_get_status (procinfo *pi) { /* Status file descriptor is opened "lazily". */ @@ -1115,16 +1069,6 @@ proc_get_status (procinfo *pi) (char *) &pi->prstatus, sizeof (gdb_prstatus_t)) == sizeof (gdb_prstatus_t)); -#if 0 /*def UNIXWARE*/ - if (pi->status_valid && - (pi->prstatus.pr_lwp.pr_flags & PR_ISTOP) && - pi->prstatus.pr_lwp.pr_why == PR_REQUESTED) - /* Unixware peculiarity -- read the damn thing again! */ - pi->status_valid = (read (pi->status_fd, - (char *) &pi->prstatus, - sizeof (gdb_prstatus_t)) - == sizeof (gdb_prstatus_t)); -#endif /* UNIXWARE */ } } #else /* ioctl method */ @@ -1180,7 +1124,7 @@ proc_get_status (procinfo *pi) /* Returns the process flags (pr_flags field). */ -long +static long proc_flags (procinfo *pi) { if (!pi->status_valid) @@ -1188,14 +1132,7 @@ proc_flags (procinfo *pi) return 0; /* FIXME: not a good failure value (but what is?) */ #ifdef NEW_PROC_API -# ifdef UNIXWARE - /* UnixWare 7.1 puts process status flags, e.g. PR_ASYNC, in - pstatus_t and LWP status flags, e.g. PR_STOPPED, in lwpstatus_t. - The two sets of flags don't overlap. */ - return pi->prstatus.pr_flags | pi->prstatus.pr_lwp.pr_flags; -# else return pi->prstatus.pr_lwp.pr_flags; -# endif #else return pi->prstatus.pr_flags; #endif @@ -1203,7 +1140,7 @@ proc_flags (procinfo *pi) /* Returns the pr_why field (why the process stopped). */ -int +static int proc_why (procinfo *pi) { if (!pi->status_valid) @@ -1219,7 +1156,7 @@ proc_why (procinfo *pi) /* Returns the pr_what field (details of why the process stopped). */ -int +static int proc_what (procinfo *pi) { if (!pi->status_valid) @@ -1246,12 +1183,12 @@ proc_watchpoint_address (procinfo *pi, CORE_ADDR *addr) return 0; #ifdef NEW_PROC_API - *addr = (CORE_ADDR) gdbarch_pointer_to_address (target_gdbarch, - builtin_type (target_gdbarch)->builtin_data_ptr, + *addr = (CORE_ADDR) gdbarch_pointer_to_address (target_gdbarch (), + builtin_type (target_gdbarch ())->builtin_data_ptr, (gdb_byte *) &pi->prstatus.pr_lwp.pr_info.si_addr); #else - *addr = (CORE_ADDR) gdbarch_pointer_to_address (target_gdbarch, - builtin_type (target_gdbarch)->builtin_data_ptr, + *addr = (CORE_ADDR) gdbarch_pointer_to_address (target_gdbarch (), + builtin_type (target_gdbarch ())->builtin_data_ptr, (gdb_byte *) &pi->prstatus.pr_info.si_addr); #endif return 1; @@ -1262,7 +1199,7 @@ proc_watchpoint_address (procinfo *pi, CORE_ADDR *addr) /* Returns the pr_nsysarg field (number of args to the current syscall). */ -int +static int proc_nsysarg (procinfo *pi) { if (!pi->status_valid) @@ -1279,7 +1216,7 @@ proc_nsysarg (procinfo *pi) /* Returns the pr_sysarg field (pointer to the arguments of current syscall). */ -long * +static long * proc_sysargs (procinfo *pi) { if (!pi->status_valid) @@ -1292,28 +1229,12 @@ proc_sysargs (procinfo *pi) return (long *) &pi->prstatus.pr_sysarg; #endif } - -/* Returns the pr_syscall field (id of current syscall if we are in - one). */ - -int -proc_syscall (procinfo *pi) -{ - if (!pi->status_valid) - if (!proc_get_status (pi)) - return 0; - -#ifdef NEW_PROC_API - return pi->prstatus.pr_lwp.pr_syscall; -#else - return pi->prstatus.pr_syscall; -#endif -} #endif /* PIOCSSPCACT */ +#ifdef PROCFS_DONT_PIOCSSIG_CURSIG /* Returns the pr_cursig field (current signal). */ -long +static long proc_cursig (struct procinfo *pi) { if (!pi->status_valid) @@ -1326,6 +1247,7 @@ proc_cursig (struct procinfo *pi) return pi->prstatus.pr_cursig; #endif } +#endif /* PROCFS_DONT_PIOCSSIG_CURSIG */ /* === I appologize for the messiness of this function. === This is an area where the different versions of @@ -1372,7 +1294,7 @@ proc_modify_flag (procinfo *pi, long flag, long mode) if (pi->pid != 0) pi = find_procinfo_or_die (pi->pid, 0); -#ifdef NEW_PROC_API /* Newest method: UnixWare and newer Solarii. */ +#ifdef NEW_PROC_API /* Newest method: Newer Solarii. */ /* First normalize the PCUNSET/PCRESET command opcode (which for no obvious reason has a different definition from one operating system to the next...) */ @@ -1460,7 +1382,7 @@ proc_modify_flag (procinfo *pi, long flag, long mode) become runnable when debugger closes all /proc fds. Returns non-zero for success, zero for failure. */ -int +static int proc_set_run_on_last_close (procinfo *pi) { return proc_modify_flag (pi, PR_RLC, FLAG_SET); @@ -1470,51 +1392,18 @@ proc_set_run_on_last_close (procinfo *pi) runnable when debugger closes its file handles. Returns non-zero for success, zero for failure. */ -int +static int proc_unset_run_on_last_close (procinfo *pi) { return proc_modify_flag (pi, PR_RLC, FLAG_RESET); } -#ifdef PR_KLC -/* Set the kill_on_last_close flag. Process with all threads will be - killed when debugger closes all /proc fds (or debugger exits or - dies). Returns non-zero for success, zero for failure. */ - -int -proc_set_kill_on_last_close (procinfo *pi) -{ - return proc_modify_flag (pi, PR_KLC, FLAG_SET); -} - -/* Reset the kill_on_last_close flag. Process will NOT be killed when - debugger closes its file handles (or exits or dies). Returns - non-zero for success, zero for failure. */ - -int -proc_unset_kill_on_last_close (procinfo *pi) -{ - return proc_modify_flag (pi, PR_KLC, FLAG_RESET); -} -#endif /* PR_KLC */ - -/* Set inherit_on_fork flag. If the process forks a child while we - are registered for events in the parent, then we will also recieve - events from the child. Returns non-zero for success, zero for - failure. */ - -int -proc_set_inherit_on_fork (procinfo *pi) -{ - return proc_modify_flag (pi, PR_FORK, FLAG_SET); -} - /* Reset inherit_on_fork flag. If the process forks a child while we are registered for events in the parent, then we will NOT recieve events from the child. Returns non-zero for success, zero for failure. */ -int +static int proc_unset_inherit_on_fork (procinfo *pi) { return proc_modify_flag (pi, PR_FORK, FLAG_RESET); @@ -1525,7 +1414,7 @@ proc_unset_inherit_on_fork (procinfo *pi) (signal etc.), the remaining LWPs will continue to run. Returns non-zero for success, zero for failure. */ -int +static int proc_set_async (procinfo *pi) { return proc_modify_flag (pi, PR_ASYNC, FLAG_SET); @@ -1535,7 +1424,7 @@ proc_set_async (procinfo *pi) (signal etc.), then all other LWPs will stop as well. Returns non-zero for success, zero for failure. */ -int +static int proc_unset_async (procinfo *pi) { return proc_modify_flag (pi, PR_ASYNC, FLAG_RESET); @@ -1545,7 +1434,7 @@ proc_unset_async (procinfo *pi) /* Request the process/LWP to stop. Does not wait. Returns non-zero for success, zero for failure. */ -int +static int proc_stop_process (procinfo *pi) { int win; @@ -1582,7 +1471,7 @@ proc_stop_process (procinfo *pi) /* Wait for the process or LWP to stop (block until it does). Returns non-zero for success, zero for failure. */ -int +static int proc_wait_for_stop (procinfo *pi) { int win; @@ -1638,7 +1527,7 @@ proc_wait_for_stop (procinfo *pi) any; if non-zero, set the current signal to this one. Returns non-zero for success, zero for failure. */ -int +static int proc_run_process (procinfo *pi, int step, int signo) { int win; @@ -1685,7 +1574,7 @@ proc_run_process (procinfo *pi, int step, int signo) /* Register to trace signals in the process or LWP. Returns non-zero for success, zero for failure. */ -int +static int proc_set_traced_signals (procinfo *pi, gdb_sigset_t *sigset) { int win; @@ -1725,7 +1614,7 @@ proc_set_traced_signals (procinfo *pi, gdb_sigset_t *sigset) /* Register to trace hardware faults in the process or LWP. Returns non-zero for success, zero for failure. */ -int +static int proc_set_traced_faults (procinfo *pi, fltset_t *fltset) { int win; @@ -1763,7 +1652,7 @@ proc_set_traced_faults (procinfo *pi, fltset_t *fltset) /* Register to trace entry to system calls in the process or LWP. Returns non-zero for success, zero for failure. */ -int +static int proc_set_traced_sysentry (procinfo *pi, sysset_t *sysset) { int win; @@ -1808,7 +1697,7 @@ proc_set_traced_sysentry (procinfo *pi, sysset_t *sysset) /* Register to trace exit from system calls in the process or LWP. Returns non-zero for success, zero for failure. */ -int +static int proc_set_traced_sysexit (procinfo *pi, sysset_t *sysset) { int win; @@ -1853,7 +1742,7 @@ proc_set_traced_sysexit (procinfo *pi, sysset_t *sysset) /* Specify the set of blocked / held signals in the process or LWP. Returns non-zero for success, zero for failure. */ -int +static int proc_set_held_signals (procinfo *pi, gdb_sigset_t *sighold) { int win; @@ -1888,72 +1777,10 @@ proc_set_held_signals (procinfo *pi, gdb_sigset_t *sighold) return win; } -/* Returns the set of signals that are pending in the process or LWP. - Will also copy the sigset if SAVE is non-zero. */ - -gdb_sigset_t * -proc_get_pending_signals (procinfo *pi, gdb_sigset_t *save) -{ - gdb_sigset_t *ret = NULL; - - /* We should never have to apply this operation to any procinfo - except the one for the main process. If that ever changes for - any reason, then take out the following clause and replace it - with one that makes sure the ctl_fd is open. */ - - if (pi->tid != 0) - pi = find_procinfo_or_die (pi->pid, 0); - - if (!pi->status_valid) - if (!proc_get_status (pi)) - return NULL; - -#ifdef NEW_PROC_API - ret = &pi->prstatus.pr_lwp.pr_lwppend; -#else - ret = &pi->prstatus.pr_sigpend; -#endif - if (save && ret) - memcpy (save, ret, sizeof (gdb_sigset_t)); - - return ret; -} - -/* Returns the set of signal actions. Will also copy the sigactionset - if SAVE is non-zero. */ - -gdb_sigaction_t * -proc_get_signal_actions (procinfo *pi, gdb_sigaction_t *save) -{ - gdb_sigaction_t *ret = NULL; - - /* We should never have to apply this operation to any procinfo - except the one for the main process. If that ever changes for - any reason, then take out the following clause and replace it - with one that makes sure the ctl_fd is open. */ - - if (pi->tid != 0) - pi = find_procinfo_or_die (pi->pid, 0); - - if (!pi->status_valid) - if (!proc_get_status (pi)) - return NULL; - -#ifdef NEW_PROC_API - ret = &pi->prstatus.pr_lwp.pr_action; -#else - ret = &pi->prstatus.pr_action; -#endif - if (save && ret) - memcpy (save, ret, sizeof (gdb_sigaction_t)); - - return ret; -} - /* Returns the set of signals that are held / blocked. Will also copy the sigset if SAVE is non-zero. */ -gdb_sigset_t * +static gdb_sigset_t * proc_get_held_signals (procinfo *pi, gdb_sigset_t *save) { gdb_sigset_t *ret = NULL; @@ -1971,11 +1798,7 @@ proc_get_held_signals (procinfo *pi, gdb_sigset_t *save) if (!proc_get_status (pi)) return NULL; -#ifdef UNIXWARE - ret = &pi->prstatus.pr_lwp.pr_context.uc_sigmask; -#else ret = &pi->prstatus.pr_lwp.pr_lwphold; -#endif /* UNIXWARE */ #else /* not NEW_PROC_API */ { static gdb_sigset_t sigheld; @@ -1993,7 +1816,7 @@ proc_get_held_signals (procinfo *pi, gdb_sigset_t *save) /* Returns the set of signals that are traced / debugged. Will also copy the sigset if SAVE is non-zero. */ -gdb_sigset_t * +static gdb_sigset_t * proc_get_traced_signals (procinfo *pi, gdb_sigset_t *save) { gdb_sigset_t *ret = NULL; @@ -2026,66 +1849,10 @@ proc_get_traced_signals (procinfo *pi, gdb_sigset_t *save) return ret; } -/* Add SIGNO to the set of signals that are traced. Returns non-zero - for success, zero for failure. */ - -int -proc_trace_signal (procinfo *pi, int signo) -{ - gdb_sigset_t temp; - - /* We should never have to apply this operation to any procinfo - except the one for the main process. If that ever changes for - any reason, then take out the following clause and replace it - with one that makes sure the ctl_fd is open. */ - - if (pi->tid != 0) - pi = find_procinfo_or_die (pi->pid, 0); - - if (pi) - { - if (proc_get_traced_signals (pi, &temp)) - { - gdb_praddset (&temp, signo); - return proc_set_traced_signals (pi, &temp); - } - } - - return 0; /* failure */ -} - -/* Remove SIGNO from the set of signals that are traced. Returns - non-zero for success, zero for failure. */ - -int -proc_ignore_signal (procinfo *pi, int signo) -{ - gdb_sigset_t temp; - - /* We should never have to apply this operation to any procinfo - except the one for the main process. If that ever changes for - any reason, then take out the following clause and replace it - with one that makes sure the ctl_fd is open. */ - - if (pi->tid != 0) - pi = find_procinfo_or_die (pi->pid, 0); - - if (pi) - { - if (proc_get_traced_signals (pi, &temp)) - { - gdb_prdelset (&temp, signo); - return proc_set_traced_signals (pi, &temp); - } - } - - return 0; /* failure */ -} - /* Returns the set of hardware faults that are traced /debugged. Will also copy the faultset if SAVE is non-zero. */ -fltset_t * +static fltset_t * proc_get_traced_faults (procinfo *pi, fltset_t *save) { fltset_t *ret = NULL; @@ -2121,7 +1888,7 @@ proc_get_traced_faults (procinfo *pi, fltset_t *save) /* Returns the set of syscalls that are traced /debugged on entry. Will also copy the syscall set if SAVE is non-zero. */ -sysset_t * +static sysset_t * proc_get_traced_sysentry (procinfo *pi, sysset_t *save) { sysset_t *ret = NULL; @@ -2188,7 +1955,7 @@ proc_get_traced_sysentry (procinfo *pi, sysset_t *save) /* Returns the set of syscalls that are traced /debugged on exit. Will also copy the syscall set if SAVE is non-zero. */ -sysset_t * +static sysset_t * proc_get_traced_sysexit (procinfo *pi, sysset_t *save) { sysset_t * ret = NULL; @@ -2256,7 +2023,7 @@ proc_get_traced_sysexit (procinfo *pi, sysset_t *save) not be sent to the process or LWP when it resumes. Returns non-zero for success, zero for failure. */ -int +static int proc_clear_current_fault (procinfo *pi) { int win; @@ -2290,7 +2057,7 @@ proc_clear_current_fault (procinfo *pi) trap back to the debugger. Returns non-zero for success, zero for failure. */ -int +static int proc_set_current_signal (procinfo *pi, int signo) { int win; @@ -2325,7 +2092,7 @@ proc_set_current_signal (procinfo *pi, int signo) get_last_target_status (&wait_ptid, &wait_status); if (ptid_equal (wait_ptid, inferior_ptid) && wait_status.kind == TARGET_WAITKIND_STOPPED - && wait_status.value.sig == target_signal_from_host (signo) + && wait_status.value.sig == gdb_signal_from_host (signo) && proc_get_status (pi) #ifdef NEW_PROC_API && pi->prstatus.pr_lwp.pr_info.si_signo == signo @@ -2363,7 +2130,7 @@ proc_set_current_signal (procinfo *pi, int signo) process or LWP when it resumes. Returns non-zero for success, zero for failure. */ -int +static int proc_clear_current_signal (procinfo *pi) { int win; @@ -2406,22 +2173,15 @@ proc_clear_current_signal (procinfo *pi) /* Return the general-purpose registers for the process or LWP corresponding to PI. Upon failure, return NULL. */ -gdb_gregset_t * +static gdb_gregset_t * proc_get_gregs (procinfo *pi) { if (!pi->status_valid || !pi->gregs_valid) if (!proc_get_status (pi)) return NULL; - /* OK, sorry about the ifdef's. There's three cases instead of two, - because in this case Unixware and Solaris/RW differ. */ - #ifdef NEW_PROC_API -# ifdef UNIXWARE /* FIXME: Should be autoconfigured. */ - return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.gregs; -# else return &pi->prstatus.pr_lwp.pr_reg; -# endif #else return &pi->prstatus.pr_reg; #endif @@ -2430,7 +2190,7 @@ proc_get_gregs (procinfo *pi) /* Return the general-purpose registers for the process or LWP corresponding to PI. Upon failure, return NULL. */ -gdb_fpregset_t * +static gdb_fpregset_t * proc_get_fpregs (procinfo *pi) { #ifdef NEW_PROC_API @@ -2438,11 +2198,7 @@ proc_get_fpregs (procinfo *pi) if (!proc_get_status (pi)) return NULL; -# ifdef UNIXWARE /* FIXME: Should be autoconfigured. */ - return &pi->prstatus.pr_lwp.pr_context.uc_mcontext.fpregs; -# else return &pi->prstatus.pr_lwp.pr_fpreg; -# endif #else /* not NEW_PROC_API */ if (pi->fpregs_valid) @@ -2503,7 +2259,7 @@ proc_get_fpregs (procinfo *pi) corresponding to PI. Return non-zero for success, zero for failure. */ -int +static int proc_set_gregs (procinfo *pi) { gdb_gregset_t *gregs; @@ -2543,7 +2299,7 @@ proc_set_gregs (procinfo *pi) corresponding to PI. Return non-zero for success, zero for failure. */ -int +static int proc_set_fpregs (procinfo *pi) { gdb_fpregset_t *fpregs; @@ -2601,7 +2357,7 @@ proc_set_fpregs (procinfo *pi) /* Send a signal to the proc or lwp with the semantics of "kill()". Returns non-zero for success, zero for failure. */ -int +static int proc_kill (procinfo *pi, int signo) { int win; @@ -2635,7 +2391,7 @@ proc_kill (procinfo *pi, int signo) /* Find the pid of the process that started this one. Returns the parent process pid, or zero. */ -int +static int proc_parent_pid (procinfo *pi) { /* We should never have to apply this operation to any procinfo @@ -2657,21 +2413,21 @@ proc_parent_pid (procinfo *pi) (a.k.a void pointer)! */ #if (defined (PCWATCH) || defined (PIOCSWATCH)) \ - && !(defined (PIOCOPENLWP) || defined (UNIXWARE)) + && !(defined (PIOCOPENLWP)) static void * procfs_address_to_host_pointer (CORE_ADDR addr) { - struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr; + struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; void *ptr; gdb_assert (sizeof (ptr) == TYPE_LENGTH (ptr_type)); - gdbarch_address_to_pointer (target_gdbarch, ptr_type, + gdbarch_address_to_pointer (target_gdbarch (), ptr_type, (gdb_byte *) &ptr, addr); return ptr; } #endif -int +static int proc_set_watchpoint (procinfo *pi, CORE_ADDR addr, int len, int wflags) { #if !defined (PCWATCH) && !defined (PIOCSWATCH) @@ -2681,7 +2437,7 @@ proc_set_watchpoint (procinfo *pi, CORE_ADDR addr, int len, int wflags) return 0; #else /* Horrible hack! Detect Solaris 2.5, because this doesn't work on 2.5. */ -#if defined (PIOCOPENLWP) || defined (UNIXWARE) /* Solaris 2.5: bail out. */ +#if defined (PIOCOPENLWP) /* Solaris 2.5: bail out. */ return 0; #else struct { @@ -2723,7 +2479,7 @@ proc_set_watchpoint (procinfo *pi, CORE_ADDR addr, int len, int wflags) register for the LWP that we're interested in. Returns the matching ssh struct (LDT entry). */ -struct ssd * +static struct ssd * proc_get_LDT_entry (procinfo *pi, int key) { static struct ssd *ldt_entry = NULL; @@ -2808,17 +2564,17 @@ procfs_find_LDT_entry (ptid_t ptid) procinfo *pi; /* Find procinfo for the lwp. */ - if ((pi = find_procinfo (PIDGET (ptid), TIDGET (ptid))) == NULL) + if ((pi = find_procinfo (ptid_get_pid (ptid), ptid_get_lwp (ptid))) == NULL) { warning (_("procfs_find_LDT_entry: could not find procinfo for %d:%ld."), - PIDGET (ptid), TIDGET (ptid)); + ptid_get_pid (ptid), ptid_get_lwp (ptid)); return NULL; } /* get its general registers. */ if ((gregs = proc_get_gregs (pi)) == NULL) { warning (_("procfs_find_LDT_entry: could not read gregs for %d:%ld."), - PIDGET (ptid), TIDGET (ptid)); + ptid_get_pid (ptid), ptid_get_lwp (ptid)); return NULL; } /* Now extract the GS register's lower 16 bits. */ @@ -2841,7 +2597,7 @@ procfs_find_LDT_entry (ptid_t ptid) #if defined (PIOCNTHR) && defined (PIOCTLIST) /* OSF version */ -int +static int proc_get_nthreads (procinfo *pi) { int nthreads = 0; @@ -2854,8 +2610,8 @@ proc_get_nthreads (procinfo *pi) #else #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */ -/* Solaris and Unixware version */ -int +/* Solaris version */ +static int proc_get_nthreads (procinfo *pi) { if (!pi->status_valid) @@ -2873,7 +2629,7 @@ proc_get_nthreads (procinfo *pi) #else /* Default version */ -int +static int proc_get_nthreads (procinfo *pi) { return 0; @@ -2889,8 +2645,8 @@ proc_get_nthreads (procinfo *pi) currently executing. */ #if defined (SYS_lwpcreate) || defined (SYS_lwp_create) /* FIXME: multiple */ -/* Solaris and Unixware version */ -int +/* Solaris version */ +static int proc_get_current_thread (procinfo *pi) { /* Note: this should be applied to the root procinfo for the @@ -2915,7 +2671,7 @@ proc_get_current_thread (procinfo *pi) #else #if defined (PIOCNTHR) && defined (PIOCTLIST) /* OSF version */ -int +static int proc_get_current_thread (procinfo *pi) { #if 0 /* FIXME: not ready for prime time? */ @@ -2927,7 +2683,7 @@ proc_get_current_thread (procinfo *pi) #else /* Default version */ -int +static int proc_get_current_thread (procinfo *pi) { return 0; @@ -2941,7 +2697,7 @@ proc_get_current_thread (procinfo *pi) unfortunately requires a different method on every OS. Returns non-zero for success, zero for failure. */ -int +static int proc_delete_dead_threads (procinfo *parent, procinfo *thread, void *ignore) { if (thread && parent) /* sanity */ @@ -2955,7 +2711,7 @@ proc_delete_dead_threads (procinfo *parent, procinfo *thread, void *ignore) #if defined (PIOCLSTATUS) /* Solaris 2.5 (ioctl) version */ -int +static int proc_update_threads (procinfo *pi) { gdb_prstatus_t *prstatus; @@ -2997,14 +2753,14 @@ proc_update_threads (procinfo *pi) } #else #ifdef NEW_PROC_API -/* Unixware and Solaris 6 (and later) version. */ +/* Solaris 6 (and later) version. */ static void do_closedir_cleanup (void *dir) { closedir (dir); } -int +static int proc_update_threads (procinfo *pi) { char pathname[MAX_PROC_NAME_SIZE + 16]; @@ -3024,13 +2780,11 @@ proc_update_threads (procinfo *pi) proc_iterate_over_threads (pi, proc_delete_dead_threads, NULL); - /* Unixware - - Note: this brute-force method is the only way I know of to - accomplish this task on Unixware. This method will also work on - Solaris 2.6 and 2.7. There is a much simpler and more elegant - way to do this on Solaris, but the margins of this manuscript are - too small to write it here... ;-) */ + /* Note: this brute-force method was originally devised for Unixware + (support removed since), and will also work on Solaris 2.6 and + 2.7. The original comment mentioned the existence of a much + simpler and more elegant way to do this on Solaris, but didn't + point out what that was. */ strcpy (pathname, pi->pathname); strcat (pathname, "/lwp"); @@ -3052,7 +2806,7 @@ proc_update_threads (procinfo *pi) #else #ifdef PIOCTLIST /* OSF version */ -int +static int proc_update_threads (procinfo *pi) { int nthreads, i; @@ -3088,7 +2842,7 @@ proc_update_threads (procinfo *pi) } #else /* Default version */ -int +static int proc_update_threads (procinfo *pi) { return 0; @@ -3110,7 +2864,7 @@ proc_update_threads (procinfo *pi) function. PTR is an opaque parameter for function. Returns the first non-zero return value from the callee, or zero. */ -int +static int proc_iterate_over_threads (procinfo *pi, int (*func) (procinfo *, procinfo *, void *), void *ptr) @@ -3312,10 +3066,10 @@ procfs_attach (struct target_ops *ops, char *args, int from_tty) } static void -procfs_detach (struct target_ops *ops, char *args, int from_tty) +procfs_detach (struct target_ops *ops, const char *args, int from_tty) { int sig = 0; - int pid = PIDGET (inferior_ptid); + int pid = ptid_get_pid (inferior_ptid); if (args) sig = atoi (args); @@ -3348,14 +3102,14 @@ do_attach (ptid_t ptid) int fail; int lwpid; - if ((pi = create_procinfo (PIDGET (ptid), 0)) == NULL) + if ((pi = create_procinfo (ptid_get_pid (ptid), 0)) == NULL) perror (_("procfs: out of memory in 'attach'")); if (!open_procinfo_files (pi, FD_CTL)) { fprintf_filtered (gdb_stderr, "procfs:%d -- ", __LINE__); sprintf (errmsg, "do_attach: couldn't open /proc file for process %d", - PIDGET (ptid)); + ptid_get_pid (ptid)); dead_procinfo (pi, errmsg, NOKILL); } @@ -3404,7 +3158,7 @@ do_attach (ptid_t ptid) create_procinfo (pi->pid, lwpid); /* Add it to gdb's thread list. */ - ptid = MERGEPID (pi->pid, lwpid); + ptid = ptid_build (pi->pid, lwpid, 0); add_thread (ptid); return ptid; @@ -3416,7 +3170,8 @@ do_detach (int signo) procinfo *pi; /* Find procinfo for the main process. */ - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); /* FIXME: threads */ + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), + 0); /* FIXME: threads */ if (signo) if (!proc_set_current_signal (pi, signo)) proc_warn (pi, "do_detach, set_current_signal", __LINE__); @@ -3474,8 +3229,8 @@ procfs_fetch_registers (struct target_ops *ops, { gdb_gregset_t *gregs; procinfo *pi; - int pid = PIDGET (inferior_ptid); - int tid = TIDGET (inferior_ptid); + int pid = ptid_get_pid (inferior_ptid); + int tid = ptid_get_lwp (inferior_ptid); struct gdbarch *gdbarch = get_regcache_arch (regcache); pi = find_procinfo_or_die (pid, tid); @@ -3523,8 +3278,8 @@ procfs_store_registers (struct target_ops *ops, { gdb_gregset_t *gregs; procinfo *pi; - int pid = PIDGET (inferior_ptid); - int tid = TIDGET (inferior_ptid); + int pid = ptid_get_pid (inferior_ptid); + int tid = ptid_get_lwp (inferior_ptid); struct gdbarch *gdbarch = get_regcache_arch (regcache); pi = find_procinfo_or_die (pid, tid); @@ -3636,7 +3391,7 @@ remove_dbx_link_breakpoint (void) if (dbx_link_bpt_addr == 0) return; - if (deprecated_remove_raw_breakpoint (target_gdbarch, dbx_link_bpt) != 0) + if (deprecated_remove_raw_breakpoint (target_gdbarch (), dbx_link_bpt) != 0) warning (_("Unable to remove __dbx_link breakpoint.")); dbx_link_bpt_addr = 0; @@ -3689,7 +3444,7 @@ insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored) long storage_needed; CORE_ADDR sym_addr; - abfd = bfd_fdopenr ("unamed", 0, fd); + abfd = gdb_bfd_fdopenr ("unamed", 0, fd); if (abfd == NULL) { warning (_("Failed to create a bfd: %s."), bfd_errmsg (bfd_get_error ())); @@ -3700,7 +3455,7 @@ insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored) { /* Not the correct format, so we can not possibly find the dbx_link symbol in it. */ - bfd_close (abfd); + gdb_bfd_unref (abfd); return 0; } @@ -3709,19 +3464,19 @@ insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored) { /* Insert the breakpoint. */ dbx_link_bpt_addr = sym_addr; - dbx_link_bpt = deprecated_insert_raw_breakpoint (target_gdbarch, NULL, + dbx_link_bpt = deprecated_insert_raw_breakpoint (target_gdbarch (), NULL, sym_addr); if (dbx_link_bpt == NULL) { warning (_("Failed to insert dbx_link breakpoint.")); - bfd_close (abfd); + gdb_bfd_unref (abfd); return 0; } - bfd_close (abfd); + gdb_bfd_unref (abfd); return 1; } - bfd_close (abfd); + gdb_bfd_unref (abfd); return 0; } @@ -3825,7 +3580,7 @@ wait_again: retval = pid_to_ptid (-1); /* Find procinfo for main process. */ - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); if (pi) { /* We must assume that the status is stale now... */ @@ -3851,10 +3606,11 @@ wait_again: /* /proc file not found; presumably child has terminated. */ wait_retval = wait (&wstat); /* "wait" for the child's exit. */ - if (wait_retval != PIDGET (inferior_ptid)) /* wrong child? */ + /* Wrong child? */ + if (wait_retval != ptid_get_pid (inferior_ptid)) error (_("procfs: couldn't stop " "process %d: wait returned %d."), - PIDGET (inferior_ptid), wait_retval); + ptid_get_pid (inferior_ptid), wait_retval); /* FIXME: might I not just use waitpid? Or try find_procinfo to see if I know about this child? */ retval = pid_to_ptid (wait_retval); @@ -3898,7 +3654,7 @@ wait_again: /* The 'pid' we will return to GDB is composed of the process ID plus the lwp ID. */ - retval = MERGEPID (pi->pid, proc_get_current_thread (pi)); + retval = ptid_build (pi->pid, proc_get_current_thread (pi), 0); switch (why) { case PR_SIGNALLED: @@ -3989,7 +3745,7 @@ wait_again: else { /* How to keep going without returning to wfi: */ - target_resume (ptid, 0, TARGET_SIGNAL_0); + target_resume (ptid, 0, GDB_SIGNAL_0); goto wait_again; } } @@ -4015,7 +3771,7 @@ wait_again: /* This is an internal event and should be transparent to wfi, so resume the execution and wait again. See comment in procfs_init_inferior() for more details. */ - target_resume (ptid, 0, TARGET_SIGNAL_0); + target_resume (ptid, 0, GDB_SIGNAL_0); goto wait_again; } #endif @@ -4034,7 +3790,7 @@ wait_again: if (!find_procinfo (pi->pid, temp_tid)) create_procinfo (pi->pid, temp_tid); - temp_ptid = MERGEPID (pi->pid, temp_tid); + temp_ptid = ptid_build (pi->pid, temp_tid, 0); /* If not in GDB's thread list, add it. */ if (!in_thread_list (temp_ptid)) add_thread (temp_ptid); @@ -4104,7 +3860,7 @@ wait_again: create_procinfo (pi->pid, temp_tid); /* If not in GDB's thread list, add it. */ - temp_ptid = MERGEPID (pi->pid, temp_tid); + temp_ptid = ptid_build (pi->pid, temp_tid, 0); if (!in_thread_list (temp_ptid)) add_thread (temp_ptid); @@ -4183,7 +3939,7 @@ wait_again: } /* Got this far without error: If retval isn't in the threads database, add it. */ - if (PIDGET (retval) > 0 && + if (ptid_get_pid (retval) > 0 && !ptid_equal (retval, inferior_ptid) && !in_thread_list (retval)) { @@ -4191,8 +3947,10 @@ wait_again: GDB's list and to our own. If we don't create a procinfo, resume may be unhappy later. */ add_thread (retval); - if (find_procinfo (PIDGET (retval), TIDGET (retval)) == NULL) - create_procinfo (PIDGET (retval), TIDGET (retval)); + if (find_procinfo (ptid_get_pid (retval), + ptid_get_lwp (retval)) == NULL) + create_procinfo (ptid_get_pid (retval), + ptid_get_lwp (retval)); } } else /* Flags do not indicate STOPPED. */ @@ -4215,10 +3973,11 @@ wait_again: /* Perform a partial transfer to/from the specified object. For memory transfers, fall back to the old memory xfer functions. */ -static LONGEST +static enum target_xfer_status procfs_xfer_partial (struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, - const gdb_byte *writebuf, ULONGEST offset, LONGEST len) + const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) { switch (object) { @@ -4229,19 +3988,20 @@ procfs_xfer_partial (struct target_ops *ops, enum target_object object, if (writebuf) return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf, len, 1/*write*/, NULL, ops); - return -1; + return TARGET_XFER_E_IO; #ifdef NEW_PROC_API case TARGET_OBJECT_AUXV: return memory_xfer_auxv (ops, object, annex, readbuf, writebuf, - offset, len); + offset, len, xfered_len); #endif default: if (ops->beneath != NULL) return ops->beneath->to_xfer_partial (ops->beneath, object, annex, - readbuf, writebuf, offset, len); - return -1; + readbuf, writebuf, offset, len, + xfered_len); + return TARGET_XFER_E_IO; } } @@ -4264,7 +4024,7 @@ procfs_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int dowrite, int nbytes = 0; /* Find procinfo for main process. */ - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); if (pi->as_fd == 0 && open_procinfo_files (pi, FD_AS) == 0) { @@ -4324,7 +4084,7 @@ invalidate_cache (procinfo *parent, procinfo *pi, void *ptr) if (!proc_set_gregs (pi)) /* flush gregs cache */ proc_warn (pi, "target_resume, set_gregs", __LINE__); - if (gdbarch_fp0_regnum (target_gdbarch) >= 0) + if (gdbarch_fp0_regnum (target_gdbarch ()) >= 0) if (pi->fpregs_dirty) if (parent == NULL || proc_get_current_thread (parent) != pi->tid) @@ -4385,7 +4145,7 @@ make_signal_thread_runnable (procinfo *process, procinfo *pi, void *ptr) static void procfs_resume (struct target_ops *ops, - ptid_t ptid, int step, enum target_signal signo) + ptid_t ptid, int step, enum gdb_signal signo) { procinfo *pi, *thread; int native_signo; @@ -4407,17 +4167,17 @@ procfs_resume (struct target_ops *ops, to proc_run_process (for use in the prrun struct by ioctl). */ /* Find procinfo for main process. */ - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); /* First cut: ignore pid argument. */ errno = 0; /* Convert signal to host numbering. */ if (signo == 0 || - (signo == TARGET_SIGNAL_STOP && pi->ignore_next_sigstop)) + (signo == GDB_SIGNAL_STOP && pi->ignore_next_sigstop)) native_signo = 0; else - native_signo = target_signal_to_host (signo); + native_signo = gdb_signal_to_host (signo); pi->ignore_next_sigstop = 0; @@ -4427,11 +4187,11 @@ procfs_resume (struct target_ops *ops, /* Void the process procinfo's caches. */ invalidate_cache (NULL, pi, NULL); - if (PIDGET (ptid) != -1) + if (ptid_get_pid (ptid) != -1) { /* Resume a specific thread, presumably suppressing the others. */ - thread = find_procinfo (PIDGET (ptid), TIDGET (ptid)); + thread = find_procinfo (ptid_get_pid (ptid), ptid_get_lwp (ptid)); if (thread != NULL) { if (thread->tid != 0) @@ -4469,14 +4229,14 @@ static void procfs_pass_signals (int numsigs, unsigned char *pass_signals) { gdb_sigset_t signals; - procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + procinfo *pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); int signo; prfillset (&signals); for (signo = 0; signo < NSIG; signo++) { - int target_signo = target_signal_from_host (signo); + int target_signo = gdb_signal_from_host (signo); if (target_signo < numsigs && pass_signals[target_signo]) gdb_prdelset (&signals, signo); } @@ -4576,7 +4336,7 @@ procfs_kill_inferior (struct target_ops *ops) if (!ptid_equal (inferior_ptid, null_ptid)) /* ? */ { /* Find procinfo for main process. */ - procinfo *pi = find_procinfo (PIDGET (inferior_ptid), 0); + procinfo *pi = find_procinfo (ptid_get_pid (inferior_ptid), 0); if (pi) unconditionally_kill_inferior (pi); @@ -4594,7 +4354,7 @@ procfs_mourn_inferior (struct target_ops *ops) if (!ptid_equal (inferior_ptid, null_ptid)) { /* Find procinfo for main process. */ - pi = find_procinfo (PIDGET (inferior_ptid), 0); + pi = find_procinfo (ptid_get_pid (inferior_ptid), 0); if (pi) destroy_procinfo (pi); } @@ -4602,7 +4362,7 @@ procfs_mourn_inferior (struct target_ops *ops) if (dbx_link_bpt != NULL) { - deprecated_remove_raw_breakpoint (target_gdbarch, dbx_link_bpt); + deprecated_remove_raw_breakpoint (target_gdbarch (), dbx_link_bpt); dbx_link_bpt_addr = 0; dbx_link_bpt = NULL; } @@ -4686,10 +4446,8 @@ procfs_init_inferior (struct target_ops *ops, int pid) this point, but it didn't have any lwp info yet. Notify the core about it. This changes inferior_ptid as well. */ thread_change_ptid (pid_to_ptid (pid), - MERGEPID (pid, lwpid)); + ptid_build (pid, lwpid, 0)); - /* Typically two, one trap to exec the shell, one to exec the - program being debugged. Defined by "inferior.h". */ startup_inferior (START_INFERIOR_TRAPS_EXPECTED); #ifdef SYS_syssgi @@ -4915,7 +4673,7 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file, } pid = fork_inferior (exec_file, allargs, env, procfs_set_exec_trap, - NULL, NULL, shell_file); + NULL, NULL, shell_file, NULL); procfs_init_inferior (ops, pid); } @@ -4939,8 +4697,8 @@ procfs_inferior_created (struct target_ops *ops, int from_tty) if (current_inferior ()->attach_flag || !target_can_run (¤t_target)) return; - proc_trace_syscalls_1 (find_procinfo_or_die (PIDGET (inferior_ptid), 0), - SYS_syssgi, PR_SYSEXIT, FLAG_RESET, 0); + proc_trace_syscalls_1 (find_procinfo_or_die (ptid_get_pid (inferior_ptid), + 0), SYS_syssgi, PR_SYSEXIT, FLAG_RESET, 0); #endif } @@ -4949,7 +4707,7 @@ procfs_inferior_created (struct target_ops *ops, int from_tty) static int procfs_notice_thread (procinfo *pi, procinfo *thread, void *ptr) { - ptid_t gdb_threadid = MERGEPID (pi->pid, thread->tid); + ptid_t gdb_threadid = ptid_build (pi->pid, thread->tid, 0); if (!in_thread_list (gdb_threadid) || is_exited (gdb_threadid)) add_thread (gdb_threadid); @@ -4960,13 +4718,13 @@ procfs_notice_thread (procinfo *pi, procinfo *thread, void *ptr) /* Query all the threads that the target knows about, and give them back to GDB to add to its list. */ -void +static void procfs_find_new_threads (struct target_ops *ops) { procinfo *pi; /* Find procinfo for main process. */ - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); proc_update_threads (pi); proc_iterate_over_threads (pi, procfs_notice_thread, NULL); } @@ -4981,8 +4739,8 @@ procfs_thread_alive (struct target_ops *ops, ptid_t ptid) int proc, thread; procinfo *pi; - proc = PIDGET (ptid); - thread = TIDGET (ptid); + proc = ptid_get_pid (ptid); + thread = ptid_get_lwp (ptid); /* If I don't know it, it ain't alive! */ if ((pi = find_procinfo (proc, thread)) == NULL) return 0; @@ -5002,32 +4760,32 @@ procfs_thread_alive (struct target_ops *ops, ptid_t ptid) /* Convert PTID to a string. Returns the string in a static buffer. */ -char * +static char * procfs_pid_to_str (struct target_ops *ops, ptid_t ptid) { static char buf[80]; - if (TIDGET (ptid) == 0) - sprintf (buf, "process %d", PIDGET (ptid)); + if (ptid_get_lwp (ptid) == 0) + sprintf (buf, "process %d", ptid_get_pid (ptid)); else - sprintf (buf, "LWP %ld", TIDGET (ptid)); + sprintf (buf, "LWP %ld", ptid_get_lwp (ptid)); return buf; } /* Insert a watchpoint. */ -int +static int procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag, int after) { -#ifndef UNIXWARE #ifndef AIX5 int pflags = 0; procinfo *pi; - pi = find_procinfo_or_die (PIDGET (ptid) == -1 ? - PIDGET (inferior_ptid) : PIDGET (ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (ptid) == -1 ? + ptid_get_pid (inferior_ptid) : ptid_get_pid (ptid), + 0); /* Translate from GDB's flags to /proc's. */ if (len > 0) /* len == 0 means delete watchpoint. */ @@ -5063,7 +4821,6 @@ procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag, proc_error (pi, "set_watchpoint", __LINE__); } #endif /* AIX5 */ -#endif /* UNIXWARE */ return 0; } @@ -5087,7 +4844,7 @@ procfs_can_use_hw_breakpoint (int type, int cnt, int othertype) procfs_address_to_host_pointer will reveal that an internal error will be generated when the host and target pointer sizes are different. */ - struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr; + struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; if (sizeof (void *) != TYPE_LENGTH (ptr_type)) return 0; @@ -5105,7 +4862,7 @@ procfs_stopped_by_watchpoint (void) { procinfo *pi; - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP)) { @@ -5135,7 +4892,7 @@ procfs_stopped_data_address (struct target_ops *targ, CORE_ADDR *addr) { procinfo *pi; - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); return proc_watchpoint_address (pi, addr); } @@ -5144,7 +4901,7 @@ procfs_insert_watchpoint (CORE_ADDR addr, int len, int type, struct expression *cond) { if (!target_have_steppable_watchpoint - && !gdbarch_have_nonsteppable_watchpoint (target_gdbarch)) + && !gdbarch_have_nonsteppable_watchpoint (target_gdbarch ())) { /* When a hardware watchpoint fires off the PC will be left at the instruction following the one which caused the @@ -5217,6 +4974,7 @@ iterate_over_mappings (procinfo *pi, find_memory_region_ftype child_func, int funcstat; int map_fd; int nmap; + struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); #ifdef NEW_PROC_API struct stat sbuf; #endif @@ -5254,8 +5012,12 @@ iterate_over_mappings (procinfo *pi, find_memory_region_ftype child_func, for (prmap = prmaps; nmap > 0; prmap++, nmap--) if ((funcstat = (*func) (prmap, child_func, data)) != 0) - return funcstat; + { + do_cleanups (cleanups); + return funcstat; + } + do_cleanups (cleanups); return 0; } @@ -5272,6 +5034,7 @@ find_memory_regions_callback (struct prmap *map, (map->pr_mflags & MA_READ) != 0, (map->pr_mflags & MA_WRITE) != 0, (map->pr_mflags & MA_EXEC) != 0, + 1, /* MODIFIED is unknown, pass it as true. */ data); } @@ -5290,7 +5053,7 @@ find_memory_regions_callback (struct prmap *map, static int proc_find_memory_regions (find_memory_region_ftype func, void *data) { - procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + procinfo *pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); return iterate_over_mappings (pi, func, data, find_memory_regions_callback); @@ -5338,7 +5101,7 @@ info_mappings_callback (struct prmap *map, find_memory_region_ftype ignore, pr_off = map->pr_off; #endif - if (gdbarch_addr_bit (target_gdbarch) == 32) + if (gdbarch_addr_bit (target_gdbarch ()) == 32) printf_filtered ("\t%#10lx %#10lx %#10lx %#10x %7s\n", (unsigned long) map->pr_vaddr, (unsigned long) map->pr_vaddr + map->pr_size - 1, @@ -5365,7 +5128,7 @@ info_proc_mappings (procinfo *pi, int summary) return; /* No output for summary mode. */ printf_filtered (_("Mapped address spaces:\n\n")); - if (gdbarch_ptr_bit (target_gdbarch) == 32) + if (gdbarch_ptr_bit (target_gdbarch ()) == 32) printf_filtered ("\t%10s %10s %10s %10s %7s\n", "Start Addr", " End Addr", @@ -5387,7 +5150,8 @@ info_proc_mappings (procinfo *pi, int summary) /* Implement the "info proc" command. */ static void -info_proc_cmd (char *args, int from_tty) +procfs_info_proc (struct target_ops *ops, char *args, + enum info_proc_what what) { struct cleanup *old_chain; procinfo *process = NULL; @@ -5398,6 +5162,20 @@ info_proc_cmd (char *args, int from_tty) int tid = 0; int mappings = 0; + switch (what) + { + case IP_MINIMAL: + break; + + case IP_MAPPINGS: + case IP_ALL: + mappings = 1; + break; + + default: + error (_("Not supported on this target.")); + } + old_chain = make_cleanup (null_cleanup, 0); if (args) { @@ -5416,18 +5194,10 @@ info_proc_cmd (char *args, int from_tty) { tid = strtoul (argv[0] + 1, NULL, 10); } - else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0) - { - mappings = 1; - } - else - { - /* [...] */ - } argv++; } if (pid == 0) - pid = PIDGET (inferior_ptid); + pid = ptid_get_pid (inferior_ptid); if (pid == 0) error (_("No current process: you must name one.")); else @@ -5519,13 +5289,13 @@ proc_trace_syscalls (char *args, int from_tty, int entry_or_exit, int mode) { procinfo *pi; - if (PIDGET (inferior_ptid) <= 0) + if (ptid_get_pid (inferior_ptid) <= 0) error (_("you must be debugging a process to use this command.")); if (args == NULL || args[0] == 0) error_no_arg (_("system call to trace")); - pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); if (isdigit (args[0])) { const int syscallnum = atoi (args); @@ -5559,15 +5329,14 @@ proc_untrace_sysexit_cmd (char *args, int from_tty) } +/* Provide a prototype to silence -Wmissing-prototypes. */ +extern void _initialize_procfs (void); + void _initialize_procfs (void) { observer_attach_inferior_created (procfs_inferior_created); - add_info ("proc", info_proc_cmd, _("\ -Show /proc process information about any running process.\n\ -Specify process id, or use the program being debugged by default.\n\ -Specify keyword 'mappings' for detailed info on memory mappings.")); add_com ("proc-trace-entry", no_class, proc_trace_sysentry_cmd, _("Give a trace of entries into the syscall.")); add_com ("proc-trace-exit", no_class, proc_trace_sysexit_cmd, @@ -5597,13 +5366,13 @@ procfs_first_available (void) } /* =================== GCORE .NOTE "MODULE" =================== */ -#if defined (UNIXWARE) || defined (PIOCOPENLWP) || defined (PCAGENT) -/* gcore only implemented on solaris and unixware (so far) */ +#if defined (PIOCOPENLWP) || defined (PCAGENT) +/* gcore only implemented on solaris (so far) */ static char * procfs_do_thread_registers (bfd *obfd, ptid_t ptid, char *note_data, int *note_size, - enum target_signal stop_signal) + enum gdb_signal stop_signal) { struct regcache *regcache = get_thread_regcache (ptid); gdb_gregset_t gregs; @@ -5611,7 +5380,7 @@ procfs_do_thread_registers (bfd *obfd, ptid_t ptid, unsigned long merged_pid; struct cleanup *old_chain; - merged_pid = TIDGET (ptid) << 16 | PIDGET (ptid); + merged_pid = ptid_get_lwp (ptid) << 16 | ptid_get_pid (ptid); /* This part is the old method for fetching registers. It should be replaced by the newer one using regsets @@ -5654,7 +5423,7 @@ struct procfs_corefile_thread_data { bfd *obfd; char *note_data; int *note_size; - enum target_signal stop_signal; + enum gdb_signal stop_signal; }; static int @@ -5664,7 +5433,7 @@ procfs_corefile_thread_callback (procinfo *pi, procinfo *thread, void *data) if (pi != NULL) { - ptid_t ptid = MERGEPID (pi->pid, thread->tid); + ptid_t ptid = ptid_build (pi->pid, thread->tid, 0); args->note_data = procfs_do_thread_registers (args->obfd, ptid, args->note_data, @@ -5677,14 +5446,14 @@ procfs_corefile_thread_callback (procinfo *pi, procinfo *thread, void *data) static int find_signalled_thread (struct thread_info *info, void *data) { - if (info->suspend.stop_signal != TARGET_SIGNAL_0 + if (info->suspend.stop_signal != GDB_SIGNAL_0 && ptid_get_pid (info->ptid) == ptid_get_pid (inferior_ptid)) return 1; return 0; } -static enum target_signal +static enum gdb_signal find_stop_signal (void) { struct thread_info *info = @@ -5693,7 +5462,7 @@ find_stop_signal (void) if (info) return info->suspend.stop_signal; else - return TARGET_SIGNAL_0; + return GDB_SIGNAL_0; } static char * @@ -5704,19 +5473,20 @@ procfs_make_note_section (bfd *obfd, int *note_size) gdb_fpregset_t fpregs; char fname[16] = {'\0'}; char psargs[80] = {'\0'}; - procinfo *pi = find_procinfo_or_die (PIDGET (inferior_ptid), 0); + procinfo *pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0); char *note_data = NULL; char *inf_args; struct procfs_corefile_thread_data thread_args; gdb_byte *auxv; int auxv_len; - enum target_signal stop_signal; + enum gdb_signal stop_signal; if (get_exec_file (0)) { strncpy (fname, lbasename (get_exec_file (0)), sizeof (fname)); - strncpy (psargs, get_exec_file (0), - sizeof (psargs)); + fname[sizeof (fname) - 1] = 0; + strncpy (psargs, get_exec_file (0), sizeof (psargs)); + psargs[sizeof (psargs) - 1] = 0; inf_args = get_inferior_args (); if (inf_args && *inf_args && @@ -5737,10 +5507,10 @@ procfs_make_note_section (bfd *obfd, int *note_size) stop_signal = find_stop_signal (); -#ifdef UNIXWARE +#ifdef NEW_PROC_API fill_gregset (get_current_regcache (), &gregs, -1); note_data = elfcore_write_pstatus (obfd, note_data, note_size, - PIDGET (inferior_ptid), + ptid_get_pid (inferior_ptid), stop_signal, &gregs); #endif @@ -5750,9 +5520,6 @@ procfs_make_note_section (bfd *obfd, int *note_size) thread_args.stop_signal = stop_signal; proc_iterate_over_threads (pi, procfs_corefile_thread_callback, &thread_args); - - /* There should be always at least one thread. */ - gdb_assert (thread_args.note_data != note_data); note_data = thread_args.note_data; auxv_len = target_read_alloc (¤t_target, TARGET_OBJECT_AUXV, @@ -5767,12 +5534,12 @@ procfs_make_note_section (bfd *obfd, int *note_size) make_cleanup (xfree, note_data); return note_data; } -#else /* !(Solaris or Unixware) */ +#else /* !Solaris */ static char * procfs_make_note_section (bfd *obfd, int *note_size) { error (_("gcore not implemented for this host.")); return NULL; /* lint */ } -#endif /* Solaris or Unixware */ +#endif /* Solaris */ /* =================== END GCORE .NOTE "MODULE" =================== */