This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Make i386_get_longjmp_target 64-bit safe


This way, we can use it on x86-64 too.

Committed.

Mark


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* i386-tdep.c (i386_get_longjmp_target): Make usable on x86-64.
	* x86-64-tdep.c (x86_64_init_abi): Remove FIXME about
	i386_get_longjmp_target.

Index: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.108
diff -u -p -r1.108 i386-tdep.c
--- i386-tdep.c 5 Jan 2003 01:39:54 -0000 1.108
+++ i386-tdep.c 5 Jan 2003 14:02:16 -0000
@@ -891,15 +891,16 @@ i386_pop_frame (void)
 /* Figure out where the longjmp will land.  Slurp the args out of the
    stack.  We expect the first arg to be a pointer to the jmp_buf
    structure from which we extract the address that we will land at.
-   This address is copied into PC.  This routine returns true on
+   This address is copied into PC.  This routine returns non-zero on
    success.  */
 
 static int
 i386_get_longjmp_target (CORE_ADDR *pc)
 {
-  char buf[4];
+  char buf[8];
   CORE_ADDR sp, jb_addr;
   int jb_pc_offset = gdbarch_tdep (current_gdbarch)->jb_pc_offset;
+  int len = TARGET_PTR_BIT / TARGET_CHAR_BIT;
 
   /* If JB_PC_OFFSET is -1, we have no way to find out where the
      longjmp will land.  */
@@ -907,14 +908,14 @@ i386_get_longjmp_target (CORE_ADDR *pc)
     return 0;
 
   sp = read_register (SP_REGNUM);
-  if (target_read_memory (sp + 4, buf, 4))
+  if (target_read_memory (sp + len, buf, len))
     return 0;
 
-  jb_addr = extract_address (buf, 4);
-  if (target_read_memory (jb_addr + jb_pc_offset, buf, 4))
+  jb_addr = extract_address (buf, len);
+  if (target_read_memory (jb_addr + jb_pc_offset, buf, len))
     return 0;
 
-  *pc = extract_address (buf, 4);
+  *pc = extract_address (buf, len);
   return 1;
 }
 
Index: x86-64-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/x86-64-tdep.c,v
retrieving revision 1.45
diff -u -p -r1.45 x86-64-tdep.c
--- x86-64-tdep.c 5 Jan 2003 01:39:55 -0000 1.45
+++ x86-64-tdep.c 5 Jan 2003 14:02:17 -0000
@@ -967,10 +967,6 @@ x86_64_init_abi (struct gdbarch_info inf
   set_gdbarch_register_byte (gdbarch, x86_64_register_byte);
   set_gdbarch_register_virtual_type (gdbarch, x86_64_register_virtual_type);
 
-  /* FIXME: kettenis/20021026: As long as we don't support longjmp,
-     that is, as long as we have `tdep->jb_pc_offset == -1', using
-     i386_get_longjmp_target is fine.  */
-
   set_gdbarch_register_convertible (gdbarch, x86_64_register_convertible);
   set_gdbarch_register_convert_to_virtual (gdbarch,
 					   x86_64_register_convert_to_virtual);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]