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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [cxux-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 Motorola 88k running Harris CX/UX.
/* Native support for Motorola 88k running Harris CX/UX.
   Copyright 1988, 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
   Copyright 1988, 1990, 1991, 1992, 1993, 1994 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"
#include "frame.h"
#include "frame.h"
#include "inferior.h"
#include "inferior.h"
 
 
#include <sys/types.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/param.h>
#include <sys/dir.h>
#include <sys/dir.h>
#include <signal.h>
#include <signal.h>
#include "gdbcore.h"
#include "gdbcore.h"
#include <sys/user.h>
#include <sys/user.h>
 
 
#include "bfd.h"
#include "bfd.h"
#include "symfile.h"
#include "symfile.h"
#include "objfiles.h"
#include "objfiles.h"
#include "symtab.h"
#include "symtab.h"
 
 
#ifndef USER                    /* added to support BCS ptrace_user */
#ifndef USER                    /* added to support BCS ptrace_user */
#define USER ptrace_user
#define USER ptrace_user
#endif
#endif
#include <sys/ioctl.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/file.h>
#include "gdb_stat.h"
#include "gdb_stat.h"
 
 
#include "symtab.h"
#include "symtab.h"
#include "setjmp.h"
#include "setjmp.h"
#include "value.h"
#include "value.h"
 
 
#include <sys/ptrace.h>
#include <sys/ptrace.h>
 
 
/* CX/UX provides them already, but as word offsets instead of char offsets */
/* CX/UX provides them already, but as word offsets instead of char offsets */
#define SXIP_OFFSET (PT_SXIP * 4)
#define SXIP_OFFSET (PT_SXIP * 4)
#define SNIP_OFFSET (PT_SNIP * 4)
#define SNIP_OFFSET (PT_SNIP * 4)
#define SFIP_OFFSET (PT_SFIP * 4)
#define SFIP_OFFSET (PT_SFIP * 4)
#define PSR_OFFSET  (PT_PSR  * sizeof(int))
#define PSR_OFFSET  (PT_PSR  * sizeof(int))
#define FPSR_OFFSET (PT_FPSR * sizeof(int))
#define FPSR_OFFSET (PT_FPSR * sizeof(int))
#define FPCR_OFFSET (PT_FPCR * sizeof(int))
#define FPCR_OFFSET (PT_FPCR * sizeof(int))
 
 
#define XREGADDR(r) (((char *)&u.pt_x0-(char *)&u) + \
#define XREGADDR(r) (((char *)&u.pt_x0-(char *)&u) + \
                     ((r)-X0_REGNUM)*sizeof(X_REGISTER_RAW_TYPE))
                     ((r)-X0_REGNUM)*sizeof(X_REGISTER_RAW_TYPE))
 
 
extern int have_symbol_file_p ();
extern int have_symbol_file_p ();
 
 
extern jmp_buf stack_jmp;
extern jmp_buf stack_jmp;
 
 
extern int errno;
extern int errno;
 
 
void
void
fetch_inferior_registers (regno)
fetch_inferior_registers (regno)
     int regno;                 /* Original value discarded */
     int regno;                 /* Original value discarded */
{
{
  register unsigned int regaddr;
  register unsigned int regaddr;
  char buf[MAX_REGISTER_RAW_SIZE];
  char buf[MAX_REGISTER_RAW_SIZE];
  register int i;
  register int i;
 
 
  struct USER u;
  struct USER u;
  unsigned int offset;
  unsigned int offset;
 
 
  offset = (char *) &u.pt_r0 - (char *) &u;
  offset = (char *) &u.pt_r0 - (char *) &u;
  regaddr = offset;             /* byte offset to r0; */
  regaddr = offset;             /* byte offset to r0; */
 
 
/*  offset = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) offset, 0) - KERNEL_U_ADDR; */
/*  offset = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) offset, 0) - KERNEL_U_ADDR; */
  for (regno = 0; regno < PC_REGNUM; regno++)
  for (regno = 0; regno < PC_REGNUM; regno++)
    {
    {
      /*regaddr = register_addr (regno, offset); */
      /*regaddr = register_addr (regno, offset); */
      /* 88k enhancement  */
      /* 88k enhancement  */
 
 
      for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
      for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
        {
        {
          *(int *) &buf[i] = ptrace (3, inferior_pid,
          *(int *) &buf[i] = ptrace (3, inferior_pid,
                                     (PTRACE_ARG3_TYPE) regaddr, 0);
                                     (PTRACE_ARG3_TYPE) regaddr, 0);
          regaddr += sizeof (int);
          regaddr += sizeof (int);
        }
        }
      supply_register (regno, buf);
      supply_register (regno, buf);
    }
    }
  /* now load up registers 32-37; special pc registers */
  /* now load up registers 32-37; special pc registers */
  *(int *) &buf[0] = ptrace (3, inferior_pid,
  *(int *) &buf[0] = ptrace (3, inferior_pid,
                             (PTRACE_ARG3_TYPE) PSR_OFFSET, 0);
                             (PTRACE_ARG3_TYPE) PSR_OFFSET, 0);
  supply_register (PSR_REGNUM, buf);
  supply_register (PSR_REGNUM, buf);
  *(int *) &buf[0] = ptrace (3, inferior_pid,
  *(int *) &buf[0] = ptrace (3, inferior_pid,
                             (PTRACE_ARG3_TYPE) FPSR_OFFSET, 0);
                             (PTRACE_ARG3_TYPE) FPSR_OFFSET, 0);
  supply_register (FPSR_REGNUM, buf);
  supply_register (FPSR_REGNUM, buf);
  *(int *) &buf[0] = ptrace (3, inferior_pid,
  *(int *) &buf[0] = ptrace (3, inferior_pid,
                             (PTRACE_ARG3_TYPE) FPCR_OFFSET, 0);
                             (PTRACE_ARG3_TYPE) FPCR_OFFSET, 0);
  supply_register (FPCR_REGNUM, buf);
  supply_register (FPCR_REGNUM, buf);
  *(int *) &buf[0] = ptrace (3, inferior_pid,
  *(int *) &buf[0] = ptrace (3, inferior_pid,
                             (PTRACE_ARG3_TYPE) SXIP_OFFSET, 0);
                             (PTRACE_ARG3_TYPE) SXIP_OFFSET, 0);
  supply_register (SXIP_REGNUM, buf);
  supply_register (SXIP_REGNUM, buf);
  *(int *) &buf[0] = ptrace (3, inferior_pid,
  *(int *) &buf[0] = ptrace (3, inferior_pid,
                             (PTRACE_ARG3_TYPE) SNIP_OFFSET, 0);
                             (PTRACE_ARG3_TYPE) SNIP_OFFSET, 0);
  supply_register (SNIP_REGNUM, buf);
  supply_register (SNIP_REGNUM, buf);
  *(int *) &buf[0] = ptrace (3, inferior_pid,
  *(int *) &buf[0] = ptrace (3, inferior_pid,
                             (PTRACE_ARG3_TYPE) SFIP_OFFSET, 0);
                             (PTRACE_ARG3_TYPE) SFIP_OFFSET, 0);
  supply_register (SFIP_REGNUM, buf);
  supply_register (SFIP_REGNUM, buf);
 
 
  if (target_is_m88110)
  if (target_is_m88110)
    {
    {
      for (regaddr = XREGADDR (X0_REGNUM), regno = X0_REGNUM;
      for (regaddr = XREGADDR (X0_REGNUM), regno = X0_REGNUM;
           regno < NUM_REGS;
           regno < NUM_REGS;
           regno++, regaddr += 16)
           regno++, regaddr += 16)
        {
        {
          X_REGISTER_RAW_TYPE xval;
          X_REGISTER_RAW_TYPE xval;
 
 
          *(int *) &xval.w1 = ptrace (3, inferior_pid,
          *(int *) &xval.w1 = ptrace (3, inferior_pid,
                                      (PTRACE_ARG3_TYPE) regaddr, 0);
                                      (PTRACE_ARG3_TYPE) regaddr, 0);
          *(int *) &xval.w2 = ptrace (3, inferior_pid,
          *(int *) &xval.w2 = ptrace (3, inferior_pid,
                                      (PTRACE_ARG3_TYPE) (regaddr + 4), 0);
                                      (PTRACE_ARG3_TYPE) (regaddr + 4), 0);
          *(int *) &xval.w3 = ptrace (3, inferior_pid,
          *(int *) &xval.w3 = ptrace (3, inferior_pid,
                                      (PTRACE_ARG3_TYPE) (regaddr + 8), 0);
                                      (PTRACE_ARG3_TYPE) (regaddr + 8), 0);
          *(int *) &xval.w4 = ptrace (3, inferior_pid,
          *(int *) &xval.w4 = ptrace (3, inferior_pid,
                                      (PTRACE_ARG3_TYPE) (regaddr + 12), 0);
                                      (PTRACE_ARG3_TYPE) (regaddr + 12), 0);
          supply_register (regno, (void *) &xval);
          supply_register (regno, (void *) &xval);
        }
        }
    }
    }
}
}
 
 
/* Store our register values back into the inferior.
/* Store our register values back into the inferior.
   If REGNO is -1, do this for all registers.
   If REGNO is -1, do this for all registers.
   Otherwise, REGNO specifies which register (so we can save time).  */
   Otherwise, REGNO specifies which register (so we can save time).  */
 
 
void
void
store_inferior_registers (regno)
store_inferior_registers (regno)
     int regno;
     int regno;
{
{
  register unsigned int regaddr;
  register unsigned int regaddr;
  char buf[80];
  char buf[80];
 
 
  struct USER u;
  struct USER u;
 
 
  unsigned int offset = (char *) &u.pt_r0 - (char *) &u;
  unsigned int offset = (char *) &u.pt_r0 - (char *) &u;
 
 
  regaddr = offset;
  regaddr = offset;
 
 
  /* Don't try to deal with EXIP_REGNUM or ENIP_REGNUM, because I think either
  /* Don't try to deal with EXIP_REGNUM or ENIP_REGNUM, because I think either
     svr3 doesn't run on an 88110, or the kernel isolates the different (not
     svr3 doesn't run on an 88110, or the kernel isolates the different (not
     completely sure this is true, but seems to be.  */
     completely sure this is true, but seems to be.  */
  if (regno >= 0)
  if (regno >= 0)
    {
    {
      /*      regaddr = register_addr (regno, offset); */
      /*      regaddr = register_addr (regno, offset); */
      if (regno < PC_REGNUM)
      if (regno < PC_REGNUM)
        {
        {
          regaddr = offset + regno * sizeof (int);
          regaddr = offset + regno * sizeof (int);
          errno = 0;
          errno = 0;
          ptrace (6, inferior_pid,
          ptrace (6, inferior_pid,
                  (PTRACE_ARG3_TYPE) regaddr, read_register (regno));
                  (PTRACE_ARG3_TYPE) regaddr, read_register (regno));
          if (errno != 0)
          if (errno != 0)
            {
            {
              sprintf (buf, "writing register number %d", regno);
              sprintf (buf, "writing register number %d", regno);
              perror_with_name (buf);
              perror_with_name (buf);
            }
            }
        }
        }
      else if (regno == PSR_REGNUM)
      else if (regno == PSR_REGNUM)
        ptrace (6, inferior_pid,
        ptrace (6, inferior_pid,
                (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register (regno));
                (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register (regno));
      else if (regno == FPSR_REGNUM)
      else if (regno == FPSR_REGNUM)
        ptrace (6, inferior_pid,
        ptrace (6, inferior_pid,
                (PTRACE_ARG3_TYPE) FPSR_OFFSET, read_register (regno));
                (PTRACE_ARG3_TYPE) FPSR_OFFSET, read_register (regno));
      else if (regno == FPCR_REGNUM)
      else if (regno == FPCR_REGNUM)
        ptrace (6, inferior_pid,
        ptrace (6, inferior_pid,
                (PTRACE_ARG3_TYPE) FPCR_OFFSET, read_register (regno));
                (PTRACE_ARG3_TYPE) FPCR_OFFSET, read_register (regno));
      else if (regno == SXIP_REGNUM)
      else if (regno == SXIP_REGNUM)
        ptrace (6, inferior_pid,
        ptrace (6, inferior_pid,
                (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register (regno));
                (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register (regno));
      else if (regno == SNIP_REGNUM)
      else if (regno == SNIP_REGNUM)
        ptrace (6, inferior_pid,
        ptrace (6, inferior_pid,
                (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register (regno));
                (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register (regno));
      else if (regno == SFIP_REGNUM)
      else if (regno == SFIP_REGNUM)
        ptrace (6, inferior_pid,
        ptrace (6, inferior_pid,
                (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register (regno));
                (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register (regno));
      else if (target_is_m88110 && regno < NUM_REGS)
      else if (target_is_m88110 && regno < NUM_REGS)
        {
        {
          X_REGISTER_RAW_TYPE xval;
          X_REGISTER_RAW_TYPE xval;
 
 
          read_register_bytes (REGISTER_BYTE (regno), (char *) &xval,
          read_register_bytes (REGISTER_BYTE (regno), (char *) &xval,
                               sizeof (X_REGISTER_RAW_TYPE));
                               sizeof (X_REGISTER_RAW_TYPE));
          regaddr = XREGADDR (regno);
          regaddr = XREGADDR (regno);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, xval.w1);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, xval.w1);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr + 4, xval.w2);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr + 4, xval.w2);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr + 8, xval.w3);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr + 8, xval.w3);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr + 12, xval.w4);
          ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr + 12, xval.w4);
        }
        }
      else
      else
        printf_unfiltered ("Bad register number for store_inferior routine\n");
        printf_unfiltered ("Bad register number for store_inferior routine\n");
    }
    }
  else
  else
    {
    {
      for (regno = 0; regno < PC_REGNUM; regno++)
      for (regno = 0; regno < PC_REGNUM; regno++)
        {
        {
          /*      regaddr = register_addr (regno, offset); */
          /*      regaddr = register_addr (regno, offset); */
          errno = 0;
          errno = 0;
          regaddr = offset + regno * sizeof (int);
          regaddr = offset + regno * sizeof (int);
          ptrace (6, inferior_pid,
          ptrace (6, inferior_pid,
                  (PTRACE_ARG3_TYPE) regaddr, read_register (regno));
                  (PTRACE_ARG3_TYPE) regaddr, read_register (regno));
          if (errno != 0)
          if (errno != 0)
            {
            {
              sprintf (buf, "writing register number %d", regno);
              sprintf (buf, "writing register number %d", regno);
              perror_with_name (buf);
              perror_with_name (buf);
            }
            }
        }
        }
      ptrace (6, inferior_pid,
      ptrace (6, inferior_pid,
              (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register (regno));
              (PTRACE_ARG3_TYPE) PSR_OFFSET, read_register (regno));
      ptrace (6, inferior_pid,
      ptrace (6, inferior_pid,
              (PTRACE_ARG3_TYPE) FPSR_OFFSET, read_register (regno));
              (PTRACE_ARG3_TYPE) FPSR_OFFSET, read_register (regno));
      ptrace (6, inferior_pid,
      ptrace (6, inferior_pid,
              (PTRACE_ARG3_TYPE) FPCR_OFFSET, read_register (regno));
              (PTRACE_ARG3_TYPE) FPCR_OFFSET, read_register (regno));
      ptrace (6, inferior_pid,
      ptrace (6, inferior_pid,
              (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register (SXIP_REGNUM));
              (PTRACE_ARG3_TYPE) SXIP_OFFSET, read_register (SXIP_REGNUM));
      ptrace (6, inferior_pid,
      ptrace (6, inferior_pid,
              (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register (SNIP_REGNUM));
              (PTRACE_ARG3_TYPE) SNIP_OFFSET, read_register (SNIP_REGNUM));
      ptrace (6, inferior_pid,
      ptrace (6, inferior_pid,
              (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register (SFIP_REGNUM));
              (PTRACE_ARG3_TYPE) SFIP_OFFSET, read_register (SFIP_REGNUM));
      if (target_is_m88110)
      if (target_is_m88110)
        {
        {
          for (regno = X0_REGNUM; regno < NUM_REGS; regno++)
          for (regno = X0_REGNUM; regno < NUM_REGS; regno++)
            {
            {
              X_REGISTER_RAW_TYPE xval;
              X_REGISTER_RAW_TYPE xval;
 
 
              read_register_bytes (REGISTER_BYTE (regno), (char *) &xval,
              read_register_bytes (REGISTER_BYTE (regno), (char *) &xval,
                                   sizeof (X_REGISTER_RAW_TYPE));
                                   sizeof (X_REGISTER_RAW_TYPE));
              regaddr = XREGADDR (regno);
              regaddr = XREGADDR (regno);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, xval.w1);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, xval.w1);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr + 4), xval.w2);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr + 4), xval.w2);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr + 8), xval.w3);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr + 8), xval.w3);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr + 12), xval.w4);
              ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) (regaddr + 12), xval.w4);
            }
            }
        }
        }
    }
    }
}
}
 
 
/* blockend is the address of the end of the user structure */
/* blockend is the address of the end of the user structure */
 
 
m88k_register_u_addr (blockend, regnum)
m88k_register_u_addr (blockend, regnum)
     int blockend, regnum;
     int blockend, regnum;
{
{
  struct USER u;
  struct USER u;
  int ustart = blockend - sizeof (struct USER);
  int ustart = blockend - sizeof (struct USER);
 
 
  if (regnum < PSR_REGNUM)
  if (regnum < PSR_REGNUM)
    return (ustart + ((int) &u.pt_r0 - (int) &u) +
    return (ustart + ((int) &u.pt_r0 - (int) &u) +
            REGISTER_SIZE * regnum);
            REGISTER_SIZE * regnum);
  else if (regnum == PSR_REGNUM)
  else if (regnum == PSR_REGNUM)
    return (ustart + ((int) &u.pt_psr) - (int) &u);
    return (ustart + ((int) &u.pt_psr) - (int) &u);
  else if (regnum == FPSR_REGNUM)
  else if (regnum == FPSR_REGNUM)
    return (ustart + ((int) &u.pt_fpsr) - (int) &u);
    return (ustart + ((int) &u.pt_fpsr) - (int) &u);
  else if (regnum == FPCR_REGNUM)
  else if (regnum == FPCR_REGNUM)
    return (ustart + ((int) &u.pt_fpcr) - (int) &u);
    return (ustart + ((int) &u.pt_fpcr) - (int) &u);
  else if (regnum == SXIP_REGNUM)
  else if (regnum == SXIP_REGNUM)
    return (ustart + SXIP_OFFSET);
    return (ustart + SXIP_OFFSET);
  else if (regnum == SNIP_REGNUM)
  else if (regnum == SNIP_REGNUM)
    return (ustart + SNIP_OFFSET);
    return (ustart + SNIP_OFFSET);
  else if (regnum == SFIP_REGNUM)
  else if (regnum == SFIP_REGNUM)
    return (ustart + SFIP_OFFSET);
    return (ustart + SFIP_OFFSET);
  else if (target_is_m88110)
  else if (target_is_m88110)
    return (ustart + ((int) &u.pt_x0 - (int) &u) +      /* Must be X register */
    return (ustart + ((int) &u.pt_x0 - (int) &u) +      /* Must be X register */
            sizeof (u.pt_x0) * (regnum - X0_REGNUM));
            sizeof (u.pt_x0) * (regnum - X0_REGNUM));
  else
  else
    return (blockend + REGISTER_SIZE * regnum);
    return (blockend + REGISTER_SIZE * regnum);
}
}
 
 
#ifdef USE_PROC_FS
#ifdef USE_PROC_FS
 
 
#include <sys/procfs.h>
#include <sys/procfs.h>
 
 
/*  Given a pointer to a general register set in /proc format (gregset_t *),
/*  Given a pointer to a general register set in /proc format (gregset_t *),
   unpack the register contents and supply them as gdb's idea of the current
   unpack the register contents and supply them as gdb's idea of the current
   register values. */
   register values. */
 
 
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;
  register greg_t *regp = (greg_t *) gregsetp;
 
 
  for (regi = 0; regi <= SP_REGNUM; regi++)
  for (regi = 0; regi <= SP_REGNUM; regi++)
    supply_register (regi, (char *) (regp + regi));
    supply_register (regi, (char *) (regp + regi));
 
 
  supply_register (SXIP_REGNUM, (char *) (regp + R_XIP));
  supply_register (SXIP_REGNUM, (char *) (regp + R_XIP));
  supply_register (SNIP_REGNUM, (char *) (regp + R_NIP));
  supply_register (SNIP_REGNUM, (char *) (regp + R_NIP));
  supply_register (SFIP_REGNUM, (char *) (regp + R_FIP));
  supply_register (SFIP_REGNUM, (char *) (regp + R_FIP));
  supply_register (PSR_REGNUM, (char *) (regp + R_PSR));
  supply_register (PSR_REGNUM, (char *) (regp + R_PSR));
  supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR));
  supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR));
  supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR));
  supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR));
}
}
 
 
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;
  register greg_t *regp = (greg_t *) gregsetp;
 
 
  for (regi = 0; regi <= R_R31; regi++)
  for (regi = 0; regi <= R_R31; regi++)
    if ((regno == -1) || (regno == regi))
    if ((regno == -1) || (regno == regi))
      *(regp + regi) = *(int *) &registers[REGISTER_BYTE (regi)];
      *(regp + regi) = *(int *) &registers[REGISTER_BYTE (regi)];
 
 
  if ((regno == -1) || (regno == SXIP_REGNUM))
  if ((regno == -1) || (regno == SXIP_REGNUM))
    *(regp + R_XIP) = *(int *) &registers[REGISTER_BYTE (SXIP_REGNUM)];
    *(regp + R_XIP) = *(int *) &registers[REGISTER_BYTE (SXIP_REGNUM)];
  if ((regno == -1) || (regno == SNIP_REGNUM))
  if ((regno == -1) || (regno == SNIP_REGNUM))
    *(regp + R_NIP) = *(int *) &registers[REGISTER_BYTE (SNIP_REGNUM)];
    *(regp + R_NIP) = *(int *) &registers[REGISTER_BYTE (SNIP_REGNUM)];
  if ((regno == -1) || (regno == SFIP_REGNUM))
  if ((regno == -1) || (regno == SFIP_REGNUM))
    *(regp + R_FIP) = *(int *) &registers[REGISTER_BYTE (SFIP_REGNUM)];
    *(regp + R_FIP) = *(int *) &registers[REGISTER_BYTE (SFIP_REGNUM)];
  if ((regno == -1) || (regno == PSR_REGNUM))
  if ((regno == -1) || (regno == PSR_REGNUM))
    *(regp + R_PSR) = *(int *) &registers[REGISTER_BYTE (PSR_REGNUM)];
    *(regp + R_PSR) = *(int *) &registers[REGISTER_BYTE (PSR_REGNUM)];
  if ((regno == -1) || (regno == FPSR_REGNUM))
  if ((regno == -1) || (regno == FPSR_REGNUM))
    *(regp + R_FPSR) = *(int *) &registers[REGISTER_BYTE (FPSR_REGNUM)];
    *(regp + R_FPSR) = *(int *) &registers[REGISTER_BYTE (FPSR_REGNUM)];
  if ((regno == -1) || (regno == FPCR_REGNUM))
  if ((regno == -1) || (regno == FPCR_REGNUM))
    *(regp + R_FPCR) = *(int *) &registers[REGISTER_BYTE (FPCR_REGNUM)];
    *(regp + R_FPCR) = *(int *) &registers[REGISTER_BYTE (FPCR_REGNUM)];
}
}
 
 
#endif /* USE_PROC_FS */
#endif /* USE_PROC_FS */
 
 
/* This support adds the equivalent of adb's % command.  When
/* This support adds the equivalent of adb's % command.  When
   the `add-shared-symbol-files' command is given, this routine scans
   the `add-shared-symbol-files' command is given, this routine scans
   the dynamic linker's link map and reads the minimal symbols
   the dynamic linker's link map and reads the minimal symbols
   from each shared object file listed in the map. */
   from each shared object file listed in the map. */
 
 
struct link_map
struct link_map
{
{
  unsigned long l_addr;         /* address at which object is mapped */
  unsigned long l_addr;         /* address at which object is mapped */
  char *l_name;                 /* full name of loaded object */
  char *l_name;                 /* full name of loaded object */
  void *l_ld;                   /* dynamic structure of object */
  void *l_ld;                   /* dynamic structure of object */
  struct link_map *l_next;      /* next link object */
  struct link_map *l_next;      /* next link object */
  struct link_map *l_prev;      /* previous link object */
  struct link_map *l_prev;      /* previous link object */
};
};
 
 
#define LINKS_MAP_POINTER "_ld_tail"
#define LINKS_MAP_POINTER "_ld_tail"
#define LIBC_FILE "/usr/lib/libc.so.1"
#define LIBC_FILE "/usr/lib/libc.so.1"
#define SHARED_OFFSET 0xf0001000
#define SHARED_OFFSET 0xf0001000
 
 
#ifndef PATH_MAX
#ifndef PATH_MAX
#define PATH_MAX 1023           /* maximum size of path name on OS */
#define PATH_MAX 1023           /* maximum size of path name on OS */
#endif
#endif
 
 
void
void
add_shared_symbol_files ()
add_shared_symbol_files ()
{
{
  void *desc;
  void *desc;
  struct link_map *ld_map, *lm, lms;
  struct link_map *ld_map, *lm, lms;
  struct minimal_symbol *minsym;
  struct minimal_symbol *minsym;
  struct objfile *objfile;
  struct objfile *objfile;
  char *path_name;
  char *path_name;
 
 
  if (!inferior_pid)
  if (!inferior_pid)
    {
    {
      warning ("The program has not yet been started.");
      warning ("The program has not yet been started.");
      return;
      return;
    }
    }
 
 
  objfile = symbol_file_add (LIBC_FILE, 0, NULL, 0, OBJF_READNOW);
  objfile = symbol_file_add (LIBC_FILE, 0, NULL, 0, OBJF_READNOW);
  minsym = lookup_minimal_symbol (LINKS_MAP_POINTER, objfile);
  minsym = lookup_minimal_symbol (LINKS_MAP_POINTER, objfile);
 
 
  ld_map = (struct link_map *)
  ld_map = (struct link_map *)
    read_memory_integer (((int) SYMBOL_VALUE_ADDRESS (minsym) + SHARED_OFFSET), 4);
    read_memory_integer (((int) SYMBOL_VALUE_ADDRESS (minsym) + SHARED_OFFSET), 4);
  lm = ld_map;
  lm = ld_map;
  while (lm)
  while (lm)
    {
    {
      int local_errno = 0;
      int local_errno = 0;
 
 
      read_memory ((CORE_ADDR) lm, (char *) &lms, sizeof (struct link_map));
      read_memory ((CORE_ADDR) lm, (char *) &lms, sizeof (struct link_map));
      if (lms.l_name)
      if (lms.l_name)
        {
        {
          if (target_read_string ((CORE_ADDR) lms.l_name, &path_name,
          if (target_read_string ((CORE_ADDR) lms.l_name, &path_name,
                                  PATH_MAX, &local_errno))
                                  PATH_MAX, &local_errno))
            {
            {
              struct section_addr_info section_addrs;
              struct section_addr_info section_addrs;
              memset (&section_addrs, 0, sizeof (section_addrs));
              memset (&section_addrs, 0, sizeof (section_addrs));
              section_addrs.text_addr = lms.l_addr;
              section_addrs.text_addr = lms.l_addr;
              symbol_file_add (path_name, 1, &section_addrs, 0, 0);
              symbol_file_add (path_name, 1, &section_addrs, 0, 0);
              free (path_name);
              free (path_name);
            }
            }
        }
        }
      /* traverse links in reverse order so that we get the
      /* traverse links in reverse order so that we get the
         the symbols the user actually gets. */
         the symbols the user actually gets. */
      lm = lms.l_prev;
      lm = lms.l_prev;
    }
    }
 
 
  /* Getting new symbols may change our opinion about what is
  /* Getting new symbols may change our opinion about what is
     frameless.  */
     frameless.  */
  reinit_frame_cache ();
  reinit_frame_cache ();
}
}
 
 
#if defined(_ES_MP)
#if defined(_ES_MP)
 
 
#include <sys/regset.h>
#include <sys/regset.h>
 
 
unsigned int
unsigned int
m88k_harris_core_register_addr (regno, reg_ptr)
m88k_harris_core_register_addr (regno, reg_ptr)
     int regno, reg_ptr;
     int regno, reg_ptr;
{
{
  unsigned int word_offset;
  unsigned int word_offset;
 
 
  switch (regno)
  switch (regno)
    {
    {
    case PSR_REGNUM:
    case PSR_REGNUM:
      word_offset = R_EPSR;
      word_offset = R_EPSR;
      break;
      break;
    case FPSR_REGNUM:
    case FPSR_REGNUM:
      word_offset = R_FPSR;
      word_offset = R_FPSR;
      break;
      break;
    case FPCR_REGNUM:
    case FPCR_REGNUM:
      word_offset = R_FPCR;
      word_offset = R_FPCR;
      break;
      break;
    case SXIP_REGNUM:
    case SXIP_REGNUM:
      word_offset = R_EXIP;
      word_offset = R_EXIP;
      break;
      break;
    case SNIP_REGNUM:
    case SNIP_REGNUM:
      word_offset = R_ENIP;
      word_offset = R_ENIP;
      break;
      break;
    case SFIP_REGNUM:
    case SFIP_REGNUM:
      word_offset = R_EFIP;
      word_offset = R_EFIP;
      break;
      break;
    default:
    default:
      if (regno <= FP_REGNUM)
      if (regno <= FP_REGNUM)
        word_offset = regno;
        word_offset = regno;
      else
      else
        word_offset = ((regno - X0_REGNUM) * 4);
        word_offset = ((regno - X0_REGNUM) * 4);
    }
    }
  return (word_offset * 4);
  return (word_offset * 4);
}
}
 
 
#endif /* _ES_MP */
#endif /* _ES_MP */
 
 
void
void
_initialize_m88k_nat ()
_initialize_m88k_nat ()
{
{
#ifdef _ES_MP
#ifdef _ES_MP
  /* Enable 88110 support, as we don't support the 88100 under ES/MP.  */
  /* Enable 88110 support, as we don't support the 88100 under ES/MP.  */
 
 
  target_is_m88110 = 1;
  target_is_m88110 = 1;
#elif defined(_CX_UX)
#elif defined(_CX_UX)
  /* Determine whether we're running on an 88100 or an 88110.  */
  /* Determine whether we're running on an 88100 or an 88110.  */
  target_is_m88110 = (sinfo (SYSMACHINE, 0) == SYS5800);
  target_is_m88110 = (sinfo (SYSMACHINE, 0) == SYS5800);
#endif /* _CX_UX */
#endif /* _CX_UX */
}
}
 
 
#ifdef _ES_MP
#ifdef _ES_MP
/* Given a pointer to a general register set in /proc format (gregset_t *),
/* Given a pointer to a general register set in /proc format (gregset_t *),
   unpack the register contents and supply them as gdb's idea of the current
   unpack the register contents and supply them as gdb's idea of the current
   register values. */
   register values. */
 
 
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;
  register greg_t *regp = (greg_t *) gregsetp;
 
 
  for (regi = 0; regi < R_R31; regi++)
  for (regi = 0; regi < R_R31; regi++)
    {
    {
      supply_register (regi, (char *) (regp + regi));
      supply_register (regi, (char *) (regp + regi));
    }
    }
  supply_register (PSR_REGNUM, (char *) (regp + R_EPSR));
  supply_register (PSR_REGNUM, (char *) (regp + R_EPSR));
  supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR));
  supply_register (FPSR_REGNUM, (char *) (regp + R_FPSR));
  supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR));
  supply_register (FPCR_REGNUM, (char *) (regp + R_FPCR));
  supply_register (SXIP_REGNUM, (char *) (regp + R_EXIP));
  supply_register (SXIP_REGNUM, (char *) (regp + R_EXIP));
  supply_register (SNIP_REGNUM, (char *) (regp + R_ENIP));
  supply_register (SNIP_REGNUM, (char *) (regp + R_ENIP));
  supply_register (SFIP_REGNUM, (char *) (regp + R_EFIP));
  supply_register (SFIP_REGNUM, (char *) (regp + R_EFIP));
}
}
 
 
/* Given a pointer to a floating point register set in /proc format
/* Given a pointer to a floating point register set in /proc format
   (fpregset_t *), unpack the register contents and supply them as gdb's
   (fpregset_t *), unpack the register contents and supply them as gdb's
   idea of the current floating point register values.  */
   idea of the current floating point register values.  */
 
 
void
void
supply_fpregset (fpregsetp)
supply_fpregset (fpregsetp)
     fpregset_t *fpregsetp;
     fpregset_t *fpregsetp;
{
{
  register int regi;
  register int regi;
  char *from;
  char *from;
 
 
  for (regi = FP0_REGNUM; regi <= FPLAST_REGNUM; regi++)
  for (regi = FP0_REGNUM; regi <= FPLAST_REGNUM; regi++)
    {
    {
      from = (char *) &((*fpregsetp)[regi - FP0_REGNUM]);
      from = (char *) &((*fpregsetp)[regi - FP0_REGNUM]);
      supply_register (regi, from);
      supply_register (regi, from);
    }
    }
}
}
 
 
#endif /* _ES_MP */
#endif /* _ES_MP */
 
 
#ifdef _CX_UX
#ifdef _CX_UX
 
 
#include <sys/regset.h>
#include <sys/regset.h>
 
 
unsigned int
unsigned int
m88k_harris_core_register_addr (int regno, int reg_ptr)
m88k_harris_core_register_addr (int regno, int reg_ptr)
{
{
  unsigned int word_offset;
  unsigned int word_offset;
 
 
  switch (regno)
  switch (regno)
    {
    {
    case PSR_REGNUM:
    case PSR_REGNUM:
      word_offset = R_PSR;
      word_offset = R_PSR;
      break;
      break;
    case FPSR_REGNUM:
    case FPSR_REGNUM:
      word_offset = R_FPSR;
      word_offset = R_FPSR;
      break;
      break;
    case FPCR_REGNUM:
    case FPCR_REGNUM:
      word_offset = R_FPCR;
      word_offset = R_FPCR;
      break;
      break;
    case SXIP_REGNUM:
    case SXIP_REGNUM:
      word_offset = R_XIP;
      word_offset = R_XIP;
      break;
      break;
    case SNIP_REGNUM:
    case SNIP_REGNUM:
      word_offset = R_NIP;
      word_offset = R_NIP;
      break;
      break;
    case SFIP_REGNUM:
    case SFIP_REGNUM:
      word_offset = R_FIP;
      word_offset = R_FIP;
      break;
      break;
    default:
    default:
      if (regno <= FP_REGNUM)
      if (regno <= FP_REGNUM)
        word_offset = regno;
        word_offset = regno;
      else
      else
        word_offset = ((regno - X0_REGNUM) * 4) + R_X0;
        word_offset = ((regno - X0_REGNUM) * 4) + R_X0;
    }
    }
  return (word_offset * 4);
  return (word_offset * 4);
}
}
 
 
#endif /* _CX_UX */
#endif /* _CX_UX */
 
 

powered by: WebSVN 2.1.0

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