From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16321 invoked by alias); 9 Dec 2010 23:20:10 -0000 Received: (qmail 16281 invoked by uid 22791); 9 Dec 2010 23:20:09 -0000 X-SWARE-Spam-Status: No, hits=-6.7 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_EG,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 09 Dec 2010 23:20:02 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oB9NK02J030191 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 9 Dec 2010 18:20:01 -0500 Received: from mesquite.lan ([10.3.113.8]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oB9NK0HT016676 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 9 Dec 2010 18:20:00 -0500 Date: Thu, 09 Dec 2010 23:20:00 -0000 From: Kevin Buettner To: gdb-patches@sourceware.org Cc: Mark Kettenis Subject: Re: [RFC] mips-tdep.c: pseudo-register -> raw register sign extension Message-ID: <20101209162000.29cb4e3f@mesquite.lan> In-Reply-To: <201012091119.oB9BJ0G1007042@glazunov.sibelius.xs4all.nl> References: <20101207164737.0bafe0d6@mesquite.lan> <201012091119.oB9BJ0G1007042@glazunov.sibelius.xs4all.nl> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-IsSubscribed: yes 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: 2010-12/txt/msg00125.txt.bz2 On Thu, 9 Dec 2010 12:19:00 +0100 (CET) Mark Kettenis wrote: > > + LONGEST regval = extract_signed_integer (buf, 4, byte_order); > > + store_signed_integer (buf8, 8, byte_order, regval); > > + regcache_raw_write (regcache, rawnum, buf8); > > How about using regcache_raw_write_signed() here? I think that > simplifies the code enough to change mips_pseudo_register_read() to > use regcache_raw_read_signed() and get rid of the explicit endian-ness > check as well. I like this suggestion. See below for a revised patch... Kevin * mips-tdep.c (mips_pseudo_register_write): Sign extend 32-bit cooked values that are being transferred to 64-bit raw registers. (mips_pseudo_register_read): Revise to preserve symmetry with mips_pseudo_register_write(). Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.508 diff -u -p -r1.508 mips-tdep.c --- mips-tdep.c 28 Nov 2010 04:31:24 -0000 1.508 +++ mips-tdep.c 9 Dec 2010 23:03:02 -0000 @@ -559,11 +559,15 @@ mips_pseudo_register_read (struct gdbarc else if (register_size (gdbarch, rawnum) > register_size (gdbarch, cookednum)) { - if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p - || gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) + if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p) regcache_raw_read_part (regcache, rawnum, 0, 4, buf); else - regcache_raw_read_part (regcache, rawnum, 4, 4, buf); + { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + LONGEST regval; + regcache_raw_read_signed (regcache, rawnum, ®val); + store_signed_integer (buf, 4, byte_order, regval); + } } else internal_error (__FILE__, __LINE__, _("bad register size")); @@ -582,11 +586,17 @@ mips_pseudo_register_write (struct gdbar else if (register_size (gdbarch, rawnum) > register_size (gdbarch, cookednum)) { - if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p - || gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) + if (gdbarch_tdep (gdbarch)->mips64_transfers_32bit_regs_p) regcache_raw_write_part (regcache, rawnum, 0, 4, buf); else - regcache_raw_write_part (regcache, rawnum, 4, 4, buf); + { + /* Sign extend the shortened version of the register prior + to placing it in the raw register. This is required for + some mips64 parts in order to avoid unpredictable behavior. */ + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + LONGEST regval = extract_signed_integer (buf, 4, byte_order); + regcache_raw_write_signed (regcache, rawnum, regval); + } } else internal_error (__FILE__, __LINE__, _("bad register size"));