Index: gdb/gnu-nat.c |
diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c |
index 0c45f2026d1a85f9d8eb943318fba55159b78f3d..329d090b315ee685c55124d763915de29da4f395 100644 |
--- a/gdb/gnu-nat.c |
+++ b/gdb/gnu-nat.c |
@@ -1,6 +1,5 @@ |
/* Interface GDB to the GNU Hurd. |
- Copyright (C) 1992, 1995-2001, 2006-2012 Free Software Foundation, |
- Inc. |
+ Copyright (C) 1992-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -19,8 +18,9 @@ |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
- along with this program. If not, see <http://www.gnu.org/licenses/>. |
- */ |
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
+ |
+#include "defs.h" |
#include <ctype.h> |
#include <errno.h> |
@@ -28,7 +28,7 @@ |
#include <setjmp.h> |
#include <signal.h> |
#include <stdio.h> |
-#include "gdb_string.h" |
+#include <string.h> |
#include <sys/ptrace.h> |
#include <mach.h> |
@@ -52,7 +52,6 @@ |
#include <portinfo.h> |
-#include "defs.h" |
#include "inferior.h" |
#include "symtab.h" |
#include "value.h" |
@@ -1084,7 +1083,7 @@ inf_validate_procs (struct inf *inf) |
last = thread; |
proc_debug (thread, "new thread: %d", threads[i]); |
- ptid = ptid_build (inf->pid, 0, thread->tid); |
+ ptid = ptid_build (inf->pid, thread->tid, 0); |
/* Tell GDB's generic thread code. */ |
@@ -1614,17 +1613,17 @@ rewait: |
thread = inf->wait.thread; |
if (thread) |
- ptid = ptid_build (inf->pid, 0, thread->tid); |
+ ptid = ptid_build (inf->pid, thread->tid, 0); |
else if (ptid_equal (ptid, minus_one_ptid)) |
thread = inf_tid_to_thread (inf, -1); |
else |
- thread = inf_tid_to_thread (inf, ptid_get_tid (ptid)); |
+ thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid)); |
if (!thread || thread->port == MACH_PORT_NULL) |
{ |
/* TID is dead; try and find a new thread. */ |
if (inf_update_procs (inf) && inf->threads) |
- ptid = ptid_build (inf->pid, 0, inf->threads->tid); /* The first |
+ ptid = ptid_build (inf->pid, inf->threads->tid, 0); /* The first |
available |
thread. */ |
else |
@@ -2016,14 +2015,15 @@ gnu_resume (struct target_ops *ops, |
if (resume_all) |
/* Allow all threads to run, except perhaps single-stepping one. */ |
{ |
- inf_debug (inf, "running all threads; tid = %d", PIDGET (inferior_ptid)); |
+ inf_debug (inf, "running all threads; tid = %d", |
+ ptid_get_pid (inferior_ptid)); |
ptid = inferior_ptid; /* What to step. */ |
inf_set_threads_resume_sc (inf, 0, 1); |
} |
else |
/* Just allow a single thread to run. */ |
{ |
- struct proc *thread = inf_tid_to_thread (inf, ptid_get_tid (ptid)); |
+ struct proc *thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid)); |
if (!thread) |
error (_("Can't run single thread id %s: no such thread!"), |
@@ -2034,7 +2034,7 @@ gnu_resume (struct target_ops *ops, |
if (step) |
{ |
- step_thread = inf_tid_to_thread (inf, ptid_get_tid (ptid)); |
+ step_thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid)); |
if (!step_thread) |
warning (_("Can't step thread id %s: no such thread."), |
target_pid_to_str (ptid)); |
@@ -2134,7 +2134,7 @@ gnu_create_inferior (struct target_ops *ops, |
/* We now have thread info. */ |
thread_change_ptid (inferior_ptid, |
- ptid_build (inf->pid, 0, inf_pick_first_thread ())); |
+ ptid_build (inf->pid, inf_pick_first_thread (), 0)); |
startup_inferior (inf->pending_execs); |
@@ -2191,7 +2191,7 @@ gnu_attach (struct target_ops *ops, char *args, int from_tty) |
inf_update_procs (inf); |
- inferior_ptid = ptid_build (pid, 0, inf_pick_first_thread ()); |
+ inferior_ptid = ptid_build (pid, inf_pick_first_thread (), 0); |
/* We have to initialize the terminal settings now, since the code |
below might try to restore them. */ |
@@ -2218,7 +2218,7 @@ gnu_attach (struct target_ops *ops, char *args, int from_tty) |
previously attached. It *might* work if the program was |
started via fork. */ |
static void |
-gnu_detach (struct target_ops *ops, char *args, int from_tty) |
+gnu_detach (struct target_ops *ops, const char *args, int from_tty) |
{ |
int pid; |
@@ -2262,15 +2262,15 @@ gnu_thread_alive (struct target_ops *ops, ptid_t ptid) |
{ |
inf_update_procs (gnu_current_inf); |
return !!inf_tid_to_thread (gnu_current_inf, |
- ptid_get_tid (ptid)); |
+ ptid_get_lwp (ptid)); |
} |
/* Read inferior task's LEN bytes from ADDR and copy it to MYADDR in |
gdb's address space. Return 0 on failure; number of bytes read |
otherwise. */ |
-int |
-gnu_read_inferior (task_t task, CORE_ADDR addr, char *myaddr, int length) |
+static int |
+gnu_read_inferior (task_t task, CORE_ADDR addr, gdb_byte *myaddr, int length) |
{ |
error_t err; |
vm_address_t low_address = (vm_address_t) trunc_page (addr); |
@@ -2315,8 +2315,9 @@ struct obstack region_obstack; |
/* Write gdb's LEN bytes from MYADDR and copy it to ADDR in inferior |
task's address space. */ |
-int |
-gnu_write_inferior (task_t task, CORE_ADDR addr, char *myaddr, int length) |
+static int |
+gnu_write_inferior (task_t task, CORE_ADDR addr, |
+ const gdb_byte *myaddr, int length) |
{ |
error_t err = 0; |
vm_address_t low_address = (vm_address_t) trunc_page (addr); |
@@ -2472,30 +2473,55 @@ out: |
} |
-/* Return 0 on failure, number of bytes handled otherwise. TARGET |
- is ignored. */ |
-static int |
-gnu_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, |
- struct mem_attrib *attrib, |
- struct target_ops *target) |
+ |
+/* Helper for gnu_xfer_partial that handles memory transfers. */ |
+ |
+static LONGEST |
+gnu_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, |
+ CORE_ADDR memaddr, LONGEST len) |
{ |
task_t task = (gnu_current_inf |
? (gnu_current_inf->task |
? gnu_current_inf->task->port : 0) |
: 0); |
+ int res; |
if (task == MACH_PORT_NULL) |
- return 0; |
+ return TARGET_XFER_E_IO; |
+ |
+ if (writebuf != NULL) |
+ { |
+ inf_debug (gnu_current_inf, "writing %s[%s] <-- %s", |
+ paddress (target_gdbarch (), memaddr), plongest (len), |
+ host_address_to_string (writebuf)); |
+ res = gnu_write_inferior (task, memaddr, writebuf, len); |
+ } |
else |
{ |
- inf_debug (gnu_current_inf, "%s %s[%d] %s %s", |
- write ? "writing" : "reading", |
- paddress (target_gdbarch, memaddr), len, |
- write ? "<--" : "-->", host_address_to_string (myaddr)); |
- if (write) |
- return gnu_write_inferior (task, memaddr, myaddr, len); |
- else |
- return gnu_read_inferior (task, memaddr, myaddr, len); |
+ inf_debug (gnu_current_inf, "reading %s[%s] --> %s", |
+ paddress (target_gdbarch (), memaddr), plongest (len), |
+ host_address_to_string (readbuf)); |
+ res = gnu_read_inferior (task, memaddr, readbuf, len); |
+ } |
+ if (res == 0) |
+ return TARGET_XFER_E_IO; |
+ return res; |
+} |
+ |
+/* Target to_xfer_partial implementation. */ |
+ |
+static LONGEST |
+gnu_xfer_partial (struct target_ops *ops, enum target_object object, |
+ const char *annex, gdb_byte *readbuf, |
+ const gdb_byte *writebuf, ULONGEST offset, LONGEST len) |
+{ |
+ switch (object) |
+ { |
+ case TARGET_OBJECT_MEMORY: |
+ return gnu_xfer_memory (readbuf, writebuf, offset, len); |
+ |
+ default: |
+ return -1; |
} |
} |
@@ -2558,6 +2584,7 @@ gnu_find_memory_regions (find_memory_region_ftype func, void *data) |
last_protection & VM_PROT_READ, |
last_protection & VM_PROT_WRITE, |
last_protection & VM_PROT_EXECUTE, |
+ 1, /* MODIFIED is unknown, pass it as true. */ |
data); |
last_region_address = region_address; |
last_region_end = region_address += region_length; |
@@ -2571,6 +2598,7 @@ gnu_find_memory_regions (find_memory_region_ftype func, void *data) |
last_protection & VM_PROT_READ, |
last_protection & VM_PROT_WRITE, |
last_protection & VM_PROT_EXECUTE, |
+ 1, /* MODIFIED is unknown, pass it as true. */ |
data); |
return 0; |
@@ -2584,10 +2612,10 @@ proc_string (struct proc *proc) |
static char tid_str[80]; |
if (proc_is_task (proc)) |
- sprintf (tid_str, "process %d", proc->inf->pid); |
+ xsnprintf (tid_str, sizeof (tid_str), "process %d", proc->inf->pid); |
else |
- sprintf (tid_str, "Thread %d.%d", |
- proc->inf->pid, proc->tid); |
+ xsnprintf (tid_str, sizeof (tid_str), "Thread %d.%d", |
+ proc->inf->pid, proc->tid); |
return tid_str; |
} |
@@ -2595,7 +2623,7 @@ static char * |
gnu_pid_to_str (struct target_ops *ops, ptid_t ptid) |
{ |
struct inf *inf = gnu_current_inf; |
- int tid = ptid_get_tid (ptid); |
+ int tid = ptid_get_lwp (ptid); |
struct proc *thread = inf_tid_to_thread (inf, tid); |
if (thread) |
@@ -2604,7 +2632,7 @@ gnu_pid_to_str (struct target_ops *ops, ptid_t ptid) |
{ |
static char tid_str[80]; |
- sprintf (tid_str, "bogus thread id %d", tid); |
+ xsnprintf (tid_str, sizeof (tid_str), "bogus thread id %d", tid); |
return tid_str; |
} |
} |
@@ -2627,7 +2655,7 @@ gnu_target (void) |
t->to_detach = gnu_detach; |
t->to_resume = gnu_resume; |
t->to_wait = gnu_wait; |
- t->deprecated_xfer_memory = gnu_xfer_memory; |
+ t->to_xfer_partial = gnu_xfer_partial; |
t->to_find_memory_regions = gnu_find_memory_regions; |
t->to_terminal_init = gnu_terminal_init_inferior; |
t->to_kill = gnu_kill_inferior; |
@@ -2643,8 +2671,8 @@ gnu_target (void) |
/* User task commands. */ |
-struct cmd_list_element *set_task_cmd_list = 0; |
-struct cmd_list_element *show_task_cmd_list = 0; |
+static struct cmd_list_element *set_task_cmd_list = 0; |
+static struct cmd_list_element *show_task_cmd_list = 0; |
/* User thread commands. */ |
/* Commands with a prefix of `set/show thread'. */ |
@@ -2728,7 +2756,7 @@ cur_thread (void) |
{ |
struct inf *inf = cur_inf (); |
struct proc *thread = inf_tid_to_thread (inf, |
- ptid_get_tid (inferior_ptid)); |
+ ptid_get_lwp (inferior_ptid)); |
if (!thread) |
error (_("No current thread.")); |
return thread; |
@@ -2921,13 +2949,13 @@ set_sig_thread_cmd (char *args, int from_tty) |
inf->signal_thread = 0; |
else |
{ |
- int tid = ptid_get_tid (thread_id_to_pid (atoi (args))); |
+ ptid_t ptid = thread_id_to_pid (atoi (args)); |
- if (tid < 0) |
+ if (ptid_equal (ptid, minus_one_ptid)) |
error (_("Thread ID %s not known. " |
"Use the \"info threads\" command to\n" |
"see the IDs of currently known threads."), args); |
- inf->signal_thread = inf_tid_to_thread (inf, tid); |
+ inf->signal_thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid)); |
} |
} |