diff options
Diffstat (limited to 'gdb/ia64-linux-nat.c')
-rw-r--r-- | gdb/ia64-linux-nat.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/gdb/ia64-linux-nat.c b/gdb/ia64-linux-nat.c index cb9a438..f570a96 100644 --- a/gdb/ia64-linux-nat.c +++ b/gdb/ia64-linux-nat.c @@ -28,6 +28,7 @@ #include "gdbcore.h" #include "regcache.h" #include "ia64-tdep.h" +#include "linux-nat.h" #include <signal.h> #include <sys/ptrace.h> @@ -666,12 +667,38 @@ ia64_linux_stopped_by_watchpoint (void) return ia64_linux_stopped_data_address (&addr); } -LONGEST -ia64_linux_xfer_unwind_table (struct target_ops *ops, - enum target_object object, - const char *annex, - void *readbuf, const void *writebuf, - ULONGEST offset, LONGEST len) +static LONGEST (*super_xfer_partial) (struct target_ops *, enum target_object, + const char *, gdb_byte *, const gdb_byte *, + ULONGEST, LONGEST); + +static LONGEST +ia64_linux_xfer_partial (struct target_ops *ops, + enum target_object object, + const char *annex, + gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST offset, LONGEST len) +{ + if (object == TARGET_OBJECT_UNWIND_TABLE && writebuf == NULL && offset == 0) + return syscall (__NR_getunwind, readbuf, len); + + return super_xfer_partial (ops, object, annex, readbuf, writebuf, + offset, len); +} + +void _initialize_ia64_linux_nat (void); + +void +_initialize_ia64_linux_nat (void) { - return syscall (__NR_getunwind, readbuf, len); + struct target_ops *t = linux_target (); + + /* Fill in the generic GNU/Linux methods. */ + t = linux_target (); + + /* Override the default to_xfer_partial. */ + super_xfer_partial = t->to_xfer_partial; + t->to_xfer_partial = ia64_linux_xfer_partial; + + /* Register the target. */ + add_target (t); } |