From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28155 invoked by alias); 13 Feb 2004 22:07:02 -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 28064 invoked from network); 13 Feb 2004 22:06:58 -0000 Received: from unknown (HELO palrel13.hp.com) (156.153.255.238) by sources.redhat.com with SMTP; 13 Feb 2004 22:06:58 -0000 Received: from hplms2.hpl.hp.com (hplms2.hpl.hp.com [15.0.152.33]) by palrel13.hp.com (Postfix) with ESMTP id 9A89A1C01659; Fri, 13 Feb 2004 14:06:57 -0800 (PST) Received: from napali.hpl.hp.com (napali.hpl.hp.com [15.4.89.123]) by hplms2.hpl.hp.com (8.12.10/8.12.10/HPL-PA Hub) with ESMTP id i1DM6t66026666; Fri, 13 Feb 2004 14:06:55 -0800 (PST) Received: from napali.hpl.hp.com (napali [127.0.0.1]) by napali.hpl.hp.com (8.12.11/8.12.11/Debian-1) with ESMTP id i1DM6teM002663; Fri, 13 Feb 2004 14:06:55 -0800 Received: (from davidm@localhost) by napali.hpl.hp.com (8.12.11/8.12.11/Debian-1) id i1DM6s8U002659; Fri, 13 Feb 2004 14:06:54 -0800 From: David Mosberger MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16429.19070.362324.227537@napali.hpl.hp.com> Date: Fri, 13 Feb 2004 22:07:00 -0000 To: Andrew Cagney Cc: Mark Kettenis , davidm@hpl.hp.com, kevinb@redhat.com, jjohnstn@redhat.com, gdb-patches@sources.redhat.com Subject: Re: make inferior calls work on ia64 even when syscall is pending In-Reply-To: <402CE955.70007@gnu.org> 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> Reply-To: davidm@hpl.hp.com X-URL: http://www.hpl.hp.com/personal/David_Mosberger/ X-SW-Source: 2004-02/txt/msg00355.txt.bz2 >>>>> On Fri, 13 Feb 2004 10:12:21 -0500, Andrew Cagney said: >> Looks good, except for the "extern" function proptotypes. But I >> guess we can't blame you for following the bad example set by >> ia64-tdep.c. Andrew> Fixing, that by creating "ia64-tdep.h", is "obvious". Oh, man, you do know how to suck me into doing extra work... How is this one? Caveat: I know nothing about the gdb build environment, so someone may want to double-check the Makefile changes. Thanks, --david ChangeLog 2004-02-13 David Mosberger * Makefile.in (ia64_tdep_h): New macro. (ia64-linux-tdep.o): Mention $(ia64_tdep_h). (ia64-tdep.o): Likewise. * ia64-tdep.h (ia64_linux_write_pc): New file. * ia64-tdep.c: Update copyright notice. Include "ia64-tdep.h". (ia64_linux_sigcontext_register_address): Move decl to ia64-tdep.h. (ia64_aix_sigcontext_register_address): Likewise. (ia64_linux_getunwind_table): Likewise. * ia64-linux-tdep.c: Likewise. Include "regcache.h" to get write_register_pid() declared. 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. Index: Makefile.in --- Makefile.in +++ Makefile.in @@ -683,6 +683,7 @@ i386_linux_tdep_h = i386-linux-tdep.h i386_tdep_h = i386-tdep.h i387_tdep_h = i387-tdep.h +ia64_tdep_h = ia64-tdep.h infcall_h = infcall.h inferior_h = inferior.h $(breakpoint_h) $(target_h) $(frame_h) inf_loop_h = inf-loop.h @@ -1916,13 +1917,14 @@ ia64-aix-tdep.o: ia64-aix-tdep.c $(defs_h) ia64-linux-nat.o: ia64-linux-nat.c $(defs_h) $(gdb_string_h) $(inferior_h) \ $(target_h) $(gdbcore_h) $(regcache_h) $(gdb_wait_h) $(gregset_h) -ia64-linux-tdep.o: ia64-linux-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) +ia64-linux-tdep.o: ia64-linux-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \ + $(ia64_tdep_h) ia64-tdep.o: ia64-tdep.c $(defs_h) $(inferior_h) $(symfile_h) $(gdbcore_h) \ $(arch_utils_h) $(floatformat_h) $(regcache_h) $(reggroups_h) \ $(frame_h) $(frame_base_h) $(frame_unwind_h) $(doublest_h) \ $(value_h) $(gdb_assert_h) $(objfiles_h) $(elf_common_h) \ $(elf_bfd_h) $(elf_h) $(dis_asm_h) $(libunwind_frame_h) \ - $(libunwind_ia64_h) + $(libunwind_ia64_h) $(ia64_tdep_h) infcall.o: infcall.c $(defs_h) $(breakpoint_h) $(target_h) $(regcache_h) \ $(inferior_h) $(gdb_assert_h) $(block_h) $(gdbcore_h) $(language_h) \ $(symfile_h) $(gdbcmd_h) $(command_h) $(gdb_string_h) $(infcall_h) Index: ia64-linux-tdep.c --- ia64-linux-tdep.c +++ ia64-linux-tdep.c @@ -20,8 +20,10 @@ Boston, MA 02111-1307, USA. */ #include "defs.h" +#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,3 +95,20 @@ 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 --- ia64-tdep.c +++ ia64-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the IA-64 for GDB, the GNU debugger. - Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -38,6 +38,7 @@ #include "elf-bfd.h" #include "elf.h" /* for PT_IA64_UNWIND value */ #include "dis-asm.h" +#include "ia64-tdep.h" #ifdef HAVE_LIBUNWIND_IA64_H #include "libunwind-frame.h" @@ -90,11 +91,6 @@ #define BUNDLE_LEN 16 -/* FIXME: These extern declarations should go in ia64-tdep.h. */ -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); - static gdbarch_init_ftype ia64_gdbarch_init; static gdbarch_register_name_ftype ia64_register_name; @@ -632,7 +628,7 @@ 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; @@ -3339,7 +3343,10 @@ 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 --- /dev/null +++ ia64-tdep.h @@ -0,0 +1,32 @@ +/* Target-dependent code for the ia64. + + Copyright 2004 + Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef IA64_TDEP_H +#define IA64_TDEP_H + +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 */