[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 New
Headers show
Series
  • RISC-V/Linux `gdbserver' support and associated fixes
Related show

Commit Message

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