/* Target-dependent code for Intel 386 running LynxOS.
   Copyright 1993, 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 "gdbcore.h"
#include "inferior.h"
#include "regcache.h"
#include "target.h"

#include "i386-tdep.h"

/* Return the PC of the caller from the call frame.  Assumes the subr
   prologue has already been executed, and the frame pointer setup.
   If this is the outermost frame, we check to see if we are in a
   system call by examining the previous instruction.  If so, then the
   return PC is actually at SP+4 because system calls use a different
   calling sequence.  */

static CORE_ADDR
i386lynx_saved_pc_after_call (struct frame_info *frame)
{
  char opcode[7];
  static const unsigned char call_inst[] =
  { 0x9a, 0, 0, 0, 0, 8, 0 };	/* lcall 0x8,0x0 */

  read_memory_nobpt (frame->pc - 7, opcode, 7);
  if (memcmp (opcode, call_inst, 7) == 0)
    return read_memory_unsigned_integer (read_register (SP_REGNUM) + 4, 4);

  return read_memory_unsigned_integer (read_register (SP_REGNUM), 4);
}


/* LynxOS.  */
static void
i386lynx_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
  set_gdbarch_saved_pc_after_call (gdbarch, i386lynx_saved_pc_after_call);
}


static enum gdb_osabi
i386lynx_coff_osabi_sniffer (bfd *abfd)
{
  if (strcmp (bfd_get_target (abfd), "coff-i386-lynx") == 0)
    return GDB_OSABI_LYNXOS;

  return GDB_OSABI_UNKNOWN;
}


/* Provide a prototype to silence -Wmissing-prototypes.  */
void _initialize_i386lynx_tdep (void);

void
_initialize_i386lynx_tdep (void)
{
  gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_coff_flavour,
				  i386lynx_coff_osabi_sniffer);

  gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_LYNXOS,
			  i386lynx_init_abi);
}
