From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6836 invoked by alias); 23 Nov 2001 14:39:44 -0000 Mailing-List: contact gdb-patches-help@sourceware.cygnus.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 6799 invoked from network); 23 Nov 2001 14:39:38 -0000 Received: from unknown (HELO sunsite.ms.mff.cuni.cz) (195.113.19.66) by sourceware.cygnus.com with SMTP; 23 Nov 2001 14:39:38 -0000 Received: (from jj@localhost) by sunsite.ms.mff.cuni.cz (8.9.3/8.9.3) id PAA08134 for gdb-patches@sources.redhat.com; Fri, 23 Nov 2001 15:42:22 +0100 Date: Sat, 10 Nov 2001 09:20:00 -0000 From: Jakub Jelinek To: gdb-patches@sources.redhat.com Subject: [PATCH] Fix sparc-*-linux register fetching/storing Message-ID: <20011123154220.A562@sunsite.ms.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 0.95.4us X-SW-Source: 2001-11/txt/msg00197.txt.bz2 Hi! On sparc-*-linux, bfd automatically supports both 32bit and 64bit ABI and thus CORE_ADDR is 64bit type. Unfortunately, this means %l0-%i7 registers are read from incorrect place (and stored too), particularly from caller's instruction chain. This means even simple commands like next or bt don't work at all. Ok to commit? 2001-11-23 Jakub Jelinek * sparc-nat.c (fetch_inferior_registers): Don't rely on CORE_ADDR being 32-bit. (store_inferior_registers): Likewise. --- gdb/sparc-nat.c.jj Sun Oct 14 19:15:14 2001 +++ gdb/sparc-nat.c Fri Nov 23 16:45:58 2001 @@ -120,15 +120,15 @@ fetch_inferior_registers (int regno) all (16 ptrace calls!) if we really need them. */ if (regno == -1) { - target_read_memory (*(CORE_ADDR *) & registers[REGISTER_BYTE (SP_REGNUM)], - ®isters[REGISTER_BYTE (L0_REGNUM)], + CORE_ADDR sp = *(unsigned int *) & registers[REGISTER_BYTE (SP_REGNUM)]; + target_read_memory (sp, ®isters[REGISTER_BYTE (L0_REGNUM)], 16 * REGISTER_RAW_SIZE (L0_REGNUM)); for (i = L0_REGNUM; i <= I7_REGNUM; i++) register_valid[i] = 1; } else if (regno >= L0_REGNUM && regno <= I7_REGNUM) { - CORE_ADDR sp = *(CORE_ADDR *) & registers[REGISTER_BYTE (SP_REGNUM)]; + CORE_ADDR sp = *(unsigned int *) & registers[REGISTER_BYTE (SP_REGNUM)]; i = REGISTER_BYTE (regno); if (register_valid[regno]) printf_unfiltered ("register %d valid and read\n", regno); @@ -190,7 +190,7 @@ store_inferior_registers (int regno) if (wanna_store & STACK_REGS) { - CORE_ADDR sp = *(CORE_ADDR *) & registers[REGISTER_BYTE (SP_REGNUM)]; + CORE_ADDR sp = *(unsigned int *) & registers[REGISTER_BYTE (SP_REGNUM)]; if (regno < 0 || regno == SP_REGNUM) { Jakub