/* Target-dependent code for OpenBSD/i386.
- Copyright (C) 1988-1989, 1991-1992, 1994, 1996, 2000-2012 Free
- Software Foundation, Inc.
+ Copyright (C) 1988-2016 Free Software Foundation, Inc.
This file is part of GDB.
#include "target.h"
#include "trad-frame.h"
-#include "gdb_assert.h"
-#include "gdb_string.h"
-
+#include "obsd-tdep.h"
#include "i386-tdep.h"
#include "i387-tdep.h"
#include "solib-svr4.h"
return 0;
/* Allocate buffer. */
- buf = alloca (buflen);
+ buf = (gdb_byte *) alloca (buflen);
/* Loop over all offsets. */
for (offset = i386obsd_sigreturn_offset; *offset != -1; offset++)
struct regcache *regcache, int regnum,
const void *regs, size_t len)
{
- const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
- const gdb_byte *gregs = regs;
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ const gdb_byte *gregs = (const gdb_byte *) regs;
gdb_assert (len >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE);
i387_supply_fsave (regcache, regnum, gregs + tdep->sizeof_gregset);
}
-static const struct regset *
-i386obsd_aout_regset_from_core_section (struct gdbarch *gdbarch,
- const char *sect_name,
- size_t sect_size)
+static const struct regset i386obsd_aout_gregset =
+ {
+ NULL, i386obsd_aout_supply_regset, NULL
+ };
+
+static void
+i386obsd_aout_iterate_over_regset_sections (struct gdbarch *gdbarch,
+ iterate_over_regset_sections_cb *cb,
+ void *cb_data,
+ const struct regcache *regcache)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
/* OpenBSD a.out core dumps don't use seperate register sets for the
general-purpose and floating-point registers. */
- if (strcmp (sect_name, ".reg") == 0
- && sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE)
- {
- if (tdep->gregset == NULL)
- tdep->gregset =
- regset_alloc (gdbarch, i386obsd_aout_supply_regset, NULL);
- return tdep->gregset;
- }
-
- return NULL;
+ cb (".reg", tdep->sizeof_gregset + I387_SIZEOF_FSAVE,
+ &i386obsd_aout_gregset, NULL, cb_data);
}
\f
int i;
if (*this_cache)
- return *this_cache;
+ return (struct trad_frame_cache *) *this_cache;
cache = trad_frame_cache_zalloc (this_frame);
*this_cache = cache;
sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM);
find_pc_partial_function (func, &name, NULL, NULL);
- if (name && strncmp (name, "Xintr", 5) == 0)
+ if (name && startswith (name, "Xintr"))
addr = sp + 8; /* It's an interrupt frame. */
else
addr = sp;
find_pc_partial_function (get_frame_pc (this_frame), &name, NULL, NULL);
return (name && (strcmp (name, "calltrap") == 0
|| strcmp (name, "syscall1") == 0
- || strncmp (name, "Xintr", 5) == 0
- || strncmp (name, "Xsoft", 5) == 0));
+ || startswith (name, "Xintr")
+ || startswith (name, "Xsoft")));
}
static const struct frame_unwind i386obsd_trapframe_unwind = {
/* Obviously OpenBSD is BSD-based. */
i386bsd_init_abi (info, gdbarch);
+ obsd_init_abi (info, gdbarch);
/* OpenBSD has a different `struct reg'. */
tdep->gregset_reg_offset = i386obsd_r_reg_offset;
i386obsd_init_abi (info, gdbarch);
/* OpenBSD a.out has a single register set. */
- set_gdbarch_regset_from_core_section
- (gdbarch, i386obsd_aout_regset_from_core_section);
+ set_gdbarch_iterate_over_regset_sections
+ (gdbarch, i386obsd_aout_iterate_over_regset_sections);
}
/* OpenBSD ELF. */