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

Subversion Repositories or1k

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

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

Rev 104 Rev 105
/* Native-dependent code for BSD Unix running on i386's, for GDB.
/* Native-dependent code for BSD Unix running on i386's, for GDB.
   Copyright 1988, 1989, 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
   Copyright 1988, 1989, 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
 
 
   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"
 
 
#ifdef FETCH_INFERIOR_REGISTERS
#ifdef FETCH_INFERIOR_REGISTERS
#include <sys/types.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/ptrace.h>
#include <machine/reg.h>
#include <machine/reg.h>
#include <machine/frame.h>
#include <machine/frame.h>
#include "inferior.h"
#include "inferior.h"
#include "gdbcore.h" /* for registers_fetched() */
#include "gdbcore.h" /* for registers_fetched() */
 
 
void
void
fetch_inferior_registers (regno)
fetch_inferior_registers (regno)
     int regno;
     int regno;
{
{
  struct reg inferior_registers;
  struct reg inferior_registers;
 
 
  ptrace (PT_GETREGS, inferior_pid, (PTRACE_ARG3_TYPE) & inferior_registers, 0);
  ptrace (PT_GETREGS, inferior_pid, (PTRACE_ARG3_TYPE) & inferior_registers, 0);
  memcpy (&registers[REGISTER_BYTE (0)], &inferior_registers, 4 * NUM_REGS);
  memcpy (&registers[REGISTER_BYTE (0)], &inferior_registers, 4 * NUM_REGS);
  registers_fetched ();
  registers_fetched ();
}
}
 
 
void
void
store_inferior_registers (regno)
store_inferior_registers (regno)
     int regno;
     int regno;
{
{
  struct reg inferior_registers;
  struct reg inferior_registers;
 
 
  memcpy (&inferior_registers, &registers[REGISTER_BYTE (0)], 4 * NUM_REGS);
  memcpy (&inferior_registers, &registers[REGISTER_BYTE (0)], 4 * NUM_REGS);
  ptrace (PT_SETREGS, inferior_pid, (PTRACE_ARG3_TYPE) & inferior_registers, 0);
  ptrace (PT_SETREGS, inferior_pid, (PTRACE_ARG3_TYPE) & inferior_registers, 0);
}
}
 
 
struct md_core
struct md_core
{
{
  struct reg intreg;
  struct reg intreg;
  struct fpreg freg;
  struct fpreg freg;
};
};
 
 
void
void
fetch_core_registers (core_reg_sect, core_reg_size, which, ignore)
fetch_core_registers (core_reg_sect, core_reg_size, which, ignore)
     char *core_reg_sect;
     char *core_reg_sect;
     unsigned core_reg_size;
     unsigned core_reg_size;
     int which;
     int which;
     CORE_ADDR ignore;
     CORE_ADDR ignore;
{
{
  struct md_core *core_reg = (struct md_core *) core_reg_sect;
  struct md_core *core_reg = (struct md_core *) core_reg_sect;
 
 
  /* integer registers */
  /* integer registers */
  memcpy (&registers[REGISTER_BYTE (0)], &core_reg->intreg,
  memcpy (&registers[REGISTER_BYTE (0)], &core_reg->intreg,
          sizeof (struct reg));
          sizeof (struct reg));
  /* floating point registers */
  /* floating point registers */
  /* XXX */
  /* XXX */
}
}
 
 
#else
#else
 
 
#include <machine/reg.h>
#include <machine/reg.h>
 
 
/* this table must line up with REGISTER_NAMES in tm-i386.h */
/* this table must line up with REGISTER_NAMES in tm-i386.h */
/* symbols like 'tEAX' come from <machine/reg.h> */
/* symbols like 'tEAX' come from <machine/reg.h> */
static int tregmap[] =
static int tregmap[] =
{
{
  tEAX, tECX, tEDX, tEBX,
  tEAX, tECX, tEDX, tEBX,
  tESP, tEBP, tESI, tEDI,
  tESP, tEBP, tESI, tEDI,
  tEIP, tEFLAGS, tCS, tSS
  tEIP, tEFLAGS, tCS, tSS
};
};
 
 
#ifdef sEAX
#ifdef sEAX
static int sregmap[] =
static int sregmap[] =
{
{
  sEAX, sECX, sEDX, sEBX,
  sEAX, sECX, sEDX, sEBX,
  sESP, sEBP, sESI, sEDI,
  sESP, sEBP, sESI, sEDI,
  sEIP, sEFLAGS, sCS, sSS
  sEIP, sEFLAGS, sCS, sSS
};
};
#else /* No sEAX */
#else /* No sEAX */
 
 
/* FreeBSD has decided to collapse the s* and t* symbols.  So if the s*
/* FreeBSD has decided to collapse the s* and t* symbols.  So if the s*
   ones aren't around, use the t* ones for sregmap too.  */
   ones aren't around, use the t* ones for sregmap too.  */
 
 
static int sregmap[] =
static int sregmap[] =
{
{
  tEAX, tECX, tEDX, tEBX,
  tEAX, tECX, tEDX, tEBX,
  tESP, tEBP, tESI, tEDI,
  tESP, tEBP, tESI, tEDI,
  tEIP, tEFLAGS, tCS, tSS
  tEIP, tEFLAGS, tCS, tSS
};
};
#endif /* No sEAX */
#endif /* No sEAX */
 
 
/* blockend is the value of u.u_ar0, and points to the
/* blockend is the value of u.u_ar0, and points to the
   place where ES is stored.  */
   place where ES is stored.  */
 
 
int
int
i386_register_u_addr (blockend, regnum)
i386_register_u_addr (blockend, regnum)
     int blockend;
     int blockend;
     int regnum;
     int regnum;
{
{
  /* The following condition is a kludge to get at the proper register map
  /* The following condition is a kludge to get at the proper register map
     depending upon the state of pcb_flag.
     depending upon the state of pcb_flag.
     The proper condition would be
     The proper condition would be
     if (u.u_pcb.pcb_flag & FM_TRAP)
     if (u.u_pcb.pcb_flag & FM_TRAP)
     but that would require a ptrace call here and wouldn't work
     but that would require a ptrace call here and wouldn't work
     for corefiles.  */
     for corefiles.  */
 
 
  if (blockend < 0x1fcc)
  if (blockend < 0x1fcc)
    return (blockend + 4 * tregmap[regnum]);
    return (blockend + 4 * tregmap[regnum]);
  else
  else
    return (blockend + 4 * sregmap[regnum]);
    return (blockend + 4 * sregmap[regnum]);
}
}
 
 
#endif /* !FETCH_INFERIOR_REGISTERS */
#endif /* !FETCH_INFERIOR_REGISTERS */
 
 
#ifdef FLOAT_INFO
#ifdef FLOAT_INFO
#include "expression.h"
#include "expression.h"
#include "language.h"           /* for local_hex_string */
#include "language.h"           /* for local_hex_string */
#include "floatformat.h"
#include "floatformat.h"
 
 
#include <sys/param.h>
#include <sys/param.h>
#include <sys/dir.h>
#include <sys/dir.h>
#include <signal.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <fcntl.h>
 
 
#include <a.out.h>
#include <a.out.h>
 
 
#include <sys/time.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/resource.h>
#include <sys/uio.h>
#include <sys/uio.h>
#define curpcb Xcurpcb          /* XXX avoid leaking declaration from pcb.h */
#define curpcb Xcurpcb          /* XXX avoid leaking declaration from pcb.h */
#include <sys/user.h>
#include <sys/user.h>
#undef curpcb
#undef curpcb
#include <sys/file.h>
#include <sys/file.h>
#include "gdb_stat.h"
#include "gdb_stat.h"
#include <sys/ptrace.h>
#include <sys/ptrace.h>
 
 
extern void print_387_control_word ();  /* i387-tdep.h */
extern void print_387_control_word ();  /* i387-tdep.h */
extern void print_387_status_word ();
extern void print_387_status_word ();
 
 
#define fpstate         save87
#define fpstate         save87
#define U_FPSTATE(u)    u.u_pcb.pcb_savefpu
#define U_FPSTATE(u)    u.u_pcb.pcb_savefpu
 
 
struct env387
struct env387
  {
  {
    unsigned short control;
    unsigned short control;
    unsigned short r0;
    unsigned short r0;
    unsigned short status;
    unsigned short status;
    unsigned short r1;
    unsigned short r1;
    unsigned short tag;
    unsigned short tag;
    unsigned short r2;
    unsigned short r2;
    unsigned long eip;
    unsigned long eip;
    unsigned short code_seg;
    unsigned short code_seg;
    unsigned short opcode;
    unsigned short opcode;
    unsigned long operand;
    unsigned long operand;
    unsigned short operand_seg;
    unsigned short operand_seg;
    unsigned short r3;
    unsigned short r3;
    unsigned char regs[8][10];
    unsigned char regs[8][10];
  };
  };
 
 
static void
static void
print_387_status (status, ep)
print_387_status (status, ep)
     unsigned short status;
     unsigned short status;
     struct env387 *ep;
     struct env387 *ep;
{
{
  int i;
  int i;
  int bothstatus;
  int bothstatus;
  int top;
  int top;
  int fpreg;
  int fpreg;
 
 
  bothstatus = ((status != 0) && (ep->status != 0));
  bothstatus = ((status != 0) && (ep->status != 0));
  if (status != 0)
  if (status != 0)
    {
    {
      if (bothstatus)
      if (bothstatus)
        printf_unfiltered ("u: ");
        printf_unfiltered ("u: ");
      print_387_status_word ((unsigned int) status);
      print_387_status_word ((unsigned int) status);
    }
    }
 
 
  if (ep->status != 0)
  if (ep->status != 0)
    {
    {
      if (bothstatus)
      if (bothstatus)
        printf_unfiltered ("e: ");
        printf_unfiltered ("e: ");
      print_387_status_word ((unsigned int) ep->status);
      print_387_status_word ((unsigned int) ep->status);
    }
    }
 
 
  print_387_control_word ((unsigned int) ep->control);
  print_387_control_word ((unsigned int) ep->control);
  printf_unfiltered ("last exception: ");
  printf_unfiltered ("last exception: ");
  printf_unfiltered ("opcode %s; ", local_hex_string (ep->opcode));
  printf_unfiltered ("opcode %s; ", local_hex_string (ep->opcode));
  printf_unfiltered ("pc %s:", local_hex_string (ep->code_seg));
  printf_unfiltered ("pc %s:", local_hex_string (ep->code_seg));
  printf_unfiltered ("%s; ", local_hex_string (ep->eip));
  printf_unfiltered ("%s; ", local_hex_string (ep->eip));
  printf_unfiltered ("operand %s", local_hex_string (ep->operand_seg));
  printf_unfiltered ("operand %s", local_hex_string (ep->operand_seg));
  printf_unfiltered (":%s\n", local_hex_string (ep->operand));
  printf_unfiltered (":%s\n", local_hex_string (ep->operand));
 
 
  top = (ep->status >> 11) & 7;
  top = (ep->status >> 11) & 7;
 
 
  printf_unfiltered ("regno     tag  msb              lsb  value\n");
  printf_unfiltered ("regno     tag  msb              lsb  value\n");
  for (fpreg = 7; fpreg >= 0; fpreg--)
  for (fpreg = 7; fpreg >= 0; fpreg--)
    {
    {
      double val;
      double val;
 
 
      printf_unfiltered ("%s %d: ", fpreg == top ? "=>" : "  ", fpreg);
      printf_unfiltered ("%s %d: ", fpreg == top ? "=>" : "  ", fpreg);
 
 
      switch ((ep->tag >> (fpreg * 2)) & 3)
      switch ((ep->tag >> (fpreg * 2)) & 3)
        {
        {
        case 0:
        case 0:
          printf_unfiltered ("valid ");
          printf_unfiltered ("valid ");
          break;
          break;
        case 1:
        case 1:
          printf_unfiltered ("zero  ");
          printf_unfiltered ("zero  ");
          break;
          break;
        case 2:
        case 2:
          printf_unfiltered ("trap  ");
          printf_unfiltered ("trap  ");
          break;
          break;
        case 3:
        case 3:
          printf_unfiltered ("empty ");
          printf_unfiltered ("empty ");
          break;
          break;
        }
        }
      for (i = 9; i >= 0; i--)
      for (i = 9; i >= 0; i--)
        printf_unfiltered ("%02x", ep->regs[fpreg][i]);
        printf_unfiltered ("%02x", ep->regs[fpreg][i]);
 
 
      floatformat_to_double (&floatformat_i387_ext, (char *) ep->regs[fpreg],
      floatformat_to_double (&floatformat_i387_ext, (char *) ep->regs[fpreg],
                             &val);
                             &val);
      printf_unfiltered ("  %g\n", val);
      printf_unfiltered ("  %g\n", val);
    }
    }
}
}
 
 
i386_float_info ()
i386_float_info ()
{
{
  struct user u;                /* just for address computations */
  struct user u;                /* just for address computations */
  int i;
  int i;
  /* fpstate defined in <sys/user.h> */
  /* fpstate defined in <sys/user.h> */
  struct fpstate *fpstatep;
  struct fpstate *fpstatep;
  char buf[sizeof (struct fpstate) + 2 * sizeof (int)];
  char buf[sizeof (struct fpstate) + 2 * sizeof (int)];
  unsigned int uaddr;
  unsigned int uaddr;
  char fpvalid;
  char fpvalid;
  unsigned int rounded_addr;
  unsigned int rounded_addr;
  unsigned int rounded_size;
  unsigned int rounded_size;
  /*extern int corechan; */
  /*extern int corechan; */
  int skip;
  int skip;
  extern int inferior_pid;
  extern int inferior_pid;
 
 
  uaddr = (char *) &U_FPSTATE (u) - (char *) &u;
  uaddr = (char *) &U_FPSTATE (u) - (char *) &u;
  if (inferior_pid)
  if (inferior_pid)
    {
    {
      int *ip;
      int *ip;
 
 
      rounded_addr = uaddr & -sizeof (int);
      rounded_addr = uaddr & -sizeof (int);
      rounded_size = (((uaddr + sizeof (struct fpstate)) - uaddr) +
      rounded_size = (((uaddr + sizeof (struct fpstate)) - uaddr) +
                      sizeof (int) - 1) / sizeof (int);
                      sizeof (int) - 1) / sizeof (int);
      skip = uaddr - rounded_addr;
      skip = uaddr - rounded_addr;
 
 
      ip = (int *) buf;
      ip = (int *) buf;
      for (i = 0; i < rounded_size; i++)
      for (i = 0; i < rounded_size; i++)
        {
        {
          *ip++ = ptrace (PT_READ_U, inferior_pid, (caddr_t) rounded_addr, 0);
          *ip++ = ptrace (PT_READ_U, inferior_pid, (caddr_t) rounded_addr, 0);
          rounded_addr += sizeof (int);
          rounded_addr += sizeof (int);
        }
        }
    }
    }
  else
  else
    {
    {
      printf ("float info: can't do a core file (yet)\n");
      printf ("float info: can't do a core file (yet)\n");
      return;
      return;
#if 0
#if 0
      if (lseek (corechan, uaddr, 0) < 0)
      if (lseek (corechan, uaddr, 0) < 0)
        perror_with_name ("seek on core file");
        perror_with_name ("seek on core file");
      if (myread (corechan, buf, sizeof (struct fpstate)) < 0)
      if (myread (corechan, buf, sizeof (struct fpstate)) < 0)
          perror_with_name ("read from core file");
          perror_with_name ("read from core file");
      skip = 0;
      skip = 0;
#endif
#endif
    }
    }
 
 
  print_387_status (0, (struct env387 *) buf);
  print_387_status (0, (struct env387 *) buf);
}
}
 
 
int
int
kernel_u_size ()
kernel_u_size ()
{
{
  return (sizeof (struct user));
  return (sizeof (struct user));
}
}
 
 
#endif
#endif
 
 

powered by: WebSVN 2.1.0

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