Add gdbarch auxv parsing for OpenBSD.
authorMark Kettenis <kettenis@gnu.org>
Thu, 27 Feb 2014 12:47:00 +0000 (13:47 +0100)
committerMark Kettenis <kettenis@gnu.org>
Thu, 27 Feb 2014 12:47:00 +0000 (13:47 +0100)
gdb/Changelog:

        * obsd-tdep.c (obsd_auxv_parse): New function.
        (obsd_init_abi): Set auxv_parse.

gdb/ChangeLog
gdb/obsd-tdep.c

index 9f347de99b605db5726c448809bf11bb57c94699..8f446dfe5071f210c830e27ca165b7fd7822cd01 100644 (file)
@@ -1,4 +1,7 @@
-2014-02-17  Mark Kettenis  <kettenis@gnu.org>
+2014-02-27  Mark Kettenis  <kettenis@gnu.org>
+
+       * obsd-tdep.c (obsd_auxv_parse): New function.
+       (obsd_init_abi): Set auxv_parse.
 
        * gdbarch.sh (auxv_parse): New.
        * gdbarch.h: Regenerated.
index b94ee41ab694101bcd2ee5da63ff05dfe80db51d..ae8cb3c63d12dcce442cb12ccaa45fbc124e1403 100644 (file)
@@ -289,6 +289,31 @@ obsd_gdb_signal_to_target (struct gdbarch *gdbarch,
   return -1;
 }
 
+static int
+obsd_auxv_parse (struct gdbarch *gdbarch, gdb_byte **readptr,
+                gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
+{
+  struct type *int_type = builtin_type (gdbarch)->builtin_int;
+  struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
+  const int sizeof_auxv_type = TYPE_LENGTH (int_type);
+  const int sizeof_auxv_val = TYPE_LENGTH (ptr_type);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  gdb_byte *ptr = *readptr;
+
+  if (endptr == ptr)
+    return 0;
+
+  if (endptr - ptr < 2 * sizeof_auxv_val)
+    return -1;
+
+  *typep = extract_unsigned_integer (ptr, sizeof_auxv_type, byte_order);
+  ptr += sizeof_auxv_val;      /* Alignment.  */
+  *valp = extract_unsigned_integer (ptr, sizeof_auxv_val, byte_order);
+  ptr += sizeof_auxv_val;
+
+  *readptr = ptr;
+  return 1;
+}
 
 void
 obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
@@ -297,4 +322,7 @@ obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
                                      obsd_gdb_signal_from_target);
   set_gdbarch_gdb_signal_to_target (gdbarch,
                                    obsd_gdb_signal_to_target);
+
+  /* Unlike Linux, OpenBSD actually follows the ELF standard.  */
+  set_gdbarch_auxv_parse (gdbarch, obsd_auxv_parse);
 }