From patchwork Sat Feb 1 20:21:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Maciej W. Rozycki" X-Patchwork-Id: 37643 Received: (qmail 122005 invoked by alias); 1 Feb 2020 20:21:10 -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 121996 invoked by uid 89); 1 Feb 2020 20:21:09 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-8.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_SHORT autolearn=ham version=3.3.1 spammy= X-HELO: esa6.hgst.iphmx.com Received: from esa6.hgst.iphmx.com (HELO esa6.hgst.iphmx.com) (216.71.154.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 01 Feb 2020 20:21:07 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1580588468; x=1612124468; h=date:from:to:cc:subject:in-reply-to:message-id: references:mime-version; bh=VlBxy2MEUsEc2wY3tBjuOhGZZVwF8CpELU5STReXkD8=; b=Sfj6wDn4GyotA4AJ2OzDJieXmtDFQZ9+fDFaOQ3tY5UuzPDTWmRBNnVG 2AfsxqdaJpwwah4pT4WHiZf3XsiTbCV3MUh/OfZfqn265PZVUo5AqA9MQ tNp7NaUVnEGGDeT+0rmonxXyU9+4P2KJv3S/0MXd6hIXjKOKsav8Q43jW NRVD0L4vuZbaB1gkUME2KxxiREI7lPjLbF5l13w9kOhEV7XNEZYTSYriA uiSn5i003INgzO+hz7n3PA/3znYtim8cH/Uor3UpvB2Za+Np/wb5k4lrF wFWv9tUKeiORfFaJV9VulDgLLvStn60CCKKkPhAh/uzUQrEtceZOtkrS4 w==; IronPort-SDR: V/Z1E6zK4ubUXAoieHXYBR6wgIFYOnS7MupvNK5T5K/TK4g/iyEv/igAcK0kr1vjbydpwa2tyO vBmIfu4oEDJEq8XGr6h1dabfUaiSsEqLBkOs9ATWNExFhAbroXV25DKCEffgpc6rj5trMw+gV6 4fmVfQBwWxJZGXJIP2mf8JtezARNeX3XbF+4OaNph8E/NE6nNht+7+irh5z3OmugWTvg/UmEvJ 2lbKiWkdc9rIxZ0vw2Wxfx4Od2Wt0U0lNielFAIuZf7sfkjEU7K+kQl+uvW9ieQ0y8Zh3f5ywG +6Q= Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 02 Feb 2020 04:21:07 +0800 IronPort-SDR: 9XyWFZzGTxv4vmSSeFyelZZrH/lJfl9tX9CF9kg/Ln0y2B9O6wHS2zyV+BxwkK7HyNcV7UVkCo lc5ums+CU+rFqQ5e1+zl0K3GiNQPVgtPDq3VPzwjqq2OyCLeYpFhqeDmkzJERBwnIGaLiVvMsm jR5UhI8rGXBXVbGIhrzLVHnJCf5NtF0w5XAxj3U9Gh294Yf82O5I4FXeEsqzROH6sld84qbn2W TnTW7DZXU0FxK1OdcksL6j9JGF7JeZ4b2scgNMqUH1KcOvUuGrnVhgE1LlcdaVQ6qlsVWqg8yU HIFZSEFZVaPH4Sxr4leKyb56 Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Feb 2020 12:14:13 -0800 IronPort-SDR: Tc9xKf6iW6Hf3z1rI0gfi7qICcxmtCAAsCsDxADwZVp7FgOfBLqstApeNS6FrX3eN+d1xaArgO M/Ovv2Q+FErnfDLDb9J8ikQ+Tie/PCdXwspqJqYNIRzK/AYTPkKBZgl3gmVapXxlfFms7VyVZw UQFKynBjf3QtLwULmLwbV33WC9oPl6fAY3GjsMklMiFEU7QIaxNbNXtKBLPGmf7T3qvtzRgFDt /5QJxFJAYp/LLg7nFrJveBL2vZdRHrXi4XkcTZIHTKu6j1TRFY8yRU+T4VGsBuEfF3T3cVpFgg m2s= WDCIronportException: Internal Received: from unknown (HELO redsun52) ([10.149.66.28]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Feb 2020 12:21:05 -0800 Date: Sat, 1 Feb 2020 20:21:02 +0000 (GMT) From: "Maciej W. Rozycki" To: gdb-patches@sourceware.org cc: Jim Wilson , Andrew Burgess , Palmer Dabbelt , Tom Tromey , guoren@kernel.org, lifang_xia@c-sky.com, yunhai_shang@c-sky.com, jiangshuai_li@c-sky.com Subject: [PATCH v5 2/3] RISC-V/Linux/native: Factor out target description determination In-Reply-To: Message-ID: References: User-Agent: Alpine 2.21 (LFD 202 2017-01-01) MIME-Version: 1.0 In preparation for RISC-V/Linux `gdbserver' support factor out parts of native target description determination code that can be shared between the programs. gdb/ * nat/riscv-linux-tdesc.h: New file. * nat/riscv-linux-tdesc.c: New file, taking code from... * riscv-linux-nat.c (riscv_linux_nat_target::read_description): ... here. * configure.nat : Add nat/riscv-linux-tdesc.o to NATDEPFILES. --- No changes from v4. No changes from v3. Changes from v2: - Carry the change to the FGR reference over from 1/3. New change in v2. --- gdb/configure.nat | 3 + gdb/nat/riscv-linux-tdesc.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ gdb/nat/riscv-linux-tdesc.h | 27 ++++++++++++++ gdb/riscv-linux-nat.c | 51 +-------------------------- 4 files changed, 115 insertions(+), 49 deletions(-) gdb-riscv-linux-nat-tdesc.diff Index: binutils-gdb/gdb/configure.nat =================================================================== --- binutils-gdb.orig/gdb/configure.nat +++ binutils-gdb/gdb/configure.nat @@ -276,7 +276,8 @@ case ${gdb_host} in ;; riscv*) # Host: RISC-V, running Linux - NATDEPFILES="${NATDEPFILES} riscv-linux-nat.o" + NATDEPFILES="${NATDEPFILES} riscv-linux-nat.o \ + nat/riscv-linux-tdesc.o" ;; s390) # Host: S390, running Linux Index: binutils-gdb/gdb/nat/riscv-linux-tdesc.c =================================================================== --- /dev/null +++ binutils-gdb/gdb/nat/riscv-linux-tdesc.c @@ -0,0 +1,83 @@ +/* GNU/Linux/RISC-V native target description support for GDB. + Copyright (C) 2020 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "gdbsupport/common-defs.h" + +#include "gdb_proc_service.h" +#include "arch/riscv.h" +#include "elf/common.h" +#include "nat/gdb_ptrace.h" +#include "nat/riscv-linux-tdesc.h" + +#include + +/* Work around glibc header breakage causing ELF_NFPREG not to be usable. */ +#ifndef NFPREG +# define NFPREG 33 +#endif + +/* Determine XLEN and FLEN and return a corresponding target description. */ + +const struct target_desc * +riscv_linux_read_description (int tid) +{ + struct riscv_gdbarch_features features; + elf_fpregset_t regs; + int flen; + + /* Figuring out xlen is easy. */ + features.xlen = sizeof (elf_greg_t); + + /* Start with no f-registers. */ + features.flen = 0; + + /* How much worth of f-registers can we fetch if any? */ + for (flen = sizeof (regs.__f.__f[0]); ; flen *= 2) + { + size_t regset_size; + struct iovec iov; + + /* Regsets have a uniform slot size, so we count FSCR like + an FP data register. */ + regset_size = ELF_NFPREG * flen; + if (regset_size > sizeof (regs)) + break; + + iov.iov_base = ®s; + iov.iov_len = regset_size; + if (ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, + (PTRACE_TYPE_ARG3) &iov) == -1) + { + switch (errno) + { + case EINVAL: + continue; + case EIO: + break; + default: + perror_with_name (_("Couldn't get registers")); + break; + } + } + else + features.flen = flen; + break; + } + + return riscv_create_target_description (features); +} Index: binutils-gdb/gdb/nat/riscv-linux-tdesc.h =================================================================== --- /dev/null +++ binutils-gdb/gdb/nat/riscv-linux-tdesc.h @@ -0,0 +1,27 @@ +/* GNU/Linux/RISC-V native target description support for GDB. + Copyright (C) 2020 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef NAT_RISCV_LINUX_TDESC_H +#define NAT_RISCV_LINUX_TDESC_H + +struct target_desc; + +/* Return a target description for the LWP identified by TID. */ +const struct target_desc *riscv_linux_read_description (int tid); + +#endif /* NAT_RISCV_LINUX_TDESC_H */ Index: binutils-gdb/gdb/riscv-linux-nat.c =================================================================== --- binutils-gdb.orig/gdb/riscv-linux-nat.c +++ binutils-gdb/gdb/riscv-linux-nat.c @@ -22,10 +22,11 @@ #include "linux-nat.h" #include "riscv-tdep.h" #include "inferior.h" -#include "target-descriptions.h" #include "elf/common.h" +#include "nat/riscv-linux-tdesc.h" + #include /* Work around glibc header breakage causing ELF_NFPREG not to be usable. */ @@ -200,53 +201,7 @@ fill_fpregset (const struct regcache *re const struct target_desc * riscv_linux_nat_target::read_description () { - struct riscv_gdbarch_features features; - elf_fpregset_t regs; - int flen; - int tid; - - /* Figuring out xlen is easy. */ - features.xlen = sizeof (elf_greg_t); - - tid = inferior_ptid.lwp (); - - /* Start with no f-registers. */ - features.flen = 0; - - /* How much worth of f-registers can we fetch if any? */ - for (flen = sizeof (regs.__f.__f[0]); ; flen *= 2) - { - size_t regset_size; - struct iovec iov; - - /* Regsets have a uniform slot size, so we count FSCR like - an FP data register. */ - regset_size = ELF_NFPREG * flen; - if (regset_size > sizeof (regs)) - break; - - iov.iov_base = ®s; - iov.iov_len = regset_size; - if (ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, - (PTRACE_TYPE_ARG3) &iov) == -1) - { - switch (errno) - { - case EINVAL: - continue; - case EIO: - break; - default: - perror_with_name (_("Couldn't get registers")); - break; - } - } - else - features.flen = flen; - break; - } - - return riscv_create_target_description (features); + return riscv_linux_read_description (inferior_ptid.lwp ()); } /* Fetch REGNUM (or all registers if REGNUM == -1) from the target