From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30557 invoked by alias); 23 Apr 2002 19:45:05 -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 30549 invoked from network); 23 Apr 2002 19:45:01 -0000 Received: from unknown (HELO cygnus.com) (205.180.83.203) by sources.redhat.com with SMTP; 23 Apr 2002 19:45:01 -0000 Received: from redhat.com (reddwarf.sfbay.redhat.com [172.16.24.50]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id MAA20615; Tue, 23 Apr 2002 12:45:00 -0700 (PDT) Message-ID: <3CC5B6ED.7BFD1E5D@redhat.com> Date: Tue, 23 Apr 2002 12:45:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: gdb-patches@sources.redhat.com Subject: Re: [RFA] Fix sparc64 pop/push frame reg saving References: <20020420.013839.70807514.davem@redhat.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2002-04/txt/msg00872.txt.bz2 "David S. Miller" wrote: > > This makes sure that all the correct regs get saved > in push/pop regs on sparc64. > > sparc32 sparc64 > failures before 83 111 > failures after 83 110 David, I see that this is based on your renumbering of the sparc64 registers (submitted separately). I don't think that renumbering is allowable. Even if we disregarded embedded sparc64 targets, wouldn't this break Solaris? > > 2002-04-20 David S. Miller > > * sparc-tdep.c (sparc_push_dummy_frame): Save Y, PC, NPC, CCR, FSR > properly on sparc64. > (sparc_push_dummy_frame): Find them in the right spot. > (sparc_pop_frame): Restore them properly. > > --- sparc-tdep.c.~1~ Fri Apr 19 23:53:57 2002 > +++ sparc-tdep.c Sat Apr 20 00:34:53 2002 > @@ -960,13 +960,10 @@ sparc_push_dummy_frame (void) > > if (GDB_TARGET_IS_SPARC64) > { > - /* PC, NPC, CCR, FSR, FPRS, Y, ASI */ > - read_register_bytes (REGISTER_BYTE (PC_REGNUM), ®ister_temp[0], > - REGISTER_RAW_SIZE (PC_REGNUM) * 7); > - read_register_bytes (REGISTER_BYTE (PSTATE_REGNUM), > - ®ister_temp[7 * SPARC_INTREG_SIZE], > - REGISTER_RAW_SIZE (PSTATE_REGNUM)); > - /* FIXME: not sure what needs to be saved here. */ > + /* Y, PC, NPC, CCR, FSR */ > + read_register_bytes (REGISTER_BYTE (Y_REGNUM), > + ®ister_temp[0], > + REGISTER_RAW_SIZE (Y_REGNUM) * 5); > } > else > { > @@ -1111,14 +1108,10 @@ sparc_frame_find_saved_regs (struct fram > > if (GDB_TARGET_IS_SPARC64) > { > - for (regnum = PC_REGNUM; regnum < PC_REGNUM + 7; regnum++) > - { > - saved_regs_addr[regnum] = > - frame_addr + (regnum - PC_REGNUM) * SPARC_INTREG_SIZE > - - DUMMY_STACK_REG_BUF_SIZE; > - } > - saved_regs_addr[PSTATE_REGNUM] = > - frame_addr + 8 * SPARC_INTREG_SIZE - DUMMY_STACK_REG_BUF_SIZE; > + for (regnum = Y_REGNUM; regnum <= FSR_REGNUM; regnum++) > + saved_regs_addr[regnum] = > + frame_addr + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE > + - DUMMY_STACK_REG_BUF_SIZE; > } > else > for (regnum = Y_REGNUM; regnum < NUM_REGS; regnum++) > @@ -1173,7 +1166,6 @@ sparc_frame_find_saved_regs (struct fram > } > } > /* Otherwise, whatever we would get from ptrace(GETREGS) is accurate */ > - /* FIXME -- should this adjust for the sparc64 offset? */ > saved_regs_addr[SP_REGNUM] = FRAME_FP (fi); > } > > @@ -1224,6 +1216,14 @@ sparc_pop_frame (void) > write_register_gen (CPS_REGNUM, raw_buffer); > } > } > + else > + { > + if (fsr[FSR_REGNUM]) > + { > + read_memory (fsr[FSR_REGNUM], raw_buffer, SPARC_INTREG_SIZE); > + write_register_gen (FSR_REGNUM, raw_buffer); > + } > + } > } > if (fsr[G1_REGNUM]) > { > @@ -1289,10 +1289,19 @@ sparc_pop_frame (void) > } > > if (!(GDB_TARGET_IS_SPARC64)) > - if (fsr[PS_REGNUM]) > - write_register (PS_REGNUM, > - read_memory_integer (fsr[PS_REGNUM], > - REGISTER_RAW_SIZE (PS_REGNUM))); > + { > + if (fsr[PS_REGNUM]) > + write_register (PS_REGNUM, > + read_memory_integer (fsr[PS_REGNUM], > + REGISTER_RAW_SIZE (PS_REGNUM))); > + } > + else > + { > + if (fsr[CCR_REGNUM]) > + write_register (CCR_REGNUM, > + read_memory_integer (fsr[CCR_REGNUM], > + REGISTER_RAW_SIZE (CCR_REGNUM))); > + } > > if (fsr[Y_REGNUM]) > write_register (Y_REGNUM,