From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6826 invoked by alias); 28 Jun 2003 18:36:55 -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 6819 invoked from network); 28 Jun 2003 18:36:55 -0000 Received: from unknown (HELO crack.them.org) (146.82.138.56) by sources.redhat.com with SMTP; 28 Jun 2003 18:36:55 -0000 Received: from dsl093-172-017.pit1.dsl.speakeasy.net ([66.93.172.17] helo=nevyn.them.org ident=mail) by crack.them.org with asmtp (Exim 3.12 #1 (Debian)) id 19WKZy-0007Dg-00; Sat, 28 Jun 2003 13:37:42 -0500 Received: from drow by nevyn.them.org with local (Exim 3.36 #1 (Debian)) id 19WKYr-0006hL-00; Sat, 28 Jun 2003 14:36:33 -0400 Date: Sat, 28 Jun 2003 18:36:00 -0000 From: Daniel Jacobowitz To: Andrew Cagney Cc: Fred Fish , gdb-patches@sources.redhat.com Subject: Re: [RFA] Testing REGISTER_NAME in mips-linux-nat.c Message-ID: <20030628183631.GA25309@nevyn.them.org> Mail-Followup-To: Andrew Cagney , Fred Fish , gdb-patches@sources.redhat.com References: <20030627172013.54F648B5FD@bletchley.vert.intrinsity.com> <3EFC9B86.5060300@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3EFC9B86.5060300@redhat.com> User-Agent: Mutt/1.5.1i X-SW-Source: 2003-06/txt/msg00852.txt.bz2 On Fri, Jun 27, 2003 at 03:31:18PM -0400, Andrew Cagney wrote: > >A recent change to mips_register_name to return a empty string for > >register numbers < NUM_REGS is causing problems with the native mips > >linux port. The change in mips_register_name is: > > Arrgh, they keep turning up :-( > > > + /* Map [NUM_REGS .. 2*NUM_REGS) onto the raw registers, but then > > + don't make the raw register names visible. */ > > + int rawnum = regno % NUM_REGS; > > + if (regno < NUM_REGS) > > + return ""; > > > >Now for example when mips_linux_cannot_fetch_register() is called with > >regno == PC_REGNUM, it will return 1 and reading of the PC will return > >zero as the PC value. > > > >I think this is the correct patch, but I'm not 100% sure. Perhaps we > >can just eliminate the REGISTER_NAME check completely. > > The assertion: > > gdb_assert (regno >= 0 && regno < NUM_REGS); > > holds so, yes, eliminating REGISTER_NAME would make sense. Take a look at MIPS_REGISTER_NAMES in tm-mips.h, which is the generic registers. Note lots of empty (unnamed) entries in there - we can't fetch or store those. That's what the check is trying to avoid. I don't think Fred's patch is right either, because this function shouldn't even be called for regno > NUM_REGS, so it just disables the check. I think the right thing to do is either (ugh!) to call REGISTER_NAME (regno + NUM_REGS), or to switch to an inclusive list of available registers. Which is easier, and cleaner. Fred, my mips-linux box is offline at the moment, so I can't test this. Could you try the attached patch and let me know if it works? I think I'm going to try to get my own breed of automated testing going to cover this... > Hmm, how come this doesn't just use PTRACE_GETREGS? Because mips-linux doesn't implement that yet. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2003-06-28 Daniel Jacobowitz * mips-linux-nat.c (mips_linux_cannot_fetch_register) (mips_linux_cannot_store_register): List supported instead of unsupported registers. Index: mips-linux-nat.c =================================================================== RCS file: /cvs/src/src/gdb/mips-linux-nat.c,v retrieving revision 1.4 diff -u -p -r1.4 mips-linux-nat.c --- mips-linux-nat.c 30 Oct 2002 04:10:06 -0000 1.4 +++ mips-linux-nat.c 28 Jun 2003 18:34:04 -0000 @@ -1,6 +1,6 @@ /* Native-dependent code for GNU/Linux on MIPS processors. - Copyright 2001, 2002 Free Software Foundation, Inc. + Copyright 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GDB. @@ -29,31 +29,42 @@ int mips_linux_cannot_fetch_register (int regno) { - if (REGISTER_NAME (regno)[0] == 0) - return 1; - if (regno == PS_REGNUM) - return 1; - else if (regno == ZERO_REGNUM) - return 1; - else + if (regno > ZERO_REGNUM && regno < ZERO_REGNUM + 32) return 0; + else if (regno >= FP0_REGNUM && regno <= FP0_REGNUM + 32) + return 0; + + switch (regno) + { + case LO_REGNUM: + case HI_REGNUM: + case BADVADDR_REGNUM: + case CAUSE_REGNUM: + case PC_REGNUM: + case FCRCS_REGNUM: + case FCRIR_REGNUM: + return 0; + } + + return 1; } int mips_linux_cannot_store_register (int regno) { - if (REGISTER_NAME (regno)[0] == 0) - return 1; - if (regno == PS_REGNUM) - return 1; - else if (regno == ZERO_REGNUM) - return 1; - else if (regno == BADVADDR_REGNUM) - return 1; - else if (regno == CAUSE_REGNUM) - return 1; - else if (regno == FCRIR_REGNUM) - return 1; - else + if (regno > ZERO_REGNUM && regno < ZERO_REGNUM + 32) return 0; + else if (regno >= FP0_REGNUM && regno <= FP0_REGNUM + 32) + return 0; + + switch (regno) + { + case LO_REGNUM: + case HI_REGNUM: + case PC_REGNUM: + case FCRCS_REGNUM: + return 0; + } + + return 1; }