From 005328e3424c897b43ff0f6666bcf6f10efcb5d7 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sun, 20 Oct 2002 11:54:40 +0000 Subject: [PATCH] * configure.tgt (i[3456]86-*-openbsd*): Set gdb_target to obds. * config/i386/obsd.mt: New file. * i386bsd-nat.c (_initialize_i386bsd_nat): Introduce i386obsd_sc_pc_offset and i386obsd_sc_sp_offset; * i386obsd-nat.c (_initialize_i386obsd_nat): Set i386obsd_sigtramp_start and i386obsd_sigtramp_end instead of i386nbsd_sigtramp_start and i386nbsd_sigtramp_end. * i386obsd-tdep.c: New file. --- gdb/ChangeLog | 11 ++++ gdb/config/i386/obsd.mt | 3 + gdb/configure.tgt | 2 +- gdb/i386bsd-nat.c | 7 ++- gdb/i386obsd-nat.c | 8 +-- gdb/i386obsd-tdep.c | 122 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 gdb/config/i386/obsd.mt create mode 100644 gdb/i386obsd-tdep.c diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fbc672f85fc..9edd108e1b4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2002-10-20 Mark Kettenis + + * configure.tgt (i[3456]86-*-openbsd*): Set gdb_target to obds. + * config/i386/obsd.mt: New file. + * i386bsd-nat.c (_initialize_i386bsd_nat): Introduce + i386obsd_sc_pc_offset and i386obsd_sc_sp_offset; + * i386obsd-nat.c (_initialize_i386obsd_nat): Set + i386obsd_sigtramp_start and i386obsd_sigtramp_end instead of + i386nbsd_sigtramp_start and i386nbsd_sigtramp_end. + * i386obsd-tdep.c: New file. + 2002-10-19 Adam Fedor * objc-exp.y (name_not_typename): Fix invalid comment. diff --git a/gdb/config/i386/obsd.mt b/gdb/config/i386/obsd.mt new file mode 100644 index 00000000000..72ec51311cc --- /dev/null +++ b/gdb/config/i386/obsd.mt @@ -0,0 +1,3 @@ +# Target: Intel 386 running OpenBSD +TDEPFILES= i386-tdep.o i387-tdep.o i386bsd-tdep.o i386obsd-tdep.o corelow.o +TM_FILE= tm-i386.h diff --git a/gdb/configure.tgt b/gdb/configure.tgt index 85c686fee47..d272950a845 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -94,7 +94,7 @@ i[3456]86-ncr-*) gdb_target=ncr3000 ;; # OBSOLETE i[3456]86-*-aix*) gdb_target=i386aix ;; i[3456]86-*-bsd*) gdb_target=i386bsd ;; i[3456]86-*-netbsd*) gdb_target=nbsd ;; -i[3456]86-*-openbsd*) gdb_target=nbsd ;; # FIXME: needs its own target +i[3456]86-*-openbsd*) gdb_target=obsd ;; # OBSOLETE i[3456]86-*-os9k) gdb_target=i386os9k ;; i[3456]86-*-go32*) gdb_target=i386aout ;; i[3456]86-*-msdosdjgpp*) gdb_target=go32 ;; diff --git a/gdb/i386bsd-nat.c b/gdb/i386bsd-nat.c index 8a3acd4cf58..9e5b9a59e7a 100644 --- a/gdb/i386bsd-nat.c +++ b/gdb/i386bsd-nat.c @@ -400,11 +400,16 @@ _initialize_i386bsd_nat (void) extern int i386fbsd4_sc_sp_offset; #define SC_PC_OFFSET i386fbsd4_sc_pc_offset #define SC_SP_OFFSET i386fbsd4_sc_sp_offset -#elif defined (NetBSD) || defined (__NetBSD_Version__) || defined (OpenBSD) +#elif defined (NetBSD) || defined (__NetBSD_Version__) extern int i386nbsd_sc_pc_offset; extern int i386nbsd_sc_sp_offset; #define SC_PC_OFFSET i386nbsd_sc_pc_offset #define SC_SP_OFFSET i386nbsd_sc_sp_offset +#elif defined (OpenBSD) + extern int i386obsd_sc_pc_offset; + extern int i386obsd_sc_sp_offset; +#define SC_PC_OFFSET i386obsd_sc_pc_offset +#define SC_SP_OFFSET i386obsd_sc_sp_offset #else extern int i386bsd_sc_pc_offset; extern int i386bsd_sc_sp_offset; diff --git a/gdb/i386obsd-nat.c b/gdb/i386obsd-nat.c index 17ef922b82a..b2cdc2a7e58 100644 --- a/gdb/i386obsd-nat.c +++ b/gdb/i386obsd-nat.c @@ -44,16 +44,16 @@ _initialize_i386obsd_nat (void) int mib[2]; size_t len; - extern CORE_ADDR i386nbsd_sigtramp_start; - extern CORE_ADDR i386nbsd_sigtramp_end; + extern CORE_ADDR i386obsd_sigtramp_start; + extern CORE_ADDR i386obsd_sigtramp_end; mib[0] = CTL_VM; mib[1] = VM_PSSTRINGS; len = sizeof (_ps); if (sysctl (mib, 2, &_ps, &len, NULL, 0) == 0) { - i386nbsd_sigtramp_start = (CORE_ADDR)_ps.val - 128; - i386nbsd_sigtramp_end = (CORE_ADDR)_ps.val; + i386obsd_sigtramp_start = (CORE_ADDR)_ps.val - 128; + i386obsd_sigtramp_end = (CORE_ADDR)_ps.val; } } #endif diff --git a/gdb/i386obsd-tdep.c b/gdb/i386obsd-tdep.c new file mode 100644 index 00000000000..7f162379a54 --- /dev/null +++ b/gdb/i386obsd-tdep.c @@ -0,0 +1,122 @@ +/* Target-dependent code for OpenBSD/i386. + Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "defs.h" +#include "arch-utils.h" +#include "gdbcore.h" +#include "regcache.h" + +#include "i386-tdep.h" +#include "i387-tdep.h" + +/* Provide a prototype to silence -Wmissing-prototypes. */ +void _initialize_i386obsd_tdep (void); + +#define SIZEOF_STRUCT_REG (16 * 4) + +static void +i386obsd_supply_reg (char *regs, int regno) +{ + int i; + + for (i = 0; i <= 15; i++) + if (regno == i || regno == -1) + supply_register (i, regs + i * 4); +} + +static void +fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which, + CORE_ADDR ignore) +{ + char *regs, *fsave; + + /* We get everything from one section. */ + if (which != 0) + return; + + if (core_reg_size < (SIZEOF_STRUCT_REG + 108)) + { + warning ("Wrong size register set in core file."); + return; + } + + regs = core_reg_sect; + fsave = core_reg_sect + SIZEOF_STRUCT_REG; + + /* Integer registers. */ + i386obsd_supply_reg (regs, -1); + + /* Floating point registers. */ + i387_supply_fsave (fsave); +} + +static struct core_fns i386obsd_core_fns = +{ + bfd_target_unknown_flavour, /* core_flavour */ + default_check_format, /* check_format */ + default_core_sniffer, /* core_sniffer */ + fetch_core_registers, /* core_read_registers */ + NULL /* next */ +}; + + +CORE_ADDR i386obsd_sigtramp_start = 0xbfbfdf20; +CORE_ADDR i386obsd_sigtramp_end = 0xbfbfdff0; + +/* From . */ +int i386obsd_sc_pc_offset = 44; +int i386obsd_sc_sp_offset = 56; + +static void +i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + /* Obviously OpenBSD is BSD-based. */ + i386bsd_init_abi (info, gdbarch); + + /* OpenBSD uses -freg-struct-return by default. */ + tdep->struct_return = reg_struct_return; + + /* OpenBSD uses a different memory layout. */ + tdep->sigtramp_start = i386obsd_sigtramp_start; + tdep->sigtramp_end = i386obsd_sigtramp_end; + + /* OpenBSD has a `struct sigcontext' that's different from the + origional 4.3 BSD. */ + tdep->sc_pc_offset = i386obsd_sc_pc_offset; + tdep->sc_sp_offset = i386obsd_sc_sp_offset; +} + +void +_initialize_i386obsd_tdep (void) +{ + add_core_fns (&i386obsd_core_fns); + + /* FIXME: kettenis/20021020: Since OpenBSD/i386 binaries are + indistingushable from NetBSD/i386 a.out binaries, building a GDB + that should support both these targets will probably not work as + expected. */ +#define GDB_OSABI_OPENBSD_AOUT GDB_OSABI_NETBSD_AOUT + + gdbarch_register_osabi (bfd_arch_i386, GDB_OSABI_OPENBSD_AOUT, + i386obsd_init_abi); +} -- 2.30.2