OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [irix4-nat.c] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
/* Native support for the SGI Iris running IRIX version 4, for GDB.
/* Native support for the SGI Iris running IRIX version 4, for GDB.
   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1995
   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1995
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
   Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
   Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
   and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
   and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
   Implemented for Irix 4.x by Garrett A. Wollman.
   Implemented for Irix 4.x by Garrett A. Wollman.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#include "defs.h"
#include "defs.h"
#include "inferior.h"
#include "inferior.h"
#include "gdbcore.h"
#include "gdbcore.h"
 
 
#include <sys/time.h>
#include <sys/time.h>
#include <sys/procfs.h>
#include <sys/procfs.h>
#include <setjmp.h>             /* For JB_XXX.  */
#include <setjmp.h>             /* For JB_XXX.  */
 
 
/* Size of elements in jmpbuf */
/* Size of elements in jmpbuf */
 
 
#define JB_ELEMENT_SIZE 4
#define JB_ELEMENT_SIZE 4
 
 
typedef unsigned int greg_t;    /* why isn't this defined? */
typedef unsigned int greg_t;    /* why isn't this defined? */
 
 
static void
static void
fetch_core_registers PARAMS ((char *, unsigned int, int, CORE_ADDR));
fetch_core_registers PARAMS ((char *, unsigned int, int, CORE_ADDR));
 
 
/*
/*
 * See the comment in m68k-tdep.c regarding the utility of these functions.
 * See the comment in m68k-tdep.c regarding the utility of these functions.
 */
 */
 
 
void
void
supply_gregset (gregsetp)
supply_gregset (gregsetp)
     gregset_t *gregsetp;
     gregset_t *gregsetp;
{
{
  register int regi;
  register int regi;
  register greg_t *regp = (greg_t *) (gregsetp->gp_regs);
  register greg_t *regp = (greg_t *) (gregsetp->gp_regs);
  static char zerobuf[MAX_REGISTER_RAW_SIZE] =
  static char zerobuf[MAX_REGISTER_RAW_SIZE] =
  {0};
  {0};
 
 
  /* FIXME: somewhere, there should be a #define for the meaning
  /* FIXME: somewhere, there should be a #define for the meaning
     of this magic number 32; we should use that. */
     of this magic number 32; we should use that. */
  for (regi = 0; regi < 32; regi++)
  for (regi = 0; regi < 32; regi++)
    supply_register (regi, (char *) (regp + regi));
    supply_register (regi, (char *) (regp + regi));
 
 
  supply_register (PC_REGNUM, (char *) &(gregsetp->gp_pc));
  supply_register (PC_REGNUM, (char *) &(gregsetp->gp_pc));
  supply_register (HI_REGNUM, (char *) &(gregsetp->gp_mdhi));
  supply_register (HI_REGNUM, (char *) &(gregsetp->gp_mdhi));
  supply_register (LO_REGNUM, (char *) &(gregsetp->gp_mdlo));
  supply_register (LO_REGNUM, (char *) &(gregsetp->gp_mdlo));
  supply_register (CAUSE_REGNUM, (char *) &(gregsetp->gp_cause));
  supply_register (CAUSE_REGNUM, (char *) &(gregsetp->gp_cause));
 
 
  /* Fill inaccessible registers with zero.  */
  /* Fill inaccessible registers with zero.  */
  supply_register (BADVADDR_REGNUM, zerobuf);
  supply_register (BADVADDR_REGNUM, zerobuf);
}
}
 
 
void
void
fill_gregset (gregsetp, regno)
fill_gregset (gregsetp, regno)
     gregset_t *gregsetp;
     gregset_t *gregsetp;
     int regno;
     int regno;
{
{
  int regi;
  int regi;
  register greg_t *regp = (greg_t *) (gregsetp->gp_regs);
  register greg_t *regp = (greg_t *) (gregsetp->gp_regs);
 
 
  /* same FIXME as above wrt 32 */
  /* same FIXME as above wrt 32 */
  for (regi = 0; regi < 32; regi++)
  for (regi = 0; regi < 32; regi++)
    if ((regno == -1) || (regno == regi))
    if ((regno == -1) || (regno == regi))
      *(regp + regi) = *(greg_t *) & registers[REGISTER_BYTE (regi)];
      *(regp + regi) = *(greg_t *) & registers[REGISTER_BYTE (regi)];
 
 
  if ((regno == -1) || (regno == PC_REGNUM))
  if ((regno == -1) || (regno == PC_REGNUM))
    gregsetp->gp_pc = *(greg_t *) & registers[REGISTER_BYTE (PC_REGNUM)];
    gregsetp->gp_pc = *(greg_t *) & registers[REGISTER_BYTE (PC_REGNUM)];
 
 
  if ((regno == -1) || (regno == CAUSE_REGNUM))
  if ((regno == -1) || (regno == CAUSE_REGNUM))
    gregsetp->gp_cause = *(greg_t *) & registers[REGISTER_BYTE (CAUSE_REGNUM)];
    gregsetp->gp_cause = *(greg_t *) & registers[REGISTER_BYTE (CAUSE_REGNUM)];
 
 
  if ((regno == -1) || (regno == HI_REGNUM))
  if ((regno == -1) || (regno == HI_REGNUM))
    gregsetp->gp_mdhi = *(greg_t *) & registers[REGISTER_BYTE (HI_REGNUM)];
    gregsetp->gp_mdhi = *(greg_t *) & registers[REGISTER_BYTE (HI_REGNUM)];
 
 
  if ((regno == -1) || (regno == LO_REGNUM))
  if ((regno == -1) || (regno == LO_REGNUM))
    gregsetp->gp_mdlo = *(greg_t *) & registers[REGISTER_BYTE (LO_REGNUM)];
    gregsetp->gp_mdlo = *(greg_t *) & registers[REGISTER_BYTE (LO_REGNUM)];
}
}
 
 
/*
/*
 * Now we do the same thing for floating-point registers.
 * Now we do the same thing for floating-point registers.
 * We don't bother to condition on FP0_REGNUM since any
 * We don't bother to condition on FP0_REGNUM since any
 * reasonable MIPS configuration has an R3010 in it.
 * reasonable MIPS configuration has an R3010 in it.
 *
 *
 * Again, see the comments in m68k-tdep.c.
 * Again, see the comments in m68k-tdep.c.
 */
 */
 
 
void
void
supply_fpregset (fpregsetp)
supply_fpregset (fpregsetp)
     fpregset_t *fpregsetp;
     fpregset_t *fpregsetp;
{
{
  register int regi;
  register int regi;
  static char zerobuf[MAX_REGISTER_RAW_SIZE] =
  static char zerobuf[MAX_REGISTER_RAW_SIZE] =
  {0};
  {0};
 
 
  for (regi = 0; regi < 32; regi++)
  for (regi = 0; regi < 32; regi++)
    supply_register (FP0_REGNUM + regi,
    supply_register (FP0_REGNUM + regi,
                     (char *) &fpregsetp->fp_r.fp_regs[regi]);
                     (char *) &fpregsetp->fp_r.fp_regs[regi]);
 
 
  supply_register (FCRCS_REGNUM, (char *) &fpregsetp->fp_csr);
  supply_register (FCRCS_REGNUM, (char *) &fpregsetp->fp_csr);
 
 
  /* FIXME: how can we supply FCRIR_REGNUM?  SGI doesn't tell us. */
  /* FIXME: how can we supply FCRIR_REGNUM?  SGI doesn't tell us. */
  supply_register (FCRIR_REGNUM, zerobuf);
  supply_register (FCRIR_REGNUM, zerobuf);
}
}
 
 
void
void
fill_fpregset (fpregsetp, regno)
fill_fpregset (fpregsetp, regno)
     fpregset_t *fpregsetp;
     fpregset_t *fpregsetp;
     int regno;
     int regno;
{
{
  int regi;
  int regi;
  char *from, *to;
  char *from, *to;
 
 
  for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++)
  for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++)
    {
    {
      if ((regno == -1) || (regno == regi))
      if ((regno == -1) || (regno == regi))
        {
        {
          from = (char *) &registers[REGISTER_BYTE (regi)];
          from = (char *) &registers[REGISTER_BYTE (regi)];
          to = (char *) &(fpregsetp->fp_r.fp_regs[regi - FP0_REGNUM]);
          to = (char *) &(fpregsetp->fp_r.fp_regs[regi - FP0_REGNUM]);
          memcpy (to, from, REGISTER_RAW_SIZE (regi));
          memcpy (to, from, REGISTER_RAW_SIZE (regi));
        }
        }
    }
    }
 
 
  if ((regno == -1) || (regno == FCRCS_REGNUM))
  if ((regno == -1) || (regno == FCRCS_REGNUM))
    fpregsetp->fp_csr = *(unsigned *) &registers[REGISTER_BYTE (FCRCS_REGNUM)];
    fpregsetp->fp_csr = *(unsigned *) &registers[REGISTER_BYTE (FCRCS_REGNUM)];
}
}
 
 
 
 
/* Figure out where the longjmp will land.
/* Figure out where the longjmp will land.
   We expect the first arg to be a pointer to the jmp_buf structure from which
   We expect the first arg to be a pointer to the jmp_buf structure from which
   we extract the pc (JB_PC) that we will land at.  The pc is copied into PC.
   we extract the pc (JB_PC) that we will land at.  The pc is copied into PC.
   This routine returns true on success. */
   This routine returns true on success. */
 
 
int
int
get_longjmp_target (pc)
get_longjmp_target (pc)
     CORE_ADDR *pc;
     CORE_ADDR *pc;
{
{
  char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
  char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
  CORE_ADDR jb_addr;
  CORE_ADDR jb_addr;
 
 
  jb_addr = read_register (A0_REGNUM);
  jb_addr = read_register (A0_REGNUM);
 
 
  if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
  if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
                          TARGET_PTR_BIT / TARGET_CHAR_BIT))
                          TARGET_PTR_BIT / TARGET_CHAR_BIT))
    return 0;
    return 0;
 
 
  *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
  *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
 
 
  return 1;
  return 1;
}
}
 
 
static void
static void
fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
     char *core_reg_sect;
     char *core_reg_sect;
     unsigned core_reg_size;
     unsigned core_reg_size;
     int which;                 /* Unused */
     int which;                 /* Unused */
     CORE_ADDR reg_addr;        /* Unused */
     CORE_ADDR reg_addr;        /* Unused */
{
{
  if (core_reg_size != REGISTER_BYTES)
  if (core_reg_size != REGISTER_BYTES)
    {
    {
      warning ("wrong size gregset struct in core file");
      warning ("wrong size gregset struct in core file");
      return;
      return;
    }
    }
 
 
  memcpy ((char *) registers, core_reg_sect, core_reg_size);
  memcpy ((char *) registers, core_reg_sect, core_reg_size);
}
}


 
 
/* Register that we are able to handle irix4 core file formats.
/* Register that we are able to handle irix4 core file formats.
   FIXME: is this really bfd_target_unknown_flavour? */
   FIXME: is this really bfd_target_unknown_flavour? */
 
 
static struct core_fns irix4_core_fns =
static struct core_fns irix4_core_fns =
{
{
  bfd_target_unknown_flavour,           /* core_flavour */
  bfd_target_unknown_flavour,           /* core_flavour */
  default_check_format,                 /* check_format */
  default_check_format,                 /* check_format */
  default_core_sniffer,                 /* core_sniffer */
  default_core_sniffer,                 /* core_sniffer */
  fetch_core_registers,                 /* core_read_registers */
  fetch_core_registers,                 /* core_read_registers */
  NULL                                  /* next */
  NULL                                  /* next */
};
};
 
 
void
void
_initialize_core_irix4 ()
_initialize_core_irix4 ()
{
{
  add_core_fns (&irix4_core_fns);
  add_core_fns (&irix4_core_fns);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.