From patchwork Wed Feb 22 02:09:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 19332 Received: (qmail 115774 invoked by alias); 22 Feb 2017 02:09:38 -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 112905 invoked by uid 89); 22 Feb 2017 02:09:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, FROM_LOCAL_NOVOWEL, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-languages-length:2853 X-HELO: mail-pg0-f66.google.com Received: from mail-pg0-f66.google.com (HELO mail-pg0-f66.google.com) (74.125.83.66) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 22 Feb 2017 02:09:34 +0000 Received: by mail-pg0-f66.google.com with SMTP id 1so13891059pgz.2 for ; Tue, 21 Feb 2017 18:09:35 -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=duX3NKKWx5SSJbIDzgE5aTF37ryn0fwp554Xg1bwG/g=; b=LVihJKKMXeN1gkmJh5VxEssCy1kzEc8XHaqJ1IieF5HgajJfipAJ4HWpKBPhQH8NNM eLvLiRC2c+eW0g56nVe8kjkT+acWFf3EXVE6R8f9zkZfNN9Qina1AizEuIq5Y/PolT80 c7bg1Q4XtGrlm8ftMUnUu1LrQGQ/V43zPSduhSs+zqcboKzeGE3iztsfKGcserqC2G/Q P24ADRk191CPayBkl15GgxH+gG/JRiKkAfm9gRrA7OXjcmcGwdL10CHKAjg4yi3utOgS vM4l2dxwQdnldYT9+Y9aX4hlVMYAXz/UIHzQNG3PyJrrIndR9ER6bFxyx/BnNSKOw8/T gvMw== X-Gm-Message-State: AMke39kMISolFc611/Dh5TjxSHmaljMeoUuhdjJX1L5zziXUA72KdUksE5sD1Uwql+IyDw== X-Received: by 10.99.94.198 with SMTP id s189mr39115575pgb.211.1487729373549; Tue, 21 Feb 2017 18:09:33 -0800 (PST) Received: from octofox.metropolis (corp.Cadence.COM. [158.140.1.28]) by smtp.gmail.com with ESMTPSA id 10sm43172676pfs.113.2017.02.21.18.09.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 21 Feb 2017 18:09:32 -0800 (PST) From: Max Filippov To: gdb-patches@sourceware.org Cc: Maxim Grigoriev , Woody LaRue , Marc Gauthier , Max Filippov Subject: [PATCH v2 4/5] gdbserver: xtensa: add call0 support Date: Tue, 21 Feb 2017 18:09:15 -0800 Message-Id: <1487729356-10432-5-git-send-email-jcmvbkbc@gmail.com> In-Reply-To: <1487729356-10432-1-git-send-email-jcmvbkbc@gmail.com> References: <1487729356-10432-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. gdb/gdbserver/ 2017-01-18 Max Filippov * 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. --- Changes v1->v2: - add missing spaces to type casts; - add parentheses to new conditions; - move directory name up in the commit message. gdb/gdbserver/linux-xtensa-low.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/gdb/gdbserver/linux-xtensa-low.c b/gdb/gdbserver/linux-xtensa-low.c index 98c0bf2..89efa05 100644 --- a/gdb/gdbserver/linux-xtensa-low.c +++ b/gdb/gdbserver/linux-xtensa-low.c @@ -45,6 +45,7 @@ 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 +73,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 +92,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 +107,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