[2/8] Remove support for pre-5.0 FreeBSD/i386 signal trampolines.

Message ID 20210714140741.6460-3-jhb@FreeBSD.org
State New
Headers show
Series
  • Switch FreeBSD x86 to using register maps for GP registers
Related show

Commit Message

John Baldwin July 14, 2021, 2:07 p.m.
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(-)

-- 
2.31.1

Patch

diff --git a/gdb/i386-fbsd-tdep.c b/gdb/i386-fbsd-tdep.c
index 3e2b8a322b..6248eaf1c4 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;