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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [armnbsd-nat.c] - Diff between revs 834 and 842

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

Rev 834 Rev 842
/* Native-dependent code for BSD Unix running on ARM's, for GDB.
/* Native-dependent code for BSD Unix running on ARM's, for GDB.
 
 
   Copyright (C) 1988, 1989, 1991, 1992, 1994, 1996, 1999, 2002, 2004, 2007,
   Copyright (C) 1988, 1989, 1991, 1992, 1994, 1996, 1999, 2002, 2004, 2007,
   2008, 2009, 2010 Free Software Foundation, Inc.
   2008, 2009, 2010 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 3 of the License, or
   the Free Software Foundation; either version 3 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, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#include "defs.h"
#include "defs.h"
#include "gdbcore.h"
#include "gdbcore.h"
#include "inferior.h"
#include "inferior.h"
#include "regcache.h"
#include "regcache.h"
#include "target.h"
#include "target.h"
 
 
#include "gdb_string.h"
#include "gdb_string.h"
#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 "arm-tdep.h"
#include "arm-tdep.h"
#include "inf-ptrace.h"
#include "inf-ptrace.h"
 
 
extern int arm_apcs_32;
extern int arm_apcs_32;
 
 
static void
static void
arm_supply_gregset (struct regcache *regcache, struct reg *gregset)
arm_supply_gregset (struct regcache *regcache, struct reg *gregset)
{
{
  int regno;
  int regno;
  CORE_ADDR r_pc;
  CORE_ADDR r_pc;
 
 
  /* Integer registers.  */
  /* Integer registers.  */
  for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++)
  for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++)
    regcache_raw_supply (regcache, regno, (char *) &gregset->r[regno]);
    regcache_raw_supply (regcache, regno, (char *) &gregset->r[regno]);
 
 
  regcache_raw_supply (regcache, ARM_SP_REGNUM,
  regcache_raw_supply (regcache, ARM_SP_REGNUM,
                       (char *) &gregset->r_sp);
                       (char *) &gregset->r_sp);
  regcache_raw_supply (regcache, ARM_LR_REGNUM,
  regcache_raw_supply (regcache, ARM_LR_REGNUM,
                       (char *) &gregset->r_lr);
                       (char *) &gregset->r_lr);
  /* This is ok: we're running native...  */
  /* This is ok: we're running native...  */
  r_pc = gdbarch_addr_bits_remove (get_regcache_arch (regcache), gregset->r_pc);
  r_pc = gdbarch_addr_bits_remove (get_regcache_arch (regcache), gregset->r_pc);
  regcache_raw_supply (regcache, ARM_PC_REGNUM, (char *) &r_pc);
  regcache_raw_supply (regcache, ARM_PC_REGNUM, (char *) &r_pc);
 
 
  if (arm_apcs_32)
  if (arm_apcs_32)
    regcache_raw_supply (regcache, ARM_PS_REGNUM,
    regcache_raw_supply (regcache, ARM_PS_REGNUM,
                         (char *) &gregset->r_cpsr);
                         (char *) &gregset->r_cpsr);
  else
  else
    regcache_raw_supply (regcache, ARM_PS_REGNUM,
    regcache_raw_supply (regcache, ARM_PS_REGNUM,
                         (char *) &gregset->r_pc);
                         (char *) &gregset->r_pc);
}
}
 
 
static void
static void
arm_supply_fparegset (struct regcache *regcache, struct fpreg *fparegset)
arm_supply_fparegset (struct regcache *regcache, struct fpreg *fparegset)
{
{
  int regno;
  int regno;
 
 
  for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
  for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
    regcache_raw_supply (regcache, regno,
    regcache_raw_supply (regcache, regno,
                         (char *) &fparegset->fpr[regno - ARM_F0_REGNUM]);
                         (char *) &fparegset->fpr[regno - ARM_F0_REGNUM]);
 
 
  regcache_raw_supply (regcache, ARM_FPS_REGNUM,
  regcache_raw_supply (regcache, ARM_FPS_REGNUM,
                       (char *) &fparegset->fpr_fpsr);
                       (char *) &fparegset->fpr_fpsr);
}
}
 
 
static void
static void
fetch_register (struct regcache *regcache, int regno)
fetch_register (struct regcache *regcache, int regno)
{
{
  struct reg inferior_registers;
  struct reg inferior_registers;
  int ret;
  int ret;
 
 
  ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    {
    {
      warning (_("unable to fetch general register"));
      warning (_("unable to fetch general register"));
      return;
      return;
    }
    }
 
 
  switch (regno)
  switch (regno)
    {
    {
    case ARM_SP_REGNUM:
    case ARM_SP_REGNUM:
      regcache_raw_supply (regcache, ARM_SP_REGNUM,
      regcache_raw_supply (regcache, ARM_SP_REGNUM,
                           (char *) &inferior_registers.r_sp);
                           (char *) &inferior_registers.r_sp);
      break;
      break;
 
 
    case ARM_LR_REGNUM:
    case ARM_LR_REGNUM:
      regcache_raw_supply (regcache, ARM_LR_REGNUM,
      regcache_raw_supply (regcache, ARM_LR_REGNUM,
                           (char *) &inferior_registers.r_lr);
                           (char *) &inferior_registers.r_lr);
      break;
      break;
 
 
    case ARM_PC_REGNUM:
    case ARM_PC_REGNUM:
      /* This is ok: we're running native... */
      /* This is ok: we're running native... */
      inferior_registers.r_pc = gdbarch_addr_bits_remove
      inferior_registers.r_pc = gdbarch_addr_bits_remove
                                  (get_regcache_arch (regcache),
                                  (get_regcache_arch (regcache),
                                   inferior_registers.r_pc);
                                   inferior_registers.r_pc);
      regcache_raw_supply (regcache, ARM_PC_REGNUM,
      regcache_raw_supply (regcache, ARM_PC_REGNUM,
                           (char *) &inferior_registers.r_pc);
                           (char *) &inferior_registers.r_pc);
      break;
      break;
 
 
    case ARM_PS_REGNUM:
    case ARM_PS_REGNUM:
      if (arm_apcs_32)
      if (arm_apcs_32)
        regcache_raw_supply (regcache, ARM_PS_REGNUM,
        regcache_raw_supply (regcache, ARM_PS_REGNUM,
                             (char *) &inferior_registers.r_cpsr);
                             (char *) &inferior_registers.r_cpsr);
      else
      else
        regcache_raw_supply (regcache, ARM_PS_REGNUM,
        regcache_raw_supply (regcache, ARM_PS_REGNUM,
                             (char *) &inferior_registers.r_pc);
                             (char *) &inferior_registers.r_pc);
      break;
      break;
 
 
    default:
    default:
      regcache_raw_supply (regcache, regno,
      regcache_raw_supply (regcache, regno,
                           (char *) &inferior_registers.r[regno]);
                           (char *) &inferior_registers.r[regno]);
      break;
      break;
    }
    }
}
}
 
 
static void
static void
fetch_regs (struct regcache *regcache)
fetch_regs (struct regcache *regcache)
{
{
  struct reg inferior_registers;
  struct reg inferior_registers;
  int ret;
  int ret;
  int regno;
  int regno;
 
 
  ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    {
    {
      warning (_("unable to fetch general registers"));
      warning (_("unable to fetch general registers"));
      return;
      return;
    }
    }
 
 
  arm_supply_gregset (regcache, &inferior_registers);
  arm_supply_gregset (regcache, &inferior_registers);
}
}
 
 
static void
static void
fetch_fp_register (struct regcache *regcache, int regno)
fetch_fp_register (struct regcache *regcache, int regno)
{
{
  struct fpreg inferior_fp_registers;
  struct fpreg inferior_fp_registers;
  int ret;
  int ret;
 
 
  ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    {
    {
      warning (_("unable to fetch floating-point register"));
      warning (_("unable to fetch floating-point register"));
      return;
      return;
    }
    }
 
 
  switch (regno)
  switch (regno)
    {
    {
    case ARM_FPS_REGNUM:
    case ARM_FPS_REGNUM:
      regcache_raw_supply (regcache, ARM_FPS_REGNUM,
      regcache_raw_supply (regcache, ARM_FPS_REGNUM,
                           (char *) &inferior_fp_registers.fpr_fpsr);
                           (char *) &inferior_fp_registers.fpr_fpsr);
      break;
      break;
 
 
    default:
    default:
      regcache_raw_supply (regcache, regno,
      regcache_raw_supply (regcache, regno,
                           (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
                           (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
      break;
      break;
    }
    }
}
}
 
 
static void
static void
fetch_fp_regs (struct regcache *regcache)
fetch_fp_regs (struct regcache *regcache)
{
{
  struct fpreg inferior_fp_registers;
  struct fpreg inferior_fp_registers;
  int ret;
  int ret;
  int regno;
  int regno;
 
 
  ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    {
    {
      warning (_("unable to fetch general registers"));
      warning (_("unable to fetch general registers"));
      return;
      return;
    }
    }
 
 
  arm_supply_fparegset (regcache, &inferior_fp_registers);
  arm_supply_fparegset (regcache, &inferior_fp_registers);
}
}
 
 
static void
static void
armnbsd_fetch_registers (struct target_ops *ops,
armnbsd_fetch_registers (struct target_ops *ops,
                         struct regcache *regcache, int regno)
                         struct regcache *regcache, int regno)
{
{
  if (regno >= 0)
  if (regno >= 0)
    {
    {
      if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM)
      if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM)
        fetch_register (regcache, regno);
        fetch_register (regcache, regno);
      else
      else
        fetch_fp_register (regcache, regno);
        fetch_fp_register (regcache, regno);
    }
    }
  else
  else
    {
    {
      fetch_regs (regcache);
      fetch_regs (regcache);
      fetch_fp_regs (regcache);
      fetch_fp_regs (regcache);
    }
    }
}
}
 
 
 
 
static void
static void
store_register (const struct regcache *regcache, int regno)
store_register (const struct regcache *regcache, int regno)
{
{
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
  struct reg inferior_registers;
  struct reg inferior_registers;
  int ret;
  int ret;
 
 
  ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_GETREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    {
    {
      warning (_("unable to fetch general registers"));
      warning (_("unable to fetch general registers"));
      return;
      return;
    }
    }
 
 
  switch (regno)
  switch (regno)
    {
    {
    case ARM_SP_REGNUM:
    case ARM_SP_REGNUM:
      regcache_raw_collect (regcache, ARM_SP_REGNUM,
      regcache_raw_collect (regcache, ARM_SP_REGNUM,
                            (char *) &inferior_registers.r_sp);
                            (char *) &inferior_registers.r_sp);
      break;
      break;
 
 
    case ARM_LR_REGNUM:
    case ARM_LR_REGNUM:
      regcache_raw_collect (regcache, ARM_LR_REGNUM,
      regcache_raw_collect (regcache, ARM_LR_REGNUM,
                            (char *) &inferior_registers.r_lr);
                            (char *) &inferior_registers.r_lr);
      break;
      break;
 
 
    case ARM_PC_REGNUM:
    case ARM_PC_REGNUM:
      if (arm_apcs_32)
      if (arm_apcs_32)
        regcache_raw_collect (regcache, ARM_PC_REGNUM,
        regcache_raw_collect (regcache, ARM_PC_REGNUM,
                              (char *) &inferior_registers.r_pc);
                              (char *) &inferior_registers.r_pc);
      else
      else
        {
        {
          unsigned pc_val;
          unsigned pc_val;
 
 
          regcache_raw_collect (regcache, ARM_PC_REGNUM,
          regcache_raw_collect (regcache, ARM_PC_REGNUM,
                                (char *) &pc_val);
                                (char *) &pc_val);
 
 
          pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val);
          pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val);
          inferior_registers.r_pc ^= gdbarch_addr_bits_remove
          inferior_registers.r_pc ^= gdbarch_addr_bits_remove
                                       (gdbarch, inferior_registers.r_pc);
                                       (gdbarch, inferior_registers.r_pc);
          inferior_registers.r_pc |= pc_val;
          inferior_registers.r_pc |= pc_val;
        }
        }
      break;
      break;
 
 
    case ARM_PS_REGNUM:
    case ARM_PS_REGNUM:
      if (arm_apcs_32)
      if (arm_apcs_32)
        regcache_raw_collect (regcache, ARM_PS_REGNUM,
        regcache_raw_collect (regcache, ARM_PS_REGNUM,
                              (char *) &inferior_registers.r_cpsr);
                              (char *) &inferior_registers.r_cpsr);
      else
      else
        {
        {
          unsigned psr_val;
          unsigned psr_val;
 
 
          regcache_raw_collect (regcache, ARM_PS_REGNUM,
          regcache_raw_collect (regcache, ARM_PS_REGNUM,
                                (char *) &psr_val);
                                (char *) &psr_val);
 
 
          psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val);
          psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val);
          inferior_registers.r_pc = gdbarch_addr_bits_remove
          inferior_registers.r_pc = gdbarch_addr_bits_remove
                                      (gdbarch, inferior_registers.r_pc);
                                      (gdbarch, inferior_registers.r_pc);
          inferior_registers.r_pc |= psr_val;
          inferior_registers.r_pc |= psr_val;
        }
        }
      break;
      break;
 
 
    default:
    default:
      regcache_raw_collect (regcache, regno,
      regcache_raw_collect (regcache, regno,
                            (char *) &inferior_registers.r[regno]);
                            (char *) &inferior_registers.r[regno]);
      break;
      break;
    }
    }
 
 
  ret = ptrace (PT_SETREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_SETREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    warning (_("unable to write register %d to inferior"), regno);
    warning (_("unable to write register %d to inferior"), regno);
}
}
 
 
static void
static void
store_regs (const struct regcache *regcache)
store_regs (const struct regcache *regcache)
{
{
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
  struct reg inferior_registers;
  struct reg inferior_registers;
  int ret;
  int ret;
  int regno;
  int regno;
 
 
 
 
  for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++)
  for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++)
    regcache_raw_collect (regcache, regno,
    regcache_raw_collect (regcache, regno,
                          (char *) &inferior_registers.r[regno]);
                          (char *) &inferior_registers.r[regno]);
 
 
  regcache_raw_collect (regcache, ARM_SP_REGNUM,
  regcache_raw_collect (regcache, ARM_SP_REGNUM,
                        (char *) &inferior_registers.r_sp);
                        (char *) &inferior_registers.r_sp);
  regcache_raw_collect (regcache, ARM_LR_REGNUM,
  regcache_raw_collect (regcache, ARM_LR_REGNUM,
                        (char *) &inferior_registers.r_lr);
                        (char *) &inferior_registers.r_lr);
 
 
  if (arm_apcs_32)
  if (arm_apcs_32)
    {
    {
      regcache_raw_collect (regcache, ARM_PC_REGNUM,
      regcache_raw_collect (regcache, ARM_PC_REGNUM,
                            (char *) &inferior_registers.r_pc);
                            (char *) &inferior_registers.r_pc);
      regcache_raw_collect (regcache, ARM_PS_REGNUM,
      regcache_raw_collect (regcache, ARM_PS_REGNUM,
                            (char *) &inferior_registers.r_cpsr);
                            (char *) &inferior_registers.r_cpsr);
    }
    }
  else
  else
    {
    {
      unsigned pc_val;
      unsigned pc_val;
      unsigned psr_val;
      unsigned psr_val;
 
 
      regcache_raw_collect (regcache, ARM_PC_REGNUM,
      regcache_raw_collect (regcache, ARM_PC_REGNUM,
                            (char *) &pc_val);
                            (char *) &pc_val);
      regcache_raw_collect (regcache, ARM_PS_REGNUM,
      regcache_raw_collect (regcache, ARM_PS_REGNUM,
                            (char *) &psr_val);
                            (char *) &psr_val);
 
 
      pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val);
      pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val);
      psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val);
      psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val);
 
 
      inferior_registers.r_pc = pc_val | psr_val;
      inferior_registers.r_pc = pc_val | psr_val;
    }
    }
 
 
  ret = ptrace (PT_SETREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_SETREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    warning (_("unable to store general registers"));
    warning (_("unable to store general registers"));
}
}
 
 
static void
static void
store_fp_register (const struct regcache *regcache, int regno)
store_fp_register (const struct regcache *regcache, int regno)
{
{
  struct fpreg inferior_fp_registers;
  struct fpreg inferior_fp_registers;
  int ret;
  int ret;
 
 
  ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    {
    {
      warning (_("unable to fetch floating-point registers"));
      warning (_("unable to fetch floating-point registers"));
      return;
      return;
    }
    }
 
 
  switch (regno)
  switch (regno)
    {
    {
    case ARM_FPS_REGNUM:
    case ARM_FPS_REGNUM:
      regcache_raw_collect (regcache, ARM_FPS_REGNUM,
      regcache_raw_collect (regcache, ARM_FPS_REGNUM,
                            (char *) &inferior_fp_registers.fpr_fpsr);
                            (char *) &inferior_fp_registers.fpr_fpsr);
      break;
      break;
 
 
    default:
    default:
      regcache_raw_collect (regcache, regno,
      regcache_raw_collect (regcache, regno,
                            (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
                            (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
      break;
      break;
    }
    }
 
 
  ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    warning (_("unable to write register %d to inferior"), regno);
    warning (_("unable to write register %d to inferior"), regno);
}
}
 
 
static void
static void
store_fp_regs (const struct regcache *regcache)
store_fp_regs (const struct regcache *regcache)
{
{
  struct fpreg inferior_fp_registers;
  struct fpreg inferior_fp_registers;
  int ret;
  int ret;
  int regno;
  int regno;
 
 
 
 
  for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
  for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
    regcache_raw_collect (regcache, regno,
    regcache_raw_collect (regcache, regno,
                          (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
                          (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]);
 
 
  regcache_raw_collect (regcache, ARM_FPS_REGNUM,
  regcache_raw_collect (regcache, ARM_FPS_REGNUM,
                        (char *) &inferior_fp_registers.fpr_fpsr);
                        (char *) &inferior_fp_registers.fpr_fpsr);
 
 
  ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
  ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
                (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);
 
 
  if (ret < 0)
  if (ret < 0)
    warning (_("unable to store floating-point registers"));
    warning (_("unable to store floating-point registers"));
}
}
 
 
static void
static void
armnbsd_store_registers (struct target_ops *ops,
armnbsd_store_registers (struct target_ops *ops,
                         struct regcache *regcache, int regno)
                         struct regcache *regcache, int regno)
{
{
  if (regno >= 0)
  if (regno >= 0)
    {
    {
      if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM)
      if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM)
        store_register (regcache, regno);
        store_register (regcache, regno);
      else
      else
        store_fp_register (regcache, regno);
        store_fp_register (regcache, regno);
    }
    }
  else
  else
    {
    {
      store_regs (regcache);
      store_regs (regcache);
      store_fp_regs (regcache);
      store_fp_regs (regcache);
    }
    }
}
}
 
 
struct md_core
struct md_core
{
{
  struct reg intreg;
  struct reg intreg;
  struct fpreg freg;
  struct fpreg freg;
};
};
 
 
static void
static void
fetch_core_registers (struct regcache *regcache,
fetch_core_registers (struct regcache *regcache,
                      char *core_reg_sect, unsigned core_reg_size,
                      char *core_reg_sect, unsigned core_reg_size,
                      int which, CORE_ADDR ignore)
                      int which, 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;
  int regno;
  int regno;
  CORE_ADDR r_pc;
  CORE_ADDR r_pc;
 
 
  arm_supply_gregset (regcache, &core_reg->intreg);
  arm_supply_gregset (regcache, &core_reg->intreg);
  arm_supply_fparegset (regcache, &core_reg->freg);
  arm_supply_fparegset (regcache, &core_reg->freg);
}
}
 
 
static void
static void
fetch_elfcore_registers (struct regcache *regcache,
fetch_elfcore_registers (struct regcache *regcache,
                         char *core_reg_sect, unsigned core_reg_size,
                         char *core_reg_sect, unsigned core_reg_size,
                         int which, CORE_ADDR ignore)
                         int which, CORE_ADDR ignore)
{
{
  struct reg gregset;
  struct reg gregset;
  struct fpreg fparegset;
  struct fpreg fparegset;
 
 
  switch (which)
  switch (which)
    {
    {
    case 0:      /* Integer registers.  */
    case 0:      /* Integer registers.  */
      if (core_reg_size != sizeof (struct reg))
      if (core_reg_size != sizeof (struct reg))
        warning (_("wrong size of register set in core file"));
        warning (_("wrong size of register set in core file"));
      else
      else
        {
        {
          /* The memcpy may be unnecessary, but we can't really be sure
          /* The memcpy may be unnecessary, but we can't really be sure
             of the alignment of the data in the core file.  */
             of the alignment of the data in the core file.  */
          memcpy (&gregset, core_reg_sect, sizeof (gregset));
          memcpy (&gregset, core_reg_sect, sizeof (gregset));
          arm_supply_gregset (regcache, &gregset);
          arm_supply_gregset (regcache, &gregset);
        }
        }
      break;
      break;
 
 
    case 2:
    case 2:
      if (core_reg_size != sizeof (struct fpreg))
      if (core_reg_size != sizeof (struct fpreg))
        warning (_("wrong size of FPA register set in core file"));
        warning (_("wrong size of FPA register set in core file"));
      else
      else
        {
        {
          /* The memcpy may be unnecessary, but we can't really be sure
          /* The memcpy may be unnecessary, but we can't really be sure
             of the alignment of the data in the core file.  */
             of the alignment of the data in the core file.  */
          memcpy (&fparegset, core_reg_sect, sizeof (fparegset));
          memcpy (&fparegset, core_reg_sect, sizeof (fparegset));
          arm_supply_fparegset (regcache, &fparegset);
          arm_supply_fparegset (regcache, &fparegset);
        }
        }
      break;
      break;
 
 
    default:
    default:
      /* Don't know what kind of register request this is; just ignore it.  */
      /* Don't know what kind of register request this is; just ignore it.  */
      break;
      break;
    }
    }
}
}
 
 
static struct core_fns arm_netbsd_core_fns =
static struct core_fns arm_netbsd_core_fns =
{
{
  bfd_target_unknown_flavour,           /* core_flovour.  */
  bfd_target_unknown_flavour,           /* core_flovour.  */
  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
  NULL
};
};
 
 
static struct core_fns arm_netbsd_elfcore_fns =
static struct core_fns arm_netbsd_elfcore_fns =
{
{
  bfd_target_elf_flavour,               /* core_flovour.  */
  bfd_target_elf_flavour,               /* core_flovour.  */
  default_check_format,                 /* check_format.  */
  default_check_format,                 /* check_format.  */
  default_core_sniffer,                 /* core_sniffer.  */
  default_core_sniffer,                 /* core_sniffer.  */
  fetch_elfcore_registers,              /* core_read_registers.  */
  fetch_elfcore_registers,              /* core_read_registers.  */
  NULL
  NULL
};
};
 
 
void
void
_initialize_arm_netbsd_nat (void)
_initialize_arm_netbsd_nat (void)
{
{
  struct target_ops *t;
  struct target_ops *t;
 
 
  t = inf_ptrace_target ();
  t = inf_ptrace_target ();
  t->to_fetch_registers = armnbsd_fetch_registers;
  t->to_fetch_registers = armnbsd_fetch_registers;
  t->to_store_registers = armnbsd_store_registers;
  t->to_store_registers = armnbsd_store_registers;
  add_target (t);
  add_target (t);
 
 
  deprecated_add_core_fns (&arm_netbsd_core_fns);
  deprecated_add_core_fns (&arm_netbsd_core_fns);
  deprecated_add_core_fns (&arm_netbsd_elfcore_fns);
  deprecated_add_core_fns (&arm_netbsd_elfcore_fns);
}
}
 
 

powered by: WebSVN 2.1.0

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