mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
Remove support for pre-5.0 FreeBSD/i386 signal trampolines.
The last relevant release (FreeBSD 4.11) was released in January of 2005.
This commit is contained in:
@ -37,12 +37,10 @@
|
|||||||
/* Return whether THIS_FRAME corresponds to a FreeBSD sigtramp
|
/* Return whether THIS_FRAME corresponds to a FreeBSD sigtramp
|
||||||
routine. */
|
routine. */
|
||||||
|
|
||||||
/* FreeBSD/i386 supports three different signal trampolines, one for
|
/* FreeBSD/i386 binaries running under an amd64 kernel use a different
|
||||||
versions before 4.0, a second for 4.x, and a third for 5.0 and
|
trampoline This trampoline differs from the i386 kernel trampoline
|
||||||
later. To complicate matters, FreeBSD/i386 binaries running under
|
in that it omits a middle section that conditionally restores
|
||||||
an amd64 kernel use a different set of trampolines. These
|
%gs. */
|
||||||
trampolines differ from the i386 kernel trampolines in that they
|
|
||||||
omit a middle section that conditionally restores %gs. */
|
|
||||||
|
|
||||||
static const gdb_byte i386fbsd_sigtramp_start[] =
|
static const gdb_byte i386fbsd_sigtramp_start[] =
|
||||||
{
|
{
|
||||||
@ -65,62 +63,6 @@ static const gdb_byte i386fbsd_sigtramp_end[] =
|
|||||||
0xcd, 0x80 /* int $0x80 */
|
0xcd, 0x80 /* int $0x80 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const gdb_byte i386fbsd_freebsd4_sigtramp_start[] =
|
|
||||||
{
|
|
||||||
0x8d, 0x44, 0x24, 0x14, /* lea SIGF_UC4(%esp),%eax */
|
|
||||||
0x50 /* pushl %eax */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const gdb_byte i386fbsd_freebsd4_sigtramp_middle[] =
|
|
||||||
{
|
|
||||||
0xf7, 0x40, 0x54, 0x00, 0x00, 0x02, 0x00,
|
|
||||||
/* testl $PSL_VM,UC4_EFLAGS(%eax) */
|
|
||||||
0x75, 0x03, /* jne +3 */
|
|
||||||
0x8e, 0x68, 0x14 /* mov UC4_GS(%eax),%gs */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const gdb_byte i386fbsd_freebsd4_sigtramp_end[] =
|
|
||||||
{
|
|
||||||
0xb8, 0x58, 0x01, 0x00, 0x00, /* movl $344,%eax */
|
|
||||||
0x50, /* pushl %eax */
|
|
||||||
0xcd, 0x80 /* int $0x80 */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const gdb_byte i386fbsd_osigtramp_start[] =
|
|
||||||
{
|
|
||||||
0x8d, 0x44, 0x24, 0x14, /* lea SIGF_SC(%esp),%eax */
|
|
||||||
0x50 /* pushl %eax */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const gdb_byte i386fbsd_osigtramp_middle[] =
|
|
||||||
{
|
|
||||||
0xf7, 0x40, 0x18, 0x00, 0x00, 0x02, 0x00,
|
|
||||||
/* testl $PSL_VM,SC_PS(%eax) */
|
|
||||||
0x75, 0x03, /* jne +3 */
|
|
||||||
0x8e, 0x68, 0x44 /* mov SC_GS(%eax),%gs */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const gdb_byte i386fbsd_osigtramp_end[] =
|
|
||||||
{
|
|
||||||
0xb8, 0x67, 0x00, 0x00, 0x00, /* movl $103,%eax */
|
|
||||||
0x50, /* pushl %eax */
|
|
||||||
0xcd, 0x80 /* int $0x80 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The three different trampolines are all the same size. */
|
|
||||||
gdb_static_assert (sizeof i386fbsd_sigtramp_start
|
|
||||||
== sizeof i386fbsd_freebsd4_sigtramp_start);
|
|
||||||
gdb_static_assert (sizeof i386fbsd_sigtramp_start
|
|
||||||
== sizeof i386fbsd_osigtramp_start);
|
|
||||||
gdb_static_assert (sizeof i386fbsd_sigtramp_middle
|
|
||||||
== sizeof i386fbsd_freebsd4_sigtramp_middle);
|
|
||||||
gdb_static_assert (sizeof i386fbsd_sigtramp_middle
|
|
||||||
== sizeof i386fbsd_osigtramp_middle);
|
|
||||||
gdb_static_assert (sizeof i386fbsd_sigtramp_end
|
|
||||||
== sizeof i386fbsd_freebsd4_sigtramp_end);
|
|
||||||
gdb_static_assert (sizeof i386fbsd_sigtramp_end
|
|
||||||
== sizeof i386fbsd_osigtramp_end);
|
|
||||||
|
|
||||||
/* We assume that the middle is the largest chunk below. */
|
/* We assume that the middle is the largest chunk below. */
|
||||||
gdb_static_assert (sizeof i386fbsd_sigtramp_middle
|
gdb_static_assert (sizeof i386fbsd_sigtramp_middle
|
||||||
> sizeof i386fbsd_sigtramp_start);
|
> sizeof i386fbsd_sigtramp_start);
|
||||||
@ -132,31 +74,13 @@ i386fbsd_sigtramp_p (struct frame_info *this_frame)
|
|||||||
{
|
{
|
||||||
CORE_ADDR pc = get_frame_pc (this_frame);
|
CORE_ADDR pc = get_frame_pc (this_frame);
|
||||||
gdb_byte buf[sizeof i386fbsd_sigtramp_middle];
|
gdb_byte buf[sizeof i386fbsd_sigtramp_middle];
|
||||||
const gdb_byte *middle, *end;
|
|
||||||
|
|
||||||
/* Look for a matching start. */
|
/* Look for a matching start. */
|
||||||
if (!safe_frame_unwind_memory (this_frame, pc,
|
if (!safe_frame_unwind_memory (this_frame, pc,
|
||||||
{buf, sizeof i386fbsd_sigtramp_start}))
|
{buf, sizeof i386fbsd_sigtramp_start}))
|
||||||
return 0;
|
return 0;
|
||||||
if (memcmp (buf, i386fbsd_sigtramp_start, sizeof i386fbsd_sigtramp_start)
|
if (memcmp (buf, i386fbsd_sigtramp_start, sizeof i386fbsd_sigtramp_start)
|
||||||
== 0)
|
!= 0)
|
||||||
{
|
|
||||||
middle = i386fbsd_sigtramp_middle;
|
|
||||||
end = i386fbsd_sigtramp_end;
|
|
||||||
}
|
|
||||||
else if (memcmp (buf, i386fbsd_freebsd4_sigtramp_start,
|
|
||||||
sizeof i386fbsd_freebsd4_sigtramp_start) == 0)
|
|
||||||
{
|
|
||||||
middle = i386fbsd_freebsd4_sigtramp_middle;
|
|
||||||
end = i386fbsd_freebsd4_sigtramp_end;
|
|
||||||
}
|
|
||||||
else if (memcmp (buf, i386fbsd_osigtramp_start,
|
|
||||||
sizeof i386fbsd_osigtramp_start) == 0)
|
|
||||||
{
|
|
||||||
middle = i386fbsd_osigtramp_middle;
|
|
||||||
end = i386fbsd_osigtramp_end;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Since the end is shorter than the middle, check for a matching end
|
/* Since the end is shorter than the middle, check for a matching end
|
||||||
@ -165,14 +89,15 @@ i386fbsd_sigtramp_p (struct frame_info *this_frame)
|
|||||||
if (!safe_frame_unwind_memory (this_frame, pc,
|
if (!safe_frame_unwind_memory (this_frame, pc,
|
||||||
{buf, sizeof i386fbsd_sigtramp_end}))
|
{buf, sizeof i386fbsd_sigtramp_end}))
|
||||||
return 0;
|
return 0;
|
||||||
if (memcmp (buf, end, sizeof i386fbsd_sigtramp_end) == 0)
|
if (memcmp (buf, i386fbsd_sigtramp_end, sizeof i386fbsd_sigtramp_end) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* If the end didn't match, check for a matching middle. */
|
/* If the end didn't match, check for a matching middle. */
|
||||||
if (!safe_frame_unwind_memory (this_frame, pc,
|
if (!safe_frame_unwind_memory (this_frame, pc,
|
||||||
{buf, sizeof i386fbsd_sigtramp_middle}))
|
{buf, sizeof i386fbsd_sigtramp_middle}))
|
||||||
return 0;
|
return 0;
|
||||||
if (memcmp (buf, middle, sizeof i386fbsd_sigtramp_middle) != 0)
|
if (memcmp (buf, i386fbsd_sigtramp_middle, sizeof i386fbsd_sigtramp_middle)
|
||||||
|
!= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* The middle matched, check for a matching end. */
|
/* The middle matched, check for a matching end. */
|
||||||
@ -180,7 +105,7 @@ i386fbsd_sigtramp_p (struct frame_info *this_frame)
|
|||||||
if (!safe_frame_unwind_memory (this_frame, pc,
|
if (!safe_frame_unwind_memory (this_frame, pc,
|
||||||
{buf, sizeof i386fbsd_sigtramp_end}))
|
{buf, sizeof i386fbsd_sigtramp_end}))
|
||||||
return 0;
|
return 0;
|
||||||
if (memcmp (buf, end, sizeof i386fbsd_sigtramp_end) != 0)
|
if (memcmp (buf, i386fbsd_sigtramp_end, sizeof i386fbsd_sigtramp_end) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
Reference in New Issue
Block a user