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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [hp300ux-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
/* HP/UX native interface for HP 300's, for GDB when running under Unix.
/* HP/UX native interface for HP 300's, for GDB when running under Unix.
   Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
   Copyright 1986, 1987, 1989, 1991, 1992, 1993 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"
 
 
/* Defining this means some system include files define some extra stuff.  */
/* Defining this means some system include files define some extra stuff.  */
#define WOPR
#define WOPR
#include <sys/param.h>
#include <sys/param.h>
#include <signal.h>
#include <signal.h>
#include <sys/user.h>
#include <sys/user.h>
#include <fcntl.h>
#include <fcntl.h>
 
 
#include <sys/ptrace.h>
#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/reg.h>
#include <sys/trap.h>
#include <sys/trap.h>
 
 
#include <sys/file.h>
#include <sys/file.h>
 
 
static void
static void
fetch_inferior_register PARAMS ((int, unsigned int));
fetch_inferior_register PARAMS ((int, unsigned int));
 
 
static void
static void
store_inferior_register_1 PARAMS ((int, unsigned int, int));
store_inferior_register_1 PARAMS ((int, unsigned int, int));
 
 
static void
static void
store_inferior_register PARAMS ((int, unsigned int));
store_inferior_register PARAMS ((int, unsigned int));
 
 
/* Get kernel_u_addr using HPUX-style nlist().  */
/* Get kernel_u_addr using HPUX-style nlist().  */
CORE_ADDR kernel_u_addr;
CORE_ADDR kernel_u_addr;
 
 
struct hpnlist
struct hpnlist
  {
  {
    char *n_name;
    char *n_name;
    long n_value;
    long n_value;
    unsigned char n_type;
    unsigned char n_type;
    unsigned char n_length;
    unsigned char n_length;
    short n_almod;
    short n_almod;
    short n_unused;
    short n_unused;
  };
  };
static struct hpnlist nl[] =
static struct hpnlist nl[] =
{
{
  {"_u", -1,},
  {"_u", -1,},
  {(char *) 0,}};
  {(char *) 0,}};
 
 
/* read the value of the u area from the hp-ux kernel */
/* read the value of the u area from the hp-ux kernel */
void
void
_initialize_hp300ux_nat ()
_initialize_hp300ux_nat ()
{
{
#ifndef HPUX_VERSION_5
#ifndef HPUX_VERSION_5
  nlist ("/hp-ux", nl);
  nlist ("/hp-ux", nl);
  kernel_u_addr = nl[0].n_value;
  kernel_u_addr = nl[0].n_value;
#else /* HPUX version 5.  */
#else /* HPUX version 5.  */
  kernel_u_addr = (CORE_ADDR) 0x0097900;
  kernel_u_addr = (CORE_ADDR) 0x0097900;
#endif
#endif
}
}
 
 
#define INFERIOR_AR0(u)                                                 \
#define INFERIOR_AR0(u)                                                 \
  ((ptrace                                                              \
  ((ptrace                                                              \
    (PT_RUAREA, inferior_pid,                                           \
    (PT_RUAREA, inferior_pid,                                           \
     (PTRACE_ARG3_TYPE) ((char *) &u.u_ar0 - (char *) &u), 0, 0))         \
     (PTRACE_ARG3_TYPE) ((char *) &u.u_ar0 - (char *) &u), 0, 0))         \
   - kernel_u_addr)
   - kernel_u_addr)
 
 
static void
static void
fetch_inferior_register (regno, regaddr)
fetch_inferior_register (regno, regaddr)
     register int regno;
     register int regno;
     register unsigned int regaddr;
     register unsigned int regaddr;
{
{
#ifndef HPUX_VERSION_5
#ifndef HPUX_VERSION_5
  if (regno == PS_REGNUM)
  if (regno == PS_REGNUM)
    {
    {
      union
      union
        {
        {
          int i;
          int i;
          short s[2];
          short s[2];
        }
        }
      ps_val;
      ps_val;
      int regval;
      int regval;
 
 
      ps_val.i = (ptrace (PT_RUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
      ps_val.i = (ptrace (PT_RUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
                          0, 0));
                          0, 0));
      regval = ps_val.s[0];
      regval = ps_val.s[0];
      supply_register (regno, (char *) &regval);
      supply_register (regno, (char *) &regval);
    }
    }
  else
  else
#endif /* not HPUX_VERSION_5 */
#endif /* not HPUX_VERSION_5 */
    {
    {
      char buf[MAX_REGISTER_RAW_SIZE];
      char buf[MAX_REGISTER_RAW_SIZE];
      register int i;
      register int i;
 
 
      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 (PT_RUAREA, inferior_pid,
          *(int *) &buf[i] = ptrace (PT_RUAREA, inferior_pid,
                                     (PTRACE_ARG3_TYPE) regaddr, 0, 0);
                                     (PTRACE_ARG3_TYPE) regaddr, 0, 0);
          regaddr += sizeof (int);
          regaddr += sizeof (int);
        }
        }
      supply_register (regno, buf);
      supply_register (regno, buf);
    }
    }
  return;
  return;
}
}
 
 
static void
static void
store_inferior_register_1 (regno, regaddr, val)
store_inferior_register_1 (regno, regaddr, val)
     int regno;
     int regno;
     unsigned int regaddr;
     unsigned int regaddr;
     int val;
     int val;
{
{
  errno = 0;
  errno = 0;
  ptrace (PT_WUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, val, 0);
  ptrace (PT_WUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, val, 0);
#if 0
#if 0
  /* HP-UX randomly sets errno to non-zero for regno == 25.
  /* HP-UX randomly sets errno to non-zero for regno == 25.
     However, the value is correctly written, so ignore errno. */
     However, the value is correctly written, so ignore errno. */
  if (errno != 0)
  if (errno != 0)
    {
    {
      char string_buf[64];
      char string_buf[64];
 
 
      sprintf (string_buf, "writing register number %d", regno);
      sprintf (string_buf, "writing register number %d", regno);
      perror_with_name (string_buf);
      perror_with_name (string_buf);
    }
    }
#endif
#endif
  return;
  return;
}
}
 
 
static void
static void
store_inferior_register (regno, regaddr)
store_inferior_register (regno, regaddr)
     register int regno;
     register int regno;
     register unsigned int regaddr;
     register unsigned int regaddr;
{
{
#ifndef HPUX_VERSION_5
#ifndef HPUX_VERSION_5
  if (regno == PS_REGNUM)
  if (regno == PS_REGNUM)
    {
    {
      union
      union
        {
        {
          int i;
          int i;
          short s[2];
          short s[2];
        }
        }
      ps_val;
      ps_val;
 
 
      ps_val.i = (ptrace (PT_RUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
      ps_val.i = (ptrace (PT_RUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
                          0, 0));
                          0, 0));
      ps_val.s[0] = (read_register (regno));
      ps_val.s[0] = (read_register (regno));
      store_inferior_register_1 (regno, regaddr, ps_val.i);
      store_inferior_register_1 (regno, regaddr, ps_val.i);
    }
    }
  else
  else
#endif /* not HPUX_VERSION_5 */
#endif /* not HPUX_VERSION_5 */
    {
    {
      register int i;
      register int i;
 
 
      for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
      for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
        {
        {
          store_inferior_register_1
          store_inferior_register_1
            (regno, regaddr,
            (regno, regaddr,
             (*(int *) &registers[(REGISTER_BYTE (regno)) + i]));
             (*(int *) &registers[(REGISTER_BYTE (regno)) + i]));
          regaddr += sizeof (int);
          regaddr += sizeof (int);
        }
        }
    }
    }
  return;
  return;
}
}
 
 
void
void
fetch_inferior_registers (regno)
fetch_inferior_registers (regno)
     int regno;
     int regno;
{
{
  struct user u;
  struct user u;
  register unsigned int ar0_offset;
  register unsigned int ar0_offset;
 
 
  ar0_offset = (INFERIOR_AR0 (u));
  ar0_offset = (INFERIOR_AR0 (u));
  if (regno == -1)
  if (regno == -1)
    {
    {
      for (regno = 0; (regno < FP0_REGNUM); regno++)
      for (regno = 0; (regno < FP0_REGNUM); regno++)
        fetch_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
        fetch_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
      for (; (regno < NUM_REGS); regno++)
      for (; (regno < NUM_REGS); regno++)
        fetch_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
        fetch_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
    }
    }
  else
  else
    fetch_inferior_register (regno,
    fetch_inferior_register (regno,
                             (regno < FP0_REGNUM
                             (regno < FP0_REGNUM
                              ? REGISTER_ADDR (ar0_offset, regno)
                              ? REGISTER_ADDR (ar0_offset, regno)
                              : FP_REGISTER_ADDR (u, regno)));
                              : FP_REGISTER_ADDR (u, regno)));
}
}
 
 
/* 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)
     register int regno;
     register int regno;
{
{
  struct user u;
  struct user u;
  register unsigned int ar0_offset;
  register unsigned int ar0_offset;
 
 
  if (regno >= FP0_REGNUM)
  if (regno >= FP0_REGNUM)
    {
    {
      store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
      store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
      return;
      return;
    }
    }
 
 
  ar0_offset = (INFERIOR_AR0 (u));
  ar0_offset = (INFERIOR_AR0 (u));
  if (regno >= 0)
  if (regno >= 0)
    {
    {
      store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
      store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
      return;
      return;
    }
    }
 
 
  for (regno = 0; (regno < FP0_REGNUM); regno++)
  for (regno = 0; (regno < FP0_REGNUM); regno++)
    store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
    store_inferior_register (regno, (REGISTER_ADDR (ar0_offset, regno)));
  for (; (regno < NUM_REGS); regno++)
  for (; (regno < NUM_REGS); regno++)
    store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
    store_inferior_register (regno, (FP_REGISTER_ADDR (u, regno)));
  return;
  return;
}
}
 
 
int
int
getpagesize ()
getpagesize ()
{
{
  return 4096;
  return 4096;
}
}
 
 

powered by: WebSVN 2.1.0

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