From patchwork Fri Jan 31 12:12:23 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: 37626 Received: (qmail 38648 invoked by alias); 31 Jan 2020 12:12:32 -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 38623 invoked by uid 89); 31 Jan 2020 12:12:31 -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: esa2.hgst.iphmx.com Received: from esa2.hgst.iphmx.com (HELO esa2.hgst.iphmx.com) (68.232.143.124) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 31 Jan 2020 12:12:29 +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=1580472764; x=1612008764; h=date:from:to:cc:subject:message-id:mime-version; bh=qx6FgMsGaTrraSqicYj5hMNbaicU/BXNYKLrOHd4PZ8=; b=WbKWl+Z/PPKAwTl8+qy5zLtjhNlHCbOd2fmbKLwVcHko6kjYjs5AM6G5 z85qzaG3YHGuUnlsF4y4pb+sk+zYy1h/N2o/0CtwvVyAWBp8wg2u0aQoA fYa1GGbG9F6jKTICJ7A2m4oyNdLhs3Djl0w/IauYwOIVC3Db7SnEKcuxH wgDJ7a4cjB+yPPS2vmAErdKjp4JkKqZhuSV2185pKGwPK4pM1LJvBHp/6 XBk0dMRrpw29yMc/Q/4vnNCz6PeIID6cZl93NVZbsPjujUBmk/7VcVDda kyJs0Bl0cHTsxzyqCYHerto20akzW2F9t5F3h5RHxaYezu3cYtiUrnRmx g==; IronPort-SDR: Sy9rpbhiXCL3KxD4spdgLfDIJJ0gTd8JN5mYOKKSaacDyJ32lZE7oq+LZhBazuca5ODbxeBA+a 1/f4x5H2ASCPwEkoYS6xqgYoFtak4c4rzHV5MbDCKcPqrcjYvmYQQvtnBdGRf81LRYNtUqBMB2 LzKK/qxOZltvU71veOn9TuyzojFSCWAzb+ARQ9bbS1Kt0qRNbL8q/cDoAH6QMaImzcAB+eJ8i3 AVdZGhEGq33JO9LsN0zuSjefLKTLN0uSWi6UmybFLzebjnx4k9k+AjoNyLBzo0KFGBCjLqGxWQ YD0= Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 31 Jan 2020 20:12:40 +0800 IronPort-SDR: us6pmllnwrvs0UUvHRrEVyI9+PGXksWyavFgAMWjtoWzDbJPPKI6OreZd8nt+g27yn5DCuuN11 gIDMZPLcvAZy5GwkLaO4jtur0fEm+PvQL8qgA+gUiJruvFPUfxbSbg7ScvnyfwlsZkma8KIuEf G3w3dcmwwycT08Yj3hQ6h7+jNazbTzYTnyhQ/ZPx969+sfQ8C8Bb0ItMAMxqASzLWU7H4i3vcb 3kdwjlhVqicedyauFxrk9FdjhMaWwkOQhNQTaQpChYnXY/jkgv31pixSOMfxSGaliJGooq+Az4 kqxYfenG5PjwgBUAqYIjYwQR 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; 31 Jan 2020 04:05:36 -0800 IronPort-SDR: E5QZZmHna5wEsxpvUSgO6U2blBjU/bEfKUREX1e87ld9JSjGd+UZSrXlVWDmH0RT7qEoTTOf8O TNvDOwOiSjw/85PlaJn93q+JxL2luEiGtKlbVV8vCB/eOz2bpuhGtSIENohu7x7kXgcUTe/8Pt 7NMOh/T6lGajYEdsCy7x6AHze/7lWX5z+XtCrl9BqO87JWoNaYfY7Flwb67g0Cl3FsaKsUmhCD 60qEnRlLpVbo/oS7EHfXenHTEF4uHCeNqsurgy2TXkuIn8vN5UvErFvKtuypJuEZrX9+F1gGNl 3sY= 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; 31 Jan 2020 04:12:25 -0800 Date: Fri, 31 Jan 2020 12:12:23 +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 v3 2/3] RISC-V/Linux/native: Factor out target description determination Message-ID: 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. --- 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