From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5202 invoked by alias); 25 Apr 2007 00:16:57 -0000 Received: (qmail 5167 invoked by uid 22791); 25 Apr 2007 00:16:53 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate7.de.ibm.com (HELO mtagate7.de.ibm.com) (195.212.29.156) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 25 Apr 2007 01:16:48 +0100 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate7.de.ibm.com (8.13.8/8.13.8) with ESMTP id l3P0Gi26328150 for ; Wed, 25 Apr 2007 00:16:44 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.3) with ESMTP id l3P0Giq93530978 for ; Wed, 25 Apr 2007 02:16:44 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id l3P0GiHk015001 for ; Wed, 25 Apr 2007 02:16:44 +0200 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id l3P0GifL014998; Wed, 25 Apr 2007 02:16:44 +0200 Message-Id: <200704250016.l3P0GifL014998@d12av02.megacenter.de.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Wed, 25 Apr 2007 02:16:44 +0200 Subject: Re: [rfc/rft] [3/4] Untangle register_addr - v2 - mips-linux To: drow@false.org (Daniel Jacobowitz) Date: Wed, 25 Apr 2007 00:26:00 -0000 From: "Ulrich Weigand" Cc: gdb-patches@sourceware.org In-Reply-To: <20070424215221.GB5173@caradoc.them.org> from "Daniel Jacobowitz" at Apr 24, 2007 05:52:21 PM X-Mailer: ELM [version 2.5 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-04/txt/msg00334.txt.bz2 Daniel Jacobowitz wrote: > Well, no, I don't think this will do. Sorry I didn't get to look at > this before you redid it. The cannot_store_register callback refused > stores to badvaddr and cause. If you're using a mips-linux native > debugger, or talking to gdbserver, that's fine. But if you're using a > mips-linux debugger and talking to kgdb over a JTAG unit, it's less > fine. You should be able to write to cause if your target_ops permits. I had assumed people would be building GDB for a different target in such cases -- if the mips-linux target is used, I agree my proposed patch is broken. So I guess we're back to distinguishing between a gdbarch method of providing registers that cannot be fetched and stored, and in addition a target_ops method -- which in the case of a target using the trad_ptrace helpers should be made available somehow ... In any case, I still like to get the bulk of the register_addr patch set committed soon -- the whole cannot_fetch_register discussion is really an independent topic. The following patch contains just the part to move register_addr to mips-linux-nat.c and leaves the CANNOT_FETCH_REGISTER situation completely unchanged. Would that be OK with you for now? Bye, Ulrich ChangeLog: * mips-linux-nat.c: No longer include "gdbcore.h". (mips_linux_register_addr): Move from mips-linux-tdep.c. (mips64_linux_register_addr): Likewise. (mips_linux_register_u_offset): Call mips_linux_register_addr or mips64_linux_register_addr instead of register_addr. * mips-linux-tdep.c (mips_linux_register_addr, mips64_linux_register_addr): Move to mips-linux-nat.c. (register_addr): Remove. (register_addr_data, init_register_addr_data): Remove. (_initialize_mips_linux_tdep): Do not initialize register_addr_data. (set_mips_linux_register_addr): Remove. (mips_linux_init_abi): Do not call set_mips_linux_register_addr. diff -urNp gdb-orig/gdb/mips-linux-nat.c gdb-head/gdb/mips-linux-nat.c --- gdb-orig/gdb/mips-linux-nat.c 2007-04-25 01:32:03.169405714 +0200 +++ gdb-head/gdb/mips-linux-nat.c 2007-04-25 01:35:24.094448682 +0200 @@ -26,7 +26,6 @@ #include "target.h" #include "linux-nat.h" #include "mips-linux-tdep.h" -#include "gdbcore.h" #include "gdb_proc_service.h" @@ -87,6 +86,75 @@ mips_linux_cannot_store_register (int re return 1; } +/* Map gdb internal register number to ptrace ``address''. + These ``addresses'' are normally defined in . */ + +static CORE_ADDR +mips_linux_register_addr (int regno) +{ + int regaddr; + + if (regno < 0 || regno >= NUM_REGS) + error (_("Bogon register number %d."), regno); + + if (regno < 32) + regaddr = regno; + else if ((regno >= mips_regnum (current_gdbarch)->fp0) + && (regno < mips_regnum (current_gdbarch)->fp0 + 32)) + regaddr = FPR_BASE + (regno - mips_regnum (current_gdbarch)->fp0); + else if (regno == mips_regnum (current_gdbarch)->pc) + regaddr = PC; + else if (regno == mips_regnum (current_gdbarch)->cause) + regaddr = CAUSE; + else if (regno == mips_regnum (current_gdbarch)->badvaddr) + regaddr = BADVADDR; + else if (regno == mips_regnum (current_gdbarch)->lo) + regaddr = MMLO; + else if (regno == mips_regnum (current_gdbarch)->hi) + regaddr = MMHI; + else if (regno == mips_regnum (current_gdbarch)->fp_control_status) + regaddr = FPC_CSR; + else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision) + regaddr = FPC_EIR; + else + error (_("Unknowable register number %d."), regno); + + return regaddr; +} + +static CORE_ADDR +mips64_linux_register_addr (int regno) +{ + int regaddr; + + if (regno < 0 || regno >= NUM_REGS) + error (_("Bogon register number %d."), regno); + + if (regno < 32) + regaddr = regno; + else if ((regno >= mips_regnum (current_gdbarch)->fp0) + && (regno < mips_regnum (current_gdbarch)->fp0 + 32)) + regaddr = MIPS64_FPR_BASE + (regno - FP0_REGNUM); + else if (regno == mips_regnum (current_gdbarch)->pc) + regaddr = MIPS64_PC; + else if (regno == mips_regnum (current_gdbarch)->cause) + regaddr = MIPS64_CAUSE; + else if (regno == mips_regnum (current_gdbarch)->badvaddr) + regaddr = MIPS64_BADVADDR; + else if (regno == mips_regnum (current_gdbarch)->lo) + regaddr = MIPS64_MMLO; + else if (regno == mips_regnum (current_gdbarch)->hi) + regaddr = MIPS64_MMHI; + else if (regno == mips_regnum (current_gdbarch)->fp_control_status) + regaddr = MIPS64_FPC_CSR; + else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision) + regaddr = MIPS64_FPC_EIR; + else + error (_("Unknowable register number %d."), regno); + + return regaddr; +} + /* Fetch the thread-local storage pointer for libthread_db. */ ps_err_e @@ -253,10 +321,10 @@ mips64_linux_store_registers (int regnum static CORE_ADDR mips_linux_register_u_offset (int regno) { - /* FIXME drow/2005-09-04: The hardcoded use of register_addr should go - away. This requires disentangling the various definitions of it - (particularly alpha-nat.c's). */ - return register_addr (regno, 0); + if (mips_abi_regsize (current_gdbarch) == 8) + return mips64_linux_register_addr (regno); + else + return mips_linux_register_addr (regno); } void _initialize_mips_linux_nat (void); diff -urNp gdb-orig/gdb/mips-linux-tdep.c gdb-head/gdb/mips-linux-tdep.c --- gdb-orig/gdb/mips-linux-tdep.c 2007-04-25 01:28:13.454193000 +0200 +++ gdb-head/gdb/mips-linux-tdep.c 2007-04-25 01:34:50.385051211 +0200 @@ -218,42 +218,6 @@ mips_fill_fpregset (mips_elf_fpregset_t } } -/* Map gdb internal register number to ptrace ``address''. - These ``addresses'' are normally defined in . */ - -static CORE_ADDR -mips_linux_register_addr (int regno, CORE_ADDR blockend) -{ - int regaddr; - - if (regno < 0 || regno >= NUM_REGS) - error (_("Bogon register number %d."), regno); - - if (regno < 32) - regaddr = regno; - else if ((regno >= mips_regnum (current_gdbarch)->fp0) - && (regno < mips_regnum (current_gdbarch)->fp0 + 32)) - regaddr = FPR_BASE + (regno - mips_regnum (current_gdbarch)->fp0); - else if (regno == mips_regnum (current_gdbarch)->pc) - regaddr = PC; - else if (regno == mips_regnum (current_gdbarch)->cause) - regaddr = CAUSE; - else if (regno == mips_regnum (current_gdbarch)->badvaddr) - regaddr = BADVADDR; - else if (regno == mips_regnum (current_gdbarch)->lo) - regaddr = MMLO; - else if (regno == mips_regnum (current_gdbarch)->hi) - regaddr = MMHI; - else if (regno == mips_regnum (current_gdbarch)->fp_control_status) - regaddr = FPC_CSR; - else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision) - regaddr = FPC_EIR; - else - error (_("Unknowable register number %d."), regno); - - return regaddr; -} - /* Support for 64-bit ABIs. */ /* Figure out where the longjmp will land. @@ -487,42 +451,6 @@ mips64_fill_fpregset (mips64_elf_fpregse } -/* Map gdb internal register number to ptrace ``address''. - These ``addresses'' are normally defined in . */ - -static CORE_ADDR -mips64_linux_register_addr (int regno, CORE_ADDR blockend) -{ - int regaddr; - - if (regno < 0 || regno >= NUM_REGS) - error (_("Bogon register number %d."), regno); - - if (regno < 32) - regaddr = regno; - else if ((regno >= mips_regnum (current_gdbarch)->fp0) - && (regno < mips_regnum (current_gdbarch)->fp0 + 32)) - regaddr = MIPS64_FPR_BASE + (regno - FP0_REGNUM); - else if (regno == mips_regnum (current_gdbarch)->pc) - regaddr = MIPS64_PC; - else if (regno == mips_regnum (current_gdbarch)->cause) - regaddr = MIPS64_CAUSE; - else if (regno == mips_regnum (current_gdbarch)->badvaddr) - regaddr = MIPS64_BADVADDR; - else if (regno == mips_regnum (current_gdbarch)->lo) - regaddr = MIPS64_MMLO; - else if (regno == mips_regnum (current_gdbarch)->hi) - regaddr = MIPS64_MMHI; - else if (regno == mips_regnum (current_gdbarch)->fp_control_status) - regaddr = MIPS64_FPC_CSR; - else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision) - regaddr = MIPS64_FPC_EIR; - else - error (_("Unknowable register number %d."), regno); - - return regaddr; -} - /* Use a local version of this function to get the correct types for regsets, until multi-arch core support is ready. */ @@ -584,35 +512,6 @@ static struct core_fns regset_core_fns = NULL /* next */ }; -/* Handle for obtaining pointer to the current register_addr() - function for a given architecture. */ -static struct gdbarch_data *register_addr_data; - -CORE_ADDR -register_addr (int regno, CORE_ADDR blockend) -{ - CORE_ADDR (*register_addr_ptr) (int, CORE_ADDR) = - gdbarch_data (current_gdbarch, register_addr_data); - - gdb_assert (register_addr_ptr != 0); - - return register_addr_ptr (regno, blockend); -} - -static void -set_mips_linux_register_addr (struct gdbarch *gdbarch, - CORE_ADDR (*register_addr_ptr) (int, - CORE_ADDR)) -{ - deprecated_set_gdbarch_data (gdbarch, register_addr_data, - register_addr_ptr); -} - -static void * -init_register_addr_data (struct gdbarch *gdbarch) -{ - return 0; -} /* Check the code at PC for a dynamic linker lazy resolution stub. Because they aren't in the .plt section, we pattern-match on the @@ -1139,7 +1038,6 @@ mips_linux_init_abi (struct gdbarch_info mips_linux_get_longjmp_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); - set_mips_linux_register_addr (gdbarch, mips_linux_register_addr); tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_sigframe); tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_rt_sigframe); break; @@ -1148,7 +1046,6 @@ mips_linux_init_abi (struct gdbarch_info mips_linux_get_longjmp_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); - set_mips_linux_register_addr (gdbarch, mips64_linux_register_addr); set_gdbarch_long_double_bit (gdbarch, 128); /* These floatformats should probably be renamed. MIPS uses the same 128-bit IEEE floating point format that IA-64 uses, @@ -1162,7 +1059,6 @@ mips_linux_init_abi (struct gdbarch_info mips64_linux_get_longjmp_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); - set_mips_linux_register_addr (gdbarch, mips64_linux_register_addr); set_gdbarch_long_double_bit (gdbarch, 128); /* These floatformats should probably be renamed. MIPS uses the same 128-bit IEEE floating point format that IA-64 uses, @@ -1191,9 +1087,6 @@ _initialize_mips_linux_tdep (void) { const struct bfd_arch_info *arch_info; - register_addr_data = - gdbarch_data_register_post_init (init_register_addr_data); - for (arch_info = bfd_lookup_arch (bfd_arch_mips, 0); arch_info != NULL; arch_info = arch_info->next) -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com