/* Target-dependent code for NS32000 systems running NetBSD.
   Copyright 2002 Free Software Foundation, Inc. 
   Contributed by Wasabi Systems, 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 "ns32k-tdep.h"
#include "gdb_string.h"

static int
ns32knbsd_aout_in_solib_call_trampoline (CORE_ADDR pc, char *name)
{
  if (strcmp (name, "_DYNAMIC") == 0)
    return 1;

  return 0;
}

static void
ns32knbsd_init_abi_common (struct gdbarch_info info,
                           struct gdbarch *gdbarch)
{
  /* We only support machines with the 32382 FPU.  */
  ns32k_gdbarch_init_32382 (gdbarch);
}

static void
ns32knbsd_init_abi_aout (struct gdbarch_info info,
                         struct gdbarch *gdbarch)
{
  ns32knbsd_init_abi_common (info, gdbarch);

  set_gdbarch_in_solib_call_trampoline (gdbarch,
                                     ns32knbsd_aout_in_solib_call_trampoline);
}

static enum gdb_osabi
ns32knbsd_aout_osabi_sniffer (bfd *abfd)
{
  if (strcmp (bfd_get_target (abfd), "a.out-ns32k-netbsd") == 0)
    return GDB_OSABI_NETBSD_AOUT;

  return GDB_OSABI_UNKNOWN;
}

void
_initialize_ns32knbsd_tdep (void)
{
  gdbarch_register_osabi_sniffer (bfd_arch_ns32k, bfd_target_aout_flavour,
				  ns32knbsd_aout_osabi_sniffer);

  gdbarch_register_osabi (bfd_arch_ns32k, 0, GDB_OSABI_NETBSD_AOUT,
			  ns32knbsd_init_abi_aout);
}
