mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
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:
@ -37,6 +37,9 @@
|
|||||||
16-bit segment registers. */
|
16-bit segment registers. */
|
||||||
#define AMD64_FBSD_SIZEOF_GREGSET (22 * 8)
|
#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. */
|
/* Register maps. */
|
||||||
|
|
||||||
static const struct regcache_map_entry amd64_fbsd_gregmap[] =
|
static const struct regcache_map_entry amd64_fbsd_gregmap[] =
|
||||||
@ -70,6 +73,13 @@ static const struct regcache_map_entry amd64_fbsd_gregmap[] =
|
|||||||
{ 0 }
|
{ 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
|
/* This layout including fsbase and gsbase was adopted in FreeBSD
|
||||||
8.0. */
|
8.0. */
|
||||||
|
|
||||||
@ -120,6 +130,11 @@ const struct regset amd64_fbsd_gregset =
|
|||||||
amd64_fbsd_gregmap, regcache_supply_regset, regcache_collect_regset
|
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. */
|
/* Support for signal handlers. */
|
||||||
|
|
||||||
/* In a signal frame, rsp points to a 'struct sigframe' which is
|
/* 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);
|
&amd64_fbsd_gregset, NULL, cb_data);
|
||||||
cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &amd64_fpregset,
|
cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &amd64_fpregset,
|
||||||
NULL, cb_data);
|
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),
|
cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0), X86_XSTATE_SIZE (tdep->xcr0),
|
||||||
&amd64fbsd_xstateregset, "XSAVE extended state", cb_data);
|
&amd64fbsd_xstateregset, "XSAVE extended state", cb_data);
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,9 @@
|
|||||||
/* The general-purpose regset consists of 19 32-bit slots. */
|
/* The general-purpose regset consists of 19 32-bit slots. */
|
||||||
#define I386_FBSD_SIZEOF_GREGSET (19 * 4)
|
#define I386_FBSD_SIZEOF_GREGSET (19 * 4)
|
||||||
|
|
||||||
|
/* The segment base register set consists of 2 32-bit registers. */
|
||||||
|
#define I386_FBSD_SIZEOF_SEGBASES_REGSET (2 * 4)
|
||||||
|
|
||||||
/* Register maps. */
|
/* Register maps. */
|
||||||
|
|
||||||
static const struct regcache_map_entry i386_fbsd_gregmap[] =
|
static const struct regcache_map_entry i386_fbsd_gregmap[] =
|
||||||
@ -61,6 +64,13 @@ static const struct regcache_map_entry i386_fbsd_gregmap[] =
|
|||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct regcache_map_entry i386_fbsd_segbases_regmap[] =
|
||||||
|
{
|
||||||
|
{ 1, I386_FSBASE_REGNUM, 0 },
|
||||||
|
{ 1, I386_GSBASE_REGNUM, 0 },
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
/* This layout including fsbase and gsbase was adopted in FreeBSD
|
/* This layout including fsbase and gsbase was adopted in FreeBSD
|
||||||
8.0. */
|
8.0. */
|
||||||
|
|
||||||
@ -103,6 +113,11 @@ const struct regset i386_fbsd_gregset =
|
|||||||
i386_fbsd_gregmap, regcache_supply_regset, regcache_collect_regset
|
i386_fbsd_gregmap, regcache_supply_regset, regcache_collect_regset
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const struct regset i386_fbsd_segbases_regset =
|
||||||
|
{
|
||||||
|
i386_fbsd_segbases_regmap, regcache_supply_regset, regcache_collect_regset
|
||||||
|
};
|
||||||
|
|
||||||
/* Support for signal handlers. */
|
/* Support for signal handlers. */
|
||||||
|
|
||||||
/* In a signal frame, esp points to a 'struct sigframe' which is
|
/* In a signal frame, esp points to a 'struct sigframe' which is
|
||||||
@ -316,6 +331,9 @@ i386fbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
|
|||||||
&i386_fbsd_gregset, NULL, cb_data);
|
&i386_fbsd_gregset, NULL, cb_data);
|
||||||
cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &i386_fpregset,
|
cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, &i386_fpregset,
|
||||||
NULL, cb_data);
|
NULL, cb_data);
|
||||||
|
cb (".reg-x86-segbases", I386_FBSD_SIZEOF_SEGBASES_REGSET,
|
||||||
|
I386_FBSD_SIZEOF_SEGBASES_REGSET, &i386_fbsd_segbases_regset,
|
||||||
|
"segment bases", cb_data);
|
||||||
|
|
||||||
if (tdep->xcr0 & X86_XSTATE_AVX)
|
if (tdep->xcr0 & X86_XSTATE_AVX)
|
||||||
cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0),
|
cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0),
|
||||||
|
Reference in New Issue
Block a user