X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flinux-nat.c;h=73ef2d49473e9d1761e8391bd7acfeeb1a15cc02;hb=a379284af268ed768674e7f452ca78dad2aaaf55;hp=5d5efa0af45fa8c36b143d6cc8b812f06c64e568;hpb=ced2dffbf17bc661e959da1e39411d706ade9f77;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 5d5efa0af4..73ef2d4947 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1,6 +1,6 @@ /* GNU/Linux native-dependent code common to multiple platforms. - Copyright (C) 2001-2016 Free Software Foundation, Inc. + Copyright (C) 2001-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -355,6 +355,14 @@ lwp_stop_reason (struct lwp_info *lwp) return lwp->stop_reason; } +/* See nat/linux-nat.h. */ + +int +lwp_is_stepping (struct lwp_info *lwp) +{ + return lwp->step; +} + /* Trivial list manipulation functions to keep track of a list of new stopped processes. */ @@ -1245,7 +1253,7 @@ linux_nat_attach (struct target_ops *ops, const char *args, int from_tty) int exit_code = WEXITSTATUS (status); target_terminal_ours (); - target_mourn_inferior (); + target_mourn_inferior (inferior_ptid); if (exit_code == 0) error (_("Unable to attach: program exited normally.")); else @@ -1257,7 +1265,7 @@ linux_nat_attach (struct target_ops *ops, const char *args, int from_tty) enum gdb_signal signo; target_terminal_ours (); - target_mourn_inferior (); + target_mourn_inferior (inferior_ptid); signo = gdb_signal_from_host (WTERMSIG (status)); error (_("Unable to attach: program terminated with signal " @@ -3776,7 +3784,7 @@ linux_nat_kill (struct target_ops *ops) iterate_over_lwps (ptid, kill_wait_callback, NULL); } - target_mourn_inferior (); + target_mourn_inferior (inferior_ptid); } static void @@ -3970,10 +3978,9 @@ linux_child_pid_to_exec_file (struct target_ops *self, int pid) return linux_proc_pid_to_exec_file (pid); } -/* Implement the to_xfer_partial interface for memory reads using the /proc - filesystem. Because we can use a single read() call for /proc, this - can be much more efficient than banging away at PTRACE_PEEKTEXT, - but it doesn't support writes. */ +/* Implement the to_xfer_partial target method using /proc//mem. + Because we can use a single read/write call, this can be much more + efficient than banging away at PTRACE_PEEKTEXT. */ static enum target_xfer_status linux_proc_xfer_partial (struct target_ops *ops, enum target_object object, @@ -3985,7 +3992,7 @@ linux_proc_xfer_partial (struct target_ops *ops, enum target_object object, int fd; char filename[64]; - if (object != TARGET_OBJECT_MEMORY || !readbuf) + if (object != TARGET_OBJECT_MEMORY) return TARGET_XFER_EOF; /* Don't bother for one word. */ @@ -3996,26 +4003,27 @@ linux_proc_xfer_partial (struct target_ops *ops, enum target_object object, thread. That requires some juggling, but is even faster. */ xsnprintf (filename, sizeof filename, "/proc/%d/mem", ptid_get_pid (inferior_ptid)); - fd = gdb_open_cloexec (filename, O_RDONLY | O_LARGEFILE, 0); + fd = gdb_open_cloexec (filename, ((readbuf ? O_RDONLY : O_WRONLY) + | O_LARGEFILE), 0); if (fd == -1) return TARGET_XFER_EOF; - /* If pread64 is available, use it. It's faster if the kernel - supports it (only one syscall), and it's 64-bit safe even on - 32-bit platforms (for instance, SPARC debugging a SPARC64 - application). */ + /* Use pread64/pwrite64 if available, since they save a syscall and can + handle 64-bit offsets even on 32-bit platforms (for instance, SPARC + debugging a SPARC64 application). */ #ifdef HAVE_PREAD64 - if (pread64 (fd, readbuf, len, offset) != len) + ret = (readbuf ? pread64 (fd, readbuf, len, offset) + : pwrite64 (fd, writebuf, len, offset)); #else - if (lseek (fd, offset, SEEK_SET) == -1 || read (fd, readbuf, len) != len) + ret = lseek (fd, offset, SEEK_SET); + if (ret != -1) + ret = (readbuf ? read (fd, readbuf, len) + : write (fd, writebuf, len)); #endif - ret = 0; - else - ret = len; close (fd); - if (ret == 0) + if (ret == -1 || ret == 0) return TARGET_XFER_EOF; else { @@ -4289,7 +4297,7 @@ cleanup_target_stop (void *arg) gdb_assert (arg != NULL); /* Unpause all */ - target_resume (*ptid, 0, GDB_SIGNAL_0); + target_continue_no_signal (*ptid); } static VEC(static_tracepoint_marker_p) * @@ -4409,9 +4417,8 @@ linux_nat_is_async_p (struct target_ops *ops) static int linux_nat_can_async_p (struct target_ops *ops) { - /* NOTE: palves 2008-03-21: We're only async when the user requests - it explicitly with the "set target-async" command. - Someday, linux will always be async. */ + /* We're always async, unless the user explicitly prevented it with the + "maint set target-async" command. */ return target_async_permitted; }