From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9031 invoked by alias); 23 Feb 2004 21:15:33 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 9011 invoked from network); 23 Feb 2004 21:15:32 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 23 Feb 2004 21:15:32 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id i1NLFUb24421 for ; Mon, 23 Feb 2004 16:15:30 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i1NLFUi23053; Mon, 23 Feb 2004 16:15:30 -0500 Received: from localhost.localdomain (vpn50-40.rdu.redhat.com [172.16.50.40]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id i1NLFTNQ014954; Mon, 23 Feb 2004 16:15:30 -0500 Received: from saguaro (saguaro.lan [192.168.64.2]) by localhost.localdomain (8.12.10/8.12.10) with SMTP id i1NLFOcG021975; Mon, 23 Feb 2004 14:15:24 -0700 Date: Mon, 23 Feb 2004 21:15:00 -0000 From: Kevin Buettner To: davidm@hpl.hp.com Cc: davidm@napali.hpl.hp.com, gdb-patches@sources.redhat.com, Andrew Cagney , Mark Kettenis , jjohnstn@redhat.com Subject: Re: make inferior calls work on ia64 even when syscall is pending Message-Id: <20040223141524.51e988ef@saguaro> In-Reply-To: <16429.19070.362324.227537@napali.hpl.hp.com> References: <16371.12104.503371.251351@napali.hpl.hp.com> <200312312333.hBVNXNvg016633@elgar.kettenis.dyndns.org> <16428.9442.113820.725379@napali.hpl.hp.com> <200402131458.i1DEw4bu000328@elgar.kettenis.dyndns.org> <402CE955.70007@gnu.org> <16429.19070.362324.227537@napali.hpl.hp.com> Organization: Red Hat Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-SW-Source: 2004-02/txt/msg00661.txt.bz2 On Fri, 13 Feb 2004 14:06:54 -0800 David Mosberger wrote: > 2004-02-12 David Mosberger > > * ia64-tdep.c (ia64_linux_write_pc): Declare as extern. > (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 (ia64_write_pc): Declare as extern. > (ia64_linux_write_pc): New function. Works like ia64_write_pc(), > except that it also clears r10 afterwards to prevent the kernel > from attempting to restart an interrupt system call. I've committed the above via the following patch. Please let me know if I've missed anything. * 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. Index: ia64-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ia64-linux-tdep.c,v retrieving revision 1.6 diff -u -p -r1.6 ia64-linux-tdep.c --- ia64-linux-tdep.c 17 Feb 2004 16:23:23 -0000 1.6 +++ ia64-linux-tdep.c 23 Feb 2004 21:06:43 -0000 @@ -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 @@ -93,4 +94,21 @@ ia64_linux_sigcontext_register_address ( default : 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: ia64-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ia64-tdep.c,v retrieving revision 1.116 diff -u -p -r1.116 ia64-tdep.c --- ia64-tdep.c 17 Feb 2004 16:23:23 -0000 1.116 +++ ia64-tdep.c 23 Feb 2004 21:06:44 -0000 @@ -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 i 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: ia64-tdep.h =================================================================== RCS file: /cvs/src/src/gdb/ia64-tdep.h,v retrieving revision 1.1 diff -u -p -r1.1 ia64-tdep.h --- ia64-tdep.h 17 Feb 2004 16:23:23 -0000 1.1 +++ ia64-tdep.h 23 Feb 2004 21:06:44 -0000 @@ -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 */