[v5,2/3] RISC-V/Linux/native: Factor out target description determination

Message ID alpine.LFD.2.21.2002011603080.14118@redsun52.ssa.fujisawa.hgst.com
State Committed
Headers

Commit Message

Maciej W. Rozycki Feb. 1, 2020, 8:21 p.m. UTC
  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 <linux> <riscv*>: 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
  

Comments

Andrew Burgess Feb. 5, 2020, 11:01 a.m. UTC | #1
* Maciej W. Rozycki <macro@wdc.com> [2020-02-01 20:21:02 +0000]:

> 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 <linux> <riscv*>: Add nat/riscv-linux-tdesc.o to
> 	NATDEPFILES.

This is good to apply.

Thanks,
Andrew



> ---
> 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 <http://www.gnu.org/licenses/>.  */
> +
> +#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 <sys/uio.h>
> +
> +/* 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 = &regs;
> +      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 <http://www.gnu.org/licenses/>.  */
> +
> +#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 <sys/ptrace.h>
>  
>  /* 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 = &regs;
> -      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
  
Maciej W. Rozycki Feb. 5, 2020, 5:24 p.m. UTC | #2
On Wed, 5 Feb 2020, Andrew Burgess wrote:

> > 	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 <linux> <riscv*>: Add nat/riscv-linux-tdesc.o to
> > 	NATDEPFILES.
> 
> This is good to apply.

 Committed now, thanks for your review.

  Maciej
  

Patch

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 <http://www.gnu.org/licenses/>.  */
+
+#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 <sys/uio.h>
+
+/* 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 = &regs;
+      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 <http://www.gnu.org/licenses/>.  */
+
+#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 <sys/ptrace.h>
 
 /* 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 = &regs;
-      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