From patchwork Wed Jan 18 23:50:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 18949 Received: (qmail 15230 invoked by alias); 18 Jan 2017 23:51:12 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 14925 invoked by uid 89); 18 Jan 2017 23:51:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, FROM_LOCAL_NOVOWEL, HK_RANDOM_ENVFROM, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=no version=3.3.2 spammy=946, H*Ad:U*marc, 3915, Hx-spam-relays-external:209.85.192.194 X-HELO: mail-pf0-f194.google.com Received: from mail-pf0-f194.google.com (HELO mail-pf0-f194.google.com) (209.85.192.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 18 Jan 2017 23:51:10 +0000 Received: by mail-pf0-f194.google.com with SMTP id e4so1997516pfg.0 for ; Wed, 18 Jan 2017 15:51:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OvrRj7zlZ9PgB5ljG1Az64b5m9QwzzcLmrsDogqUtsI=; b=juFp4D+DBSKw6G0+ViSaWd14SSj/7NXk7XljydenEGIqWnVsN8lW38RXxNgOXOca+/ kdSeRxxLJkHat2mG7+gZYqMagVLpNmkfyvBnD1UQcFjNRZYwCqJIHNxOXIH+UbSNmkBr jtdcQ96vrdFVTdM3A9TwY02CPe+nTi+ktOqWbslK8coF9X0Ib8WaSudPUEHM3uMzTwa1 fXqtjrwVUw8Y9TS0S+wDLllqQ89bChE3jrW1xGN1D+4xWug5wLtN2B5S1QkHO6e2QByA nunduBDY9F6RdVK+79UeyahG58YxmUvEgSwkHumaVgoGPohv3R4NrelkjEMrrCUaBXu+ 7t9A== X-Gm-Message-State: AIkVDXJOMETIwfFMjNsjt8NDGu/ZjgI8xCrtkSIhSPkl2BtdPXM0afoCcYKo8ZH+lqpE3Q== X-Received: by 10.98.56.196 with SMTP id f187mr6702528pfa.131.1484783468352; Wed, 18 Jan 2017 15:51:08 -0800 (PST) Received: from octofox.metropolis (corp.Cadence.COM. [158.140.1.28]) by smtp.gmail.com with ESMTPSA id u14sm3320413pfg.18.2017.01.18.15.51.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 18 Jan 2017 15:51:07 -0800 (PST) From: Max Filippov To: gdb-patches@sourceware.org Cc: Maxim Grigoriev , Woody LaRue , Marc Gauthier , Max Filippov Subject: [PATCH 3/3] gdbserver: xtensa: add call0 support Date: Wed, 18 Jan 2017 15:50:38 -0800 Message-Id: <1484783438-13780-4-git-send-email-jcmvbkbc@gmail.com> In-Reply-To: <1484783438-13780-1-git-send-email-jcmvbkbc@gmail.com> References: <1484783438-13780-1-git-send-email-jcmvbkbc@gmail.com> Correctly handle a0- registers on requests from remote gdb. This fixes 'Register 1 is not available' and subsequent assertion in the remote gdb connecting to the gdbserver: 'findvar.c:291: internal-error: value_of_register_lazy: Assertion `frame_id_p(get_frame_id (frame))' failed.' The register structure is the same for windowed and call0 ABIs because currently linux kernel internally requires windowed registers, so they are always present. 2017-01-18 Max Filippov gdb/gdbserver/ * linux-xtensa-low.c (C0_NREGS): New definition. (xtensa_fill_gregset): Call collect_register for all registers in a0_regnum..a0_regnum + C0_NREGS range. (xtensa_store_gregset): Call supply_register for all registers in a0_regnum..a0_regnum + C0_NREGS range. --- gdb/gdbserver/linux-xtensa-low.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/gdb/gdbserver/linux-xtensa-low.c b/gdb/gdbserver/linux-xtensa-low.c index 98c0bf2..73fbfe2 100644 --- a/gdb/gdbserver/linux-xtensa-low.c +++ b/gdb/gdbserver/linux-xtensa-low.c @@ -39,12 +39,15 @@ enum regnum { R_A0 = 64 }; +#define C0_NREGS 16 + static void xtensa_fill_gregset (struct regcache *regcache, void *buf) { elf_greg_t* rset = (elf_greg_t*)buf; const struct target_desc *tdesc = regcache->tdesc; int ar0_regnum; + int a0_regnum; char *ptr; int i; @@ -72,6 +75,17 @@ xtensa_fill_gregset (struct regcache *regcache, void *buf) collect_register_by_name (regcache, "ps", (char*)&rset[R_PS]); collect_register_by_name (regcache, "windowbase", (char*)&rset[R_WB]); collect_register_by_name (regcache, "windowstart", (char*)&rset[R_WS]); + + a0_regnum = find_regno (tdesc, "a0"); + ptr = (char *)&rset[R_A0 + 4 * rset[R_WB]]; + + for (i = a0_regnum; i < a0_regnum + C0_NREGS; i++) + { + if (4 * rset[R_WB] + i - a0_regnum == XCHAL_NUM_AREGS) + ptr = (char *)&rset[R_A0]; + collect_register (regcache, i, ptr); + ptr += register_size (tdesc, i); + } } static void @@ -80,6 +94,7 @@ xtensa_store_gregset (struct regcache *regcache, const void *buf) const elf_greg_t* rset = (const elf_greg_t*)buf; const struct target_desc *tdesc = regcache->tdesc; int ar0_regnum; + int a0_regnum; char *ptr; int i; @@ -94,6 +109,17 @@ xtensa_store_gregset (struct regcache *regcache, const void *buf) ptr += register_size (tdesc, i); } + a0_regnum = find_regno (tdesc, "a0"); + ptr = (char *)&rset[R_A0 + (4 * rset[R_WB]) % XCHAL_NUM_AREGS]; + + for (i = a0_regnum; i < a0_regnum + C0_NREGS; i++) + { + if (4 * rset[R_WB] + i - a0_regnum == XCHAL_NUM_AREGS) + ptr = (char *)&rset[R_A0]; + supply_register (regcache, i, ptr); + ptr += register_size (tdesc, i); + } + /* Loop registers, if hardware has it. */ #if XCHAL_HAVE_LOOPS