From bf84b776bda0945300f40432580156af99c000f6 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 28 Jan 2022 11:14:37 -0800 Subject: [PATCH] Remove support for pre-5.0 FreeBSD/i386 signal trampolines. The last relevant release (FreeBSD 4.11) was released in January of 2005. --- gdb/i386-fbsd-tdep.c | 93 +++++--------------------------------------- 1 file changed, 9 insertions(+), 84 deletions(-) diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c index f09a4947e98..8c19b447243 100644 --- a/gdb/i386-fbsd-tdep.c +++ b/gdb/i386-fbsd-tdep.c @@ -37,12 +37,10 @@ /* Return whether THIS_FRAME corresponds to a FreeBSD sigtramp routine. */ -/* FreeBSD/i386 supports three different signal trampolines, one for - versions before 4.0, a second for 4.x, and a third for 5.0 and - later. To complicate matters, FreeBSD/i386 binaries running under - an amd64 kernel use a different set of trampolines. These - trampolines differ from the i386 kernel trampolines in that they - omit a middle section that conditionally restores %gs. */ +/* FreeBSD/i386 binaries running under an amd64 kernel use a different + trampoline This trampoline differs from the i386 kernel trampoline + in that it omits a middle section that conditionally restores + %gs. */ static const gdb_byte i386fbsd_sigtramp_start[] = { @@ -65,62 +63,6 @@ static const gdb_byte i386fbsd_sigtramp_end[] = 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. */ gdb_static_assert (sizeof i386fbsd_sigtramp_middle > sizeof i386fbsd_sigtramp_start); @@ -132,31 +74,13 @@ i386fbsd_sigtramp_p (struct frame_info *this_frame) { CORE_ADDR pc = get_frame_pc (this_frame); gdb_byte buf[sizeof i386fbsd_sigtramp_middle]; - const gdb_byte *middle, *end; /* Look for a matching start. */ if (!safe_frame_unwind_memory (this_frame, pc, {buf, sizeof i386fbsd_sigtramp_start})) return 0; if (memcmp (buf, i386fbsd_sigtramp_start, sizeof i386fbsd_sigtramp_start) - == 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 + != 0) return 0; /* 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, {buf, sizeof i386fbsd_sigtramp_end})) return 0; - if (memcmp (buf, end, sizeof i386fbsd_sigtramp_end) == 0) + if (memcmp (buf, i386fbsd_sigtramp_end, sizeof i386fbsd_sigtramp_end) == 0) return 1; /* If the end didn't match, check for a matching middle. */ if (!safe_frame_unwind_memory (this_frame, pc, {buf, sizeof i386fbsd_sigtramp_middle})) return 0; - if (memcmp (buf, middle, sizeof i386fbsd_sigtramp_middle) != 0) + if (memcmp (buf, i386fbsd_sigtramp_middle, sizeof i386fbsd_sigtramp_middle) + != 0) return 0; /* 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, {buf, sizeof i386fbsd_sigtramp_end})) 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 1; -- 2.30.2