From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18522 invoked by alias); 22 Nov 2011 16:06:38 -0000 Received: (qmail 18482 invoked by uid 22791); 22 Nov 2011 16:06:34 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL,BAYES_00,FROM_12LTRDOM,TW_EG X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 22 Nov 2011 16:06:20 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1RSsrT-0002IG-Mh from Maciej_Rozycki@mentor.com for gdb-patches@sourceware.org; Tue, 22 Nov 2011 08:06:19 -0800 Received: from SVR-IES-FEM-01.mgc.mentorg.com ([137.202.0.104]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 22 Nov 2011 08:03:22 -0800 Received: from [172.30.6.30] (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.1.289.1; Tue, 22 Nov 2011 16:06:17 +0000 Date: Tue, 22 Nov 2011 16:06:00 -0000 From: "Maciej W. Rozycki" To: Subject: [PATCH] Linux/gdbserver: Factor out usr_store_inferior_registers Message-ID: User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" 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: 2011-11/txt/msg00584.txt.bz2 Hi, While working on a MIPS/Linux DSP support change I am about to submit I have tripped over usr_fetch_inferior_registers and usr_store_inferior_registers being structured in a different way even though the make complementing actions and there's no obvious reason for them to be designed like this. Specifically usr_fetch_inferior_registers uses a helper to retrieve individual registers but usr_store_inferior_registers recurses into itself instead. The change below makes the two functions consistent, usr_store_inferior_registers now uses a store_register helper exactly like usr_fetch_inferior_registers uses fetch_register. No regressions on i686-linux-gnu or mips-linux-gnu (I had to force srv_linux_regsets to "no" and deal with some bitrot of that configuration to get indicative results). OK to apply? 2011-11-22 Maciej W. Rozycki gdb/gdbserver/ * linux-low.c (usr_store_inferior_registers): Factor out code to handle individual registers into... (store_register): ... this new function. Maciej gdb-gdbserver-linux-store-inferior.diff Index: gdb-fsf-trunk-quilt/gdb/gdbserver/linux-low.c =================================================================== --- gdb-fsf-trunk-quilt.orig/gdb/gdbserver/linux-low.c 2011-11-17 19:36:30.000000000 +0000 +++ gdb-fsf-trunk-quilt/gdb/gdbserver/linux-low.c 2011-11-17 19:47:38.345612518 +0000 @@ -3768,6 +3768,60 @@ fetch_register (struct regcache *regcach supply_register (regcache, regno, buf); } +/* Store one register. */ +static void +store_register (struct regcache *regcache, int regno) +{ + CORE_ADDR regaddr; + int i, size; + char *buf; + int pid; + + if (regno >= the_low_target.num_regs) + return; + + if ((*the_low_target.cannot_store_register) (regno) == 1) + return; + + regaddr = register_addr (regno); + if (regaddr == -1) + return; + errno = 0; + size = (register_size (regno) + sizeof (PTRACE_XFER_TYPE) - 1) + & - sizeof (PTRACE_XFER_TYPE); + buf = alloca (size); + memset (buf, 0, size); + + if (the_low_target.collect_ptrace_register) + the_low_target.collect_ptrace_register (regcache, regno, buf); + else + collect_register (regcache, regno, buf); + + pid = lwpid_of (get_thread_lwp (current_inferior)); + for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE)) + { + errno = 0; + ptrace (PTRACE_POKEUSER, pid, + /* Coerce to a uintptr_t first to avoid potential gcc warning + about coercing an 8 byte integer to a 4 byte pointer. */ + (PTRACE_ARG3_TYPE) (uintptr_t) regaddr, + (PTRACE_ARG4_TYPE) *(PTRACE_XFER_TYPE *) (buf + i)); + if (errno != 0) + { + /* At this point, ESRCH should mean the process is + already gone, in which case we simply ignore attempts + to change its registers. See also the related + comment in linux_resume_one_lwp. */ + if (errno == ESRCH) + return; + + if ((*the_low_target.cannot_store_register) (regno) == 0) + error ("writing register %d: %s", regno, strerror (errno)); + } + regaddr += sizeof (PTRACE_XFER_TYPE); + } +} + /* Fetch all registers, or just one, from the child process. */ static void usr_fetch_inferior_registers (struct regcache *regcache, int regno) @@ -3785,60 +3839,11 @@ usr_fetch_inferior_registers (struct reg static void usr_store_inferior_registers (struct regcache *regcache, int regno) { - CORE_ADDR regaddr; - int i, size; - char *buf; - int pid; - - if (regno >= 0) - { - if (regno >= the_low_target.num_regs) - return; - - if ((*the_low_target.cannot_store_register) (regno) == 1) - return; - - regaddr = register_addr (regno); - if (regaddr == -1) - return; - errno = 0; - size = (register_size (regno) + sizeof (PTRACE_XFER_TYPE) - 1) - & - sizeof (PTRACE_XFER_TYPE); - buf = alloca (size); - memset (buf, 0, size); - - if (the_low_target.collect_ptrace_register) - the_low_target.collect_ptrace_register (regcache, regno, buf); - else - collect_register (regcache, regno, buf); - - pid = lwpid_of (get_thread_lwp (current_inferior)); - for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE)) - { - errno = 0; - ptrace (PTRACE_POKEUSER, pid, - /* Coerce to a uintptr_t first to avoid potential gcc warning - about coercing an 8 byte integer to a 4 byte pointer. */ - (PTRACE_ARG3_TYPE) (uintptr_t) regaddr, - (PTRACE_ARG4_TYPE) *(PTRACE_XFER_TYPE *) (buf + i)); - if (errno != 0) - { - /* At this point, ESRCH should mean the process is - already gone, in which case we simply ignore attempts - to change its registers. See also the related - comment in linux_resume_one_lwp. */ - if (errno == ESRCH) - return; - - if ((*the_low_target.cannot_store_register) (regno) == 0) - error ("writing register %d: %s", regno, strerror (errno)); - } - regaddr += sizeof (PTRACE_XFER_TYPE); - } - } - else + if (regno == -1) for (regno = 0; regno < the_low_target.num_regs; regno++) - usr_store_inferior_registers (regcache, regno); + store_register (regcache, regno); + else + store_register (regcache, regno); } #endif /* HAVE_LINUX_USRREGS */