X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fprocfs.c;h=15a0409f3191b054c212cc867b8bc4881a96f02a;hb=8527d542c07f6bea86fe5baf3b31568c7fba1398;hp=1c5cc13b80b11d911947b6a044f2892dabe2a7d3;hpb=3e3420f6a11ef07df4bd3d2be38481870f2834cf;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/procfs.c b/gdb/procfs.c index 1c5cc13..15a0409 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -1,6 +1,6 @@ /* Machine independent support for SVR4 /proc (process file system) for GDB. - Copyright (C) 1999-2003, 2006-2012 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. @@ -22,6 +22,7 @@ #include "defs.h" #include "inferior.h" +#include "infrun.h" #include "target.h" #include "gdbcore.h" #include "elf-bfd.h" /* for elfcore_write_* */ @@ -41,13 +42,10 @@ #ifdef HAVE_SYS_SYSCALL_H #include #endif -#include #include "gdb_wait.h" #include #include #include "gdb_bfd.h" -#include "gdb_string.h" -#include "gdb_assert.h" #include "inflow.h" #include "auxv.h" #include "procfs.h" @@ -89,12 +87,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. @@ -109,45 +107,45 @@ /* 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_attach (struct target_ops *, const char *, int); +static void procfs_detach (struct target_ops *, const char *, int); static void procfs_resume (struct target_ops *, ptid_t, int, enum gdb_signal); -static void procfs_stop (ptid_t); +static void procfs_stop (struct target_ops *self, ptid_t); static void procfs_files_info (struct target_ops *); static void procfs_fetch_registers (struct target_ops *, struct regcache *, int); static void procfs_store_registers (struct target_ops *, struct regcache *, int); -static void procfs_pass_signals (int, unsigned char *); +static void procfs_pass_signals (struct target_ops *self, + int, unsigned char *); static void procfs_kill_inferior (struct target_ops *ops); static void procfs_mourn_inferior (struct target_ops *ops); static void procfs_create_inferior (struct target_ops *, char *, char *, char **, int); static ptid_t procfs_wait (struct target_ops *, ptid_t, struct target_waitstatus *, int); -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 enum target_xfer_status procfs_xfer_memory (gdb_byte *, + const gdb_byte *, + ULONGEST, ULONGEST, + ULONGEST *); +static target_xfer_partial_ftype procfs_xfer_partial; static int procfs_thread_alive (struct target_ops *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 (find_memory_region_ftype, void *); +static int proc_find_memory_regions (struct target_ops *self, + find_memory_region_ftype, void *); -static char * procfs_make_note_section (bfd *, int *); +static char * procfs_make_note_section (struct target_ops *self, + bfd *, int *); -static int procfs_can_use_hw_breakpoint (int, int, int); +static int procfs_can_use_hw_breakpoint (struct target_ops *self, + int, int, int); -static void procfs_info_proc (struct target_ops *, char *, +static void procfs_info_proc (struct target_ops *, const char *, enum info_proc_what); #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) @@ -184,10 +182,6 @@ procfs_target (void) { struct target_ops *t = inf_child_target (); - t->to_shortname = "procfs"; - t->to_longname = "Unix /proc child process"; - t->to_doc = - "Unix /proc child process (started by the \"run\" command)."; t->to_create_inferior = procfs_create_inferior; t->to_kill = procfs_kill_inferior; t->to_mourn_inferior = procfs_mourn_inferior; @@ -198,7 +192,6 @@ procfs_target (void) t->to_fetch_registers = procfs_fetch_registers; t->to_store_registers = procfs_store_registers; t->to_xfer_partial = procfs_xfer_partial; - t->deprecated_xfer_memory = procfs_xfer_memory; t->to_pass_signals = procfs_pass_signals; t->to_files_info = procfs_files_info; t->to_stop = procfs_stop; @@ -2569,17 +2562,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. */ @@ -2909,13 +2902,6 @@ static void do_detach (int signo); static void proc_trace_syscalls_1 (procinfo *pi, int syscallnum, int entry_or_exit, int mode, int from_tty); -/* On mips-irix, we need to insert a breakpoint at __dbx_link during - the startup phase. The following two variables are used to record - the address of the breakpoint, and the code that was replaced by - a breakpoint. */ -static int dbx_link_bpt_addr = 0; -static void *dbx_link_bpt; - /* Sets up the inferior to be debugged. Registers to trace signals, hardware faults, and syscalls. Note: does not set RLC flag: caller may want to customize that. Returns zero for success (note! @@ -3043,7 +3029,7 @@ procfs_debug_inferior (procinfo *pi) } static void -procfs_attach (struct target_ops *ops, char *args, int from_tty) +procfs_attach (struct target_ops *ops, const char *args, int from_tty) { char *exec_file; int pid; @@ -3067,14 +3053,15 @@ procfs_attach (struct target_ops *ops, char *args, int from_tty) fflush (stdout); } inferior_ptid = do_attach (pid_to_ptid (pid)); - push_target (ops); + if (!target_is_pushed (ops)) + push_target (ops); } 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); @@ -3096,7 +3083,7 @@ procfs_detach (struct target_ops *ops, char *args, int from_tty) inferior_ptid = null_ptid; detach_inferior (pid); - unpush_target (ops); + inf_child_maybe_unpush_target (ops); } static ptid_t @@ -3107,14 +3094,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); } @@ -3163,7 +3150,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; @@ -3175,7 +3162,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__); @@ -3233,8 +3221,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); @@ -3282,8 +3270,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); @@ -3385,23 +3373,6 @@ syscall_is_lwp_create (procinfo *pi, int scall) return 0; } -/* Remove the breakpoint that we inserted in __dbx_link(). - Does nothing if the breakpoint hasn't been inserted or has already - been removed. */ - -static void -remove_dbx_link_breakpoint (void) -{ - if (dbx_link_bpt_addr == 0) - return; - - if (deprecated_remove_raw_breakpoint (target_gdbarch (), dbx_link_bpt) != 0) - warning (_("Unable to remove __dbx_link breakpoint.")); - - dbx_link_bpt_addr = 0; - dbx_link_bpt = NULL; -} - #ifdef SYS_syssgi /* Return the address of the __dbx_link() function in the file refernced by ABFD by scanning its symbol table. Return 0 if @@ -3466,10 +3437,12 @@ insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored) sym_addr = dbx_link_addr (abfd); if (sym_addr != 0) { + struct breakpoint *dbx_link_bpt; + /* Insert the breakpoint. */ - dbx_link_bpt_addr = sym_addr; - dbx_link_bpt = deprecated_insert_raw_breakpoint (target_gdbarch (), NULL, - sym_addr); + dbx_link_bpt + = create_and_insert_solib_event_breakpoint (target_gdbarch (), + sym_addr); if (dbx_link_bpt == NULL) { warning (_("Failed to insert dbx_link breakpoint.")); @@ -3584,7 +3557,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... */ @@ -3610,10 +3583,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); @@ -3657,7 +3631,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: @@ -3793,7 +3767,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); @@ -3863,7 +3837,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); @@ -3898,14 +3872,6 @@ wait_again: #if (FLTTRACE != FLTBPT) /* Avoid "duplicate case" error. */ case FLTTRACE: #endif - /* If we hit our __dbx_link() internal breakpoint, - then remove it. See comments in procfs_init_inferior() - for more details. */ - if (dbx_link_bpt_addr != 0 - && dbx_link_bpt_addr - == regcache_read_pc (get_current_regcache ())) - remove_dbx_link_breakpoint (); - wstat = (SIGTRAP << 8) | 0177; break; case FLTSTACK: @@ -3942,7 +3908,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)) { @@ -3950,8 +3916,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. */ @@ -3974,85 +3942,66 @@ 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) { case TARGET_OBJECT_MEMORY: - if (readbuf) - return (*ops->deprecated_xfer_memory) (offset, readbuf, - len, 0/*read*/, NULL, ops); - if (writebuf) - return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf, - len, 1/*write*/, NULL, ops); - return -1; + return procfs_xfer_memory (readbuf, writebuf, offset, len, xfered_len); #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; + return ops->beneath->to_xfer_partial (ops->beneath, object, annex, + readbuf, writebuf, offset, len, + xfered_len); } } +/* Helper for procfs_xfer_partial that handles memory transfers. + Arguments are like target_xfer_partial. */ -/* Transfer LEN bytes between GDB address MYADDR and target address - MEMADDR. If DOWRITE is non-zero, transfer them to the target, - otherwise transfer them from the target. TARGET is unused. - - The return value is 0 if an error occurred or no bytes were - transferred. Otherwise, it will be a positive value which - indicates the number of bytes transferred between gdb and the - target. (Note that the interface also makes provisions for - negative values, but this capability isn't implemented here.) */ - -static int -procfs_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int dowrite, - struct mem_attrib *attrib, struct target_ops *target) +static enum target_xfer_status +procfs_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len) { procinfo *pi; - int nbytes = 0; + int nbytes; /* 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) { proc_warn (pi, "xfer_memory, open_proc_files", __LINE__); - return 0; + return TARGET_XFER_E_IO; } - if (lseek (pi->as_fd, (off_t) memaddr, SEEK_SET) == (off_t) memaddr) + if (lseek (pi->as_fd, (off_t) memaddr, SEEK_SET) != (off_t) memaddr) + return TARGET_XFER_E_IO; + + if (writebuf != NULL) { - if (dowrite) - { -#ifdef NEW_PROC_API - PROCFS_NOTE ("write memory:\n"); -#else - PROCFS_NOTE ("write memory:\n"); -#endif - nbytes = write (pi->as_fd, myaddr, len); - } - else - { - PROCFS_NOTE ("read memory:\n"); - nbytes = read (pi->as_fd, myaddr, len); - } - if (nbytes < 0) - { - nbytes = 0; - } + PROCFS_NOTE ("write memory:\n"); + nbytes = write (pi->as_fd, writebuf, len); } - return nbytes; + else + { + PROCFS_NOTE ("read memory:\n"); + nbytes = read (pi->as_fd, readbuf, len); + } + if (nbytes <= 0) + return TARGET_XFER_E_IO; + *xfered_len = nbytes; + return TARGET_XFER_OK; } /* Called by target_resume before making child runnable. Mark cached @@ -4166,7 +4115,7 @@ 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; @@ -4186,11 +4135,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) @@ -4225,10 +4174,11 @@ procfs_resume (struct target_ops *ops, /* Set up to trace signals in the child process. */ static void -procfs_pass_signals (int numsigs, unsigned char *pass_signals) +procfs_pass_signals (struct target_ops *self, + 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); @@ -4261,7 +4211,7 @@ procfs_files_info (struct target_ops *ignore) kill(SIGINT) to the child's process group. */ static void -procfs_stop (ptid_t ptid) +procfs_stop (struct target_ops *self, ptid_t ptid) { kill (-inferior_process_group (), SIGINT); } @@ -4335,7 +4285,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); @@ -4353,20 +4303,14 @@ 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); } - unpush_target (ops); - - if (dbx_link_bpt != NULL) - { - deprecated_remove_raw_breakpoint (target_gdbarch (), dbx_link_bpt); - dbx_link_bpt_addr = 0; - dbx_link_bpt = NULL; - } generic_mourn_inferior (); + + inf_child_maybe_unpush_target (ops); } /* When GDB forks to create a runnable inferior process, this function @@ -4384,7 +4328,8 @@ procfs_init_inferior (struct target_ops *ops, int pid) /* This routine called on the parent side (GDB side) after GDB forks the inferior. */ - push_target (ops); + if (!target_is_pushed (ops)) + push_target (ops); if ((pi = create_procinfo (pid, 0)) == NULL) perror (_("procfs: out of memory in 'init_inferior'")); @@ -4445,10 +4390,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 @@ -4698,8 +4641,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 } @@ -4708,7 +4651,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); @@ -4725,7 +4668,7 @@ 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); } @@ -4740,8 +4683,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; @@ -4766,10 +4709,10 @@ 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; } @@ -4784,8 +4727,9 @@ procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag, 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. */ @@ -4834,7 +4778,8 @@ procfs_set_watchpoint (ptid_t ptid, CORE_ADDR addr, int len, int rwflag, target_can_use_hardware_watchpoint. */ static int -procfs_can_use_hw_breakpoint (int type, int cnt, int othertype) +procfs_can_use_hw_breakpoint (struct target_ops *self, + int type, int cnt, int othertype) { /* Due to the way that proc_set_watchpoint() is implemented, host and target pointers must be of the same size. If they are not, @@ -4858,11 +4803,11 @@ procfs_can_use_hw_breakpoint (int type, int cnt, int othertype) fault, else returns zero. */ static int -procfs_stopped_by_watchpoint (void) +procfs_stopped_by_watchpoint (struct target_ops *ops) { 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)) { @@ -4892,12 +4837,13 @@ 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); } static int -procfs_insert_watchpoint (CORE_ADDR addr, int len, int type, +procfs_insert_watchpoint (struct target_ops *self, + CORE_ADDR addr, int len, int type, struct expression *cond) { if (!target_have_steppable_watchpoint @@ -4919,14 +4865,16 @@ procfs_insert_watchpoint (CORE_ADDR addr, int len, int type, } static int -procfs_remove_watchpoint (CORE_ADDR addr, int len, int type, +procfs_remove_watchpoint (struct target_ops *self, + CORE_ADDR addr, int len, int type, struct expression *cond) { return procfs_set_watchpoint (inferior_ptid, addr, 0, 0, 0); } static int -procfs_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len) +procfs_region_ok_for_hw_watchpoint (struct target_ops *self, + CORE_ADDR addr, int len) { /* The man page for proc(4) on Solaris 2.6 and up says that the system can support "thousands" of hardware watchpoints, but gives @@ -5051,9 +4999,10 @@ find_memory_regions_callback (struct prmap *map, the callback. */ static int -proc_find_memory_regions (find_memory_region_ftype func, void *data) +proc_find_memory_regions (struct target_ops *self, + 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); @@ -5150,7 +5099,7 @@ info_proc_mappings (procinfo *pi, int summary) /* Implement the "info proc" command. */ static void -procfs_info_proc (struct target_ops *ops, char *args, +procfs_info_proc (struct target_ops *ops, const char *args, enum info_proc_what what) { struct cleanup *old_chain; @@ -5197,7 +5146,7 @@ procfs_info_proc (struct target_ops *ops, char *args, 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 @@ -5289,13 +5238,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); @@ -5380,12 +5329,12 @@ 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 once it is implemented in this platform: - gdbarch_regset_from_core_section() and regset->collect_regset(). */ + gdbarch_iterate_over_regset_sections(). */ old_chain = save_inferior_ptid (); inferior_ptid = ptid; @@ -5433,7 +5382,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, @@ -5466,14 +5415,14 @@ find_stop_signal (void) } static char * -procfs_make_note_section (bfd *obfd, int *note_size) +procfs_make_note_section (struct target_ops *self, bfd *obfd, int *note_size) { struct cleanup *old_chain; gdb_gregset_t gregs; 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; @@ -5510,7 +5459,7 @@ procfs_make_note_section (bfd *obfd, int *note_size) #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 @@ -5520,9 +5469,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, @@ -5534,12 +5480,11 @@ procfs_make_note_section (bfd *obfd, int *note_size) xfree (auxv); } - make_cleanup (xfree, note_data); return note_data; } #else /* !Solaris */ static char * -procfs_make_note_section (bfd *obfd, int *note_size) +procfs_make_note_section (struct target_ops *self, bfd *obfd, int *note_size) { error (_("gcore not implemented for this host.")); return NULL; /* lint */