2004-02-23 David Mosberger <davidm@hpl.hp.com>
authorKevin Buettner <kevinb@redhat.com>
Tue, 24 Feb 2004 22:35:01 +0000 (22:35 +0000)
committerKevin Buettner <kevinb@redhat.com>
Tue, 24 Feb 2004 22:35:01 +0000 (22:35 +0000)
Committed by Kevin Buettner <kevinb@redhat.com>.

* ia64-tdep.h (ia64_write_pc, ia64_linux_write_pc): Declare.
* ia64-tdep.c (ia64_write_pc): Make it a global function.
(ia64_gdbarch_init): For Linux targets, use ia64_linux_write_pc()
instead of ia64_write_pc().
* ia64-linux-tdep.c (regcache.h): Include.
(ia64_linux_write_pc): New function.

gdb/ChangeLog
gdb/ia64-linux-tdep.c
gdb/ia64-tdep.c
gdb/ia64-tdep.h

index 3f8b904503bd121e311adab1731163433c40d3b7..01e8152b919caf9531c3b919adf566b766370f0b 100644 (file)
@@ -1,3 +1,14 @@
+2004-02-23  David Mosberger  <davidm@hpl.hp.com>
+
+       Committed by Kevin Buettner <kevinb@redhat.com>.
+
+       * ia64-tdep.h (ia64_write_pc, ia64_linux_write_pc): Declare.
+       * ia64-tdep.c (ia64_write_pc): Make it a global function.
+       (ia64_gdbarch_init): For Linux targets, use ia64_linux_write_pc()
+       instead of ia64_write_pc().
+       * ia64-linux-tdep.c (regcache.h): Include.
+       (ia64_linux_write_pc): New function.
 2004-02-23  Roland McGrath  <roland@redhat.com>
 
        * auxv.c (info_auxv_command): Fix typos in error messages.
@@ -59,6 +70,7 @@
        * breakpoint.c (print_one_breakpoint): Do not output spaces
        after printing <PENDING> for a pending breakpoint.
 
+>>>>>>> 1.5456
 2004-02-23  Jeff Johnston  <jjohnstn@redhat.com>
 
        * printcmd.c (print_scalar_formatted): Initialize val_long
index 12f0c18c112777edd448a5f781517a722a72f031..c3fa443a3655deef6ae344f7d4bc219a3c195f39 100644 (file)
@@ -23,6 +23,7 @@
 #include "ia64-tdep.h"
 #include "arch-utils.h"
 #include "gdbcore.h"
+#include "regcache.h"
 
 /* The sigtramp code is in a non-readable (executable-only) region
    of memory called the ``gate page''.  The addresses in question
@@ -94,3 +95,20 @@ ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
        return 0;
       }
 }
+
+void
+ia64_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
+{
+  ia64_write_pc (pc, ptid);
+
+  /* We must be careful with modifying the instruction-pointer: if we
+     just interrupt a system call, the kernel would ordinarily try to
+     restart it when we resume the inferior, which typically results
+     in SIGSEGV or SIGILL.  We prevent this by clearing r10, which
+     will tell the kernel that r8 does NOT contain a valid error code
+     and hence it will skip system-call restart.
+
+     The clearing of r10 is safe as long as ia64_write_pc() is only
+     called as part of setting up an inferior call.  */
+  write_register_pid (IA64_GR10_REGNUM, 0, ptid);
+}
index caeaf2d9c6c88cbb237cf3379479768bc7edbaf4..278538caa8b170a7969a5bd6b3a75fa738f684a7 100644 (file)
@@ -628,7 +628,7 @@ ia64_read_pc (ptid_t ptid)
   return pc_value | (slot_num * SLOT_MULTIPLIER);
 }
 
-static void
+void
 ia64_write_pc (CORE_ADDR new_pc, ptid_t ptid)
 {
   int slot_num = (int) (new_pc & 0xf) / SLOT_MULTIPLIER;
@@ -3338,7 +3338,10 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_memory_remove_breakpoint (gdbarch, ia64_memory_remove_breakpoint);
   set_gdbarch_breakpoint_from_pc (gdbarch, ia64_breakpoint_from_pc);
   set_gdbarch_read_pc (gdbarch, ia64_read_pc);
-  set_gdbarch_write_pc (gdbarch, ia64_write_pc);
+  if (info.osabi == GDB_OSABI_LINUX)
+    set_gdbarch_write_pc (gdbarch, ia64_linux_write_pc);
+  else
+    set_gdbarch_write_pc (gdbarch, ia64_write_pc);
 
   /* Settings for calling functions in the inferior.  */
   set_gdbarch_push_dummy_call (gdbarch, ia64_push_dummy_call);
index 32364d276e826acc9d80c474a0b68e1f0859e404..e153eed580c2c2534f205916137a9243461b0bcb 100644 (file)
@@ -25,5 +25,7 @@
 extern CORE_ADDR ia64_linux_sigcontext_register_address (CORE_ADDR, int);
 extern CORE_ADDR ia64_aix_sigcontext_register_address (CORE_ADDR, int);
 extern unsigned long ia64_linux_getunwind_table (void *, size_t);
+extern void ia64_write_pc (CORE_ADDR, ptid_t);
+extern void ia64_linux_write_pc (CORE_ADDR, ptid_t);
 
 #endif /* IA64_TDEP_H */