*-fbsd-nat: Handle null inferior in read_description.

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 FreeBSD/amd64:

(gdb) target native
Done.  Use the "run" command to start a process.
(gdb) unset tdesc filename
Couldn't get registers: Operation not permitted.
This commit is contained in:
John Baldwin 2023-07-14 08:39:24 -07:00
parent 36b6b4594e
commit 97b6e0f6c8
4 changed files with 12 additions and 0 deletions

View file

@ -120,6 +120,9 @@ aarch64_fbsd_nat_target::store_registers (struct regcache *regcache,
const struct target_desc *
aarch64_fbsd_nat_target::read_description ()
{
if (inferior_ptid == null_ptid)
return this->beneath ()->read_description ();
aarch64_features features;
features.tls = have_regset (inferior_ptid, NT_ARM_TLS)? 1 : 0;
return aarch64_read_description (features);

View file

@ -310,6 +310,9 @@ amd64_fbsd_nat_target::read_description ()
struct reg regs;
int is64;
if (inferior_ptid == null_ptid)
return this->beneath ()->read_description ();
if (ptrace (PT_GETREGS, inferior_ptid.pid (),
(PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name (_("Couldn't get registers"));

View file

@ -93,6 +93,9 @@ arm_fbsd_nat_target::read_description ()
const struct target_desc *desc;
bool tls = false;
if (inferior_ptid == null_ptid)
return this->beneath ()->read_description ();
#ifdef PT_GETREGSET
tls = have_regset (inferior_ptid, NT_ARM_TLS) != 0;
#endif

View file

@ -315,6 +315,9 @@ i386_fbsd_nat_target::read_description ()
#endif
static int xmm_probed;
if (inferior_ptid == null_ptid)
return this->beneath ()->read_description ();
#ifdef PT_GETXSTATE_INFO
if (!xsave_probed)
{