From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4628 invoked by alias); 2 Dec 2014 15:21:17 -0000 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 Received: (qmail 4613 invoked by uid 89); 2 Dec 2014 15:21:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 02 Dec 2014 15:21:15 +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.14.4/8.14.4) with ESMTP id sB2FKaUX019318 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 2 Dec 2014 10:20:37 -0500 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sB2FKYNt032764; Tue, 2 Dec 2014 10:20:35 -0500 Message-ID: <547DD8C2.9000403@redhat.com> Date: Tue, 02 Dec 2014 15:21:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Andreas Arnez , gdb-patches@sourceware.org CC: Ulrich Weigand Subject: Re: [PATCH 2/2] S390: Fix gdbserver support for TDB References: <1417002962-3424-1-git-send-email-arnez@linux.vnet.ibm.com> <1417002962-3424-3-git-send-email-arnez@linux.vnet.ibm.com> <87iohvp77u.fsf@br87z6lw.de.ibm.com> In-Reply-To: <87iohvp77u.fsf@br87z6lw.de.ibm.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2014-12/txt/msg00031.txt.bz2 On 12/01/2014 06:15 PM, Andreas Arnez wrote: > But after a quick grep through the Linux kernel it seems that there are > currently only two regsets for which ENODATA can be returned: the TDB on > S390 and the iWMMXt state on ARM. I've pushed the PowerPC transactional memory ptrace support toward modeling from s390, and the current patches (iterating under review) will return ENODATA too, but for the exact same scenario, so sounds like we'll be good there too. > diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c > index 8b72523..42dd521 100644 > --- a/gdb/gdbserver/linux-arm-low.c > +++ b/gdb/gdbserver/linux-arm-low.c > @@ -199,6 +199,13 @@ arm_store_wmmxregset (struct regcache *regcache, const void *buf) > if (!(arm_hwcap & HWCAP_IWMMXT)) > return; What are the conditions the ARM kernel checks to return ENODATA for this regset? I'd assume that it'd be the case of the machine not really supporting iwmmxt, and thus the check above already catching this. > > + if (buf == NULL) > + { > + for (i = 0; i < 22; i++) > + supply_register (regcache, arm_num_regs + i, NULL); > + return; > + } > + It probably doesn't hurt to be explicit, but I should note that registers' are unavailable by default on gdbserver, so a 'if (buf == NULL) return;' probably would do as well: struct regcache * init_register_cache (struct regcache *regcache, const struct target_desc *tdesc, unsigned char *regbuf) ... regcache->register_status = xcalloc (1, tdesc->num_registers); gdb_assert (REG_UNAVAILABLE == 0); More importantly: > @@ -4300,7 +4308,8 @@ regsets_store_inferior_registers (struct regsets_info *regsets_info, > void *buf, *data; > int nt_type, res; > > - if (regset->size == 0 || regset_disabled (regsets_info, regset)) > + if (regset->size == 0 || regset_disabled (regsets_info, regset) > + || regset->fill_function == NULL) > { > regset ++; > continue; Doesn't this mean a write attempt to such a read-only regset "succeeds" silently instead of erroring? Does the test exercise this? How does GDB/native behave? > @@ -316,13 +310,32 @@ s390_store_system_call (struct regcache *regcache, const void *buf) > supply_register_by_name (regcache, "system_call", buf); > } > > +static void > +s390_store_tdb (struct regcache *regcache, const void *buf) > +{ > + int tdb0 = find_regno (regcache->tdesc, "tdb0"); > + int tr0 = find_regno (regcache->tdesc, "tr0"); > + int i; > + > + for (i = 0; i < 4; i++) > + supply_register (regcache, tdb0 + i, > + buf ? (const char *) buf + 8 * i : NULL); 'buf != NULL ? (const...' > + > + for (i = 0; i < 16; i++) > + supply_register (regcache, tr0 + i, > + buf ? (const char *) buf + 8 * (16 + i) : NULL); > +} 'buf != NULL ? (const...' Thanks, Pedro Alves