[2/4] *-linux-nat: Handle null inferior in read_description.

Message ID 20230526175742.66885-3-jhb@FreeBSD.org
State New
Headers
Series Handle null inferiors in target::read_description |

Commit Message

John Baldwin May 26, 2023, 5:57 p.m. UTC
  Don't invoke ptrace in the target read_description method if there is
not an active inferior to query via ptrace.  Instead, use the default
register set for the architecture.

Previously the native target could report an error from a failed
ptrace operation when fetching a tdesc without an attached process.
For example on Linux x86-64:

(gdb) target native
Done.  Use the "run" command to start a process.
(gdb) unset tdesc filename
Couldn't get CS register: No such process.
---
 gdb/aarch64-linux-nat.c | 3 +++
 gdb/arm-linux-nat.c     | 3 +++
 gdb/mips-linux-nat.c    | 3 +++
 gdb/ppc-linux-nat.c     | 3 +++
 gdb/riscv-linux-nat.c   | 3 +++
 gdb/s390-linux-nat.c    | 3 +++
 gdb/x86-linux-nat.c     | 3 +++
 7 files changed, 21 insertions(+)
  

Comments

Luis Machado June 12, 2023, 8:56 a.m. UTC | #1
Hi John,

Do you have an example of when this would happen? So, having no inferior and invoking ptrace?

I know this can happen for extended remote mode, but it isn't clear for native gdb.

On 5/26/23 18:57, John Baldwin wrote:
> Don't invoke ptrace in the target read_description method if there is
> not an active inferior to query via ptrace.  Instead, use the default
> register set for the architecture.
> 
> Previously the native target could report an error from a failed
> ptrace operation when fetching a tdesc without an attached process.
> For example on Linux x86-64:
> 
> (gdb) target native
> Done.  Use the "run" command to start a process.
> (gdb) unset tdesc filename
> Couldn't get CS register: No such process.
> ---
>  gdb/aarch64-linux-nat.c | 3 +++
>  gdb/arm-linux-nat.c     | 3 +++
>  gdb/mips-linux-nat.c    | 3 +++
>  gdb/ppc-linux-nat.c     | 3 +++
>  gdb/riscv-linux-nat.c   | 3 +++
>  gdb/s390-linux-nat.c    | 3 +++
>  gdb/x86-linux-nat.c     | 3 +++
>  7 files changed, 21 insertions(+)
> 
> diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
> index ecb2eeb9540..62f8825b9c8 100644
> --- a/gdb/aarch64-linux-nat.c
> +++ b/gdb/aarch64-linux-nat.c
> @@ -785,6 +785,9 @@ aarch64_linux_nat_target::read_description ()
>    gdb_byte regbuf[ARM_VFP3_REGS_SIZE];
>    struct iovec iovec;
>  
> +  if (inferior_ptid == null_ptid)
> +    return nullptr;
> +
>    tid = inferior_ptid.pid ();
>  
>    iovec.iov_base = regbuf;
> diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
> index ef3fa008adf..70c6bc684fa 100644
> --- a/gdb/arm-linux-nat.c
> +++ b/gdb/arm-linux-nat.c
> @@ -531,6 +531,9 @@ ps_get_thread_area (struct ps_prochandle *ph,
>  const struct target_desc *
>  arm_linux_nat_target::read_description ()
>  {
> +  if (inferior_ptid == null_ptid)
> +    return this->beneath ()->read_description ();
> +
>    CORE_ADDR arm_hwcap = linux_get_hwcap ();
>  
>    if (have_ptrace_getregset == TRIBOOL_UNKNOWN)
> diff --git a/gdb/mips-linux-nat.c b/gdb/mips-linux-nat.c
> index 972b5db8e76..1fa0e8c479c 100644
> --- a/gdb/mips-linux-nat.c
> +++ b/gdb/mips-linux-nat.c
> @@ -454,6 +454,9 @@ mips_linux_nat_target::register_u_offset (struct gdbarch *gdbarch,
>  const struct target_desc *
>  mips_linux_nat_target::read_description ()
>  {
> +  if (inferior_ptid == null_ptid)
> +    return _MIPS_SIM == _ABIO32 ? tdesc_mips_linux : tdesc_mips64_linux;
> +
>    static int have_dsp = -1;
>  
>    if (have_dsp < 0)
> diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
> index 42885deb45e..2f4799aa73a 100644
> --- a/gdb/ppc-linux-nat.c
> +++ b/gdb/ppc-linux-nat.c
> @@ -1941,6 +1941,9 @@ ppc_linux_nat_target::auxv_parse (const gdb_byte **readptr,
>  const struct target_desc *
>  ppc_linux_nat_target::read_description ()
>  {
> +  if (inferior_ptid == null_ptid)
> +    return ppc_linux_match_description (ppc_linux_no_features);
> +
>    int tid = inferior_ptid.pid ();
>  
>    if (have_ptrace_getsetevrregs)
> diff --git a/gdb/riscv-linux-nat.c b/gdb/riscv-linux-nat.c
> index 8be4a5ac3e5..5d325e633da 100644
> --- a/gdb/riscv-linux-nat.c
> +++ b/gdb/riscv-linux-nat.c
> @@ -201,6 +201,9 @@ fill_fpregset (const struct regcache *regcache, prfpregset_t *fpregs,
>  const struct target_desc *
>  riscv_linux_nat_target::read_description ()
>  {
> +  if (inferior_ptid == null_ptid)
> +    return nullptr;
> +
>    const struct riscv_gdbarch_features features
>      = riscv_linux_read_features (inferior_ptid.pid ());
>    return riscv_lookup_target_description (features);
> diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c
> index fc3917d30be..7d3b3cfe78b 100644
> --- a/gdb/s390-linux-nat.c
> +++ b/gdb/s390-linux-nat.c
> @@ -987,6 +987,9 @@ s390_linux_nat_target::auxv_parse (const gdb_byte **readptr,
>  const struct target_desc *
>  s390_linux_nat_target::read_description ()
>  {
> +  if (inferior_ptid == null_ptid)
> +    return nullptr;
> +
>    int tid = inferior_ptid.pid ();
>  
>    have_regset_last_break
> diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
> index fd2145244cc..87862b89eab 100644
> --- a/gdb/x86-linux-nat.c
> +++ b/gdb/x86-linux-nat.c
> @@ -115,6 +115,9 @@ x86_linux_nat_target::read_description ()
>    static uint64_t xcr0;
>    uint64_t xcr0_features_bits;
>  
> +  if (inferior_ptid == null_ptid)
> +    return nullptr;
> +
>    tid = inferior_ptid.pid ();
>  
>  #ifdef __x86_64__
  
John Baldwin June 12, 2023, 5:43 p.m. UTC | #2
On 6/12/23 1:56 AM, Luis Machado wrote:
> Hi John,
> 
> Do you have an example of when this would happen? So, having no inferior and invoking ptrace?

The example given in the log message provokes this reliably, that is running
"target native" followed by "unset tdesc filename".  It's more that you have an
inferior, it just doesn't have an attached process.
  

Patch

diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
index ecb2eeb9540..62f8825b9c8 100644
--- a/gdb/aarch64-linux-nat.c
+++ b/gdb/aarch64-linux-nat.c
@@ -785,6 +785,9 @@  aarch64_linux_nat_target::read_description ()
   gdb_byte regbuf[ARM_VFP3_REGS_SIZE];
   struct iovec iovec;
 
+  if (inferior_ptid == null_ptid)
+    return nullptr;
+
   tid = inferior_ptid.pid ();
 
   iovec.iov_base = regbuf;
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
index ef3fa008adf..70c6bc684fa 100644
--- a/gdb/arm-linux-nat.c
+++ b/gdb/arm-linux-nat.c
@@ -531,6 +531,9 @@  ps_get_thread_area (struct ps_prochandle *ph,
 const struct target_desc *
 arm_linux_nat_target::read_description ()
 {
+  if (inferior_ptid == null_ptid)
+    return this->beneath ()->read_description ();
+
   CORE_ADDR arm_hwcap = linux_get_hwcap ();
 
   if (have_ptrace_getregset == TRIBOOL_UNKNOWN)
diff --git a/gdb/mips-linux-nat.c b/gdb/mips-linux-nat.c
index 972b5db8e76..1fa0e8c479c 100644
--- a/gdb/mips-linux-nat.c
+++ b/gdb/mips-linux-nat.c
@@ -454,6 +454,9 @@  mips_linux_nat_target::register_u_offset (struct gdbarch *gdbarch,
 const struct target_desc *
 mips_linux_nat_target::read_description ()
 {
+  if (inferior_ptid == null_ptid)
+    return _MIPS_SIM == _ABIO32 ? tdesc_mips_linux : tdesc_mips64_linux;
+
   static int have_dsp = -1;
 
   if (have_dsp < 0)
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
index 42885deb45e..2f4799aa73a 100644
--- a/gdb/ppc-linux-nat.c
+++ b/gdb/ppc-linux-nat.c
@@ -1941,6 +1941,9 @@  ppc_linux_nat_target::auxv_parse (const gdb_byte **readptr,
 const struct target_desc *
 ppc_linux_nat_target::read_description ()
 {
+  if (inferior_ptid == null_ptid)
+    return ppc_linux_match_description (ppc_linux_no_features);
+
   int tid = inferior_ptid.pid ();
 
   if (have_ptrace_getsetevrregs)
diff --git a/gdb/riscv-linux-nat.c b/gdb/riscv-linux-nat.c
index 8be4a5ac3e5..5d325e633da 100644
--- a/gdb/riscv-linux-nat.c
+++ b/gdb/riscv-linux-nat.c
@@ -201,6 +201,9 @@  fill_fpregset (const struct regcache *regcache, prfpregset_t *fpregs,
 const struct target_desc *
 riscv_linux_nat_target::read_description ()
 {
+  if (inferior_ptid == null_ptid)
+    return nullptr;
+
   const struct riscv_gdbarch_features features
     = riscv_linux_read_features (inferior_ptid.pid ());
   return riscv_lookup_target_description (features);
diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c
index fc3917d30be..7d3b3cfe78b 100644
--- a/gdb/s390-linux-nat.c
+++ b/gdb/s390-linux-nat.c
@@ -987,6 +987,9 @@  s390_linux_nat_target::auxv_parse (const gdb_byte **readptr,
 const struct target_desc *
 s390_linux_nat_target::read_description ()
 {
+  if (inferior_ptid == null_ptid)
+    return nullptr;
+
   int tid = inferior_ptid.pid ();
 
   have_regset_last_break
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index fd2145244cc..87862b89eab 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -115,6 +115,9 @@  x86_linux_nat_target::read_description ()
   static uint64_t xcr0;
   uint64_t xcr0_features_bits;
 
+  if (inferior_ptid == null_ptid)
+    return nullptr;
+
   tid = inferior_ptid.pid ();
 
 #ifdef __x86_64__