FreeBSD/x86: Read segment base registers from NT_X86_SEGBASES.

FreeBSD kernels recently grew a new register core dump note containing
the base addresses of the %fs and %gs segments (corresponding to the
%fsbase and %gsbase registers).  Parse this note to permit inspecting
TLS variables in core dumps.  Native processes already supported TLS
via older ptrace() operations.
This commit is contained in:
John Baldwin
2022-04-01 13:16:46 -07:00
parent b5c2367c3a
commit f3215e1526
2 changed files with 36 additions and 0 deletions

View File

@ -37,6 +37,9 @@
16-bit segment registers. */
#define AMD64_FBSD_SIZEOF_GREGSET (22 * 8)
/* The segment base register set consists of 2 64-bit registers. */
#define AMD64_FBSD_SIZEOF_SEGBASES_REGSET (2 * 8)
/* Register maps. */
static const struct regcache_map_entry amd64_fbsd_gregmap[] =
@ -70,6 +73,13 @@ static const struct regcache_map_entry amd64_fbsd_gregmap[] =
{ 0 }
};
static const struct regcache_map_entry amd64_fbsd_segbases_regmap[] =
{
{ 1, AMD64_FSBASE_REGNUM, 0 },
{ 1, AMD64_GSBASE_REGNUM, 0 },
{ 0 }
};
/* This layout including fsbase and gsbase was adopted in FreeBSD
8.0. */
@ -120,6 +130,11 @@ const struct regset amd64_fbsd_gregset =
amd64_fbsd_gregmap, regcache_supply_regset, regcache_collect_regset
};
const struct regset amd64_fbsd_segbases_regset =
{
amd64_fbsd_segbases_regmap, regcache_supply_regset, regcache_collect_regset
};
/* Support for signal handlers. */
/* In a signal frame, rsp points to a 'struct sigframe' which is
@ -253,6 +268,9 @@ amd64fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
&amd64_fbsd_gregset, NULL, cb_data);
cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &amd64_fpregset,
NULL, cb_data);
cb (".reg-x86-segbases", AMD64_FBSD_SIZEOF_SEGBASES_REGSET,
AMD64_FBSD_SIZEOF_SEGBASES_REGSET, &amd64_fbsd_segbases_regset,
"segment bases", cb_data);
cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0), X86_XSTATE_SIZE (tdep->xcr0),
&amd64fbsd_xstateregset, "XSAVE extended state", cb_data);
}