Blame gdb/alpha-bsd-nat.c

Packit Service 706eca
/* Native-dependent code for Alpha BSD's.
Packit Service 706eca
Packit Service 706eca
   Copyright (C) 2000-2018 Free Software Foundation, Inc.
Packit Service 706eca
Packit Service 706eca
   This file is part of GDB.
Packit Service 706eca
Packit Service 706eca
   This program is free software; you can redistribute it and/or modify
Packit Service 706eca
   it under the terms of the GNU General Public License as published by
Packit Service 706eca
   the Free Software Foundation; either version 3 of the License, or
Packit Service 706eca
   (at your option) any later version.
Packit Service 706eca
Packit Service 706eca
   This program is distributed in the hope that it will be useful,
Packit Service 706eca
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 706eca
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 706eca
   GNU General Public License for more details.
Packit Service 706eca
Packit Service 706eca
   You should have received a copy of the GNU General Public License
Packit Service 706eca
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 706eca
Packit Service 706eca
#include "defs.h"
Packit Service 706eca
#include "inferior.h"
Packit Service 706eca
#include "regcache.h"
Packit Service 706eca
Packit Service 706eca
#include "alpha-tdep.h"
Packit Service 706eca
#include "alpha-bsd-tdep.h"
Packit Service 706eca
#include "inf-ptrace.h"
Packit Service 706eca
Packit Service 706eca
#include <sys/types.h>
Packit Service 706eca
#include <sys/ptrace.h>
Packit Service 706eca
#include <machine/reg.h>
Packit Service 706eca
Packit Service 706eca
#ifdef HAVE_SYS_PROCFS_H
Packit Service 706eca
#include <sys/procfs.h>
Packit Service 706eca
#endif
Packit Service 706eca
Packit Service 706eca
#ifndef HAVE_GREGSET_T
Packit Service 706eca
typedef struct reg gregset_t;
Packit Service 706eca
#endif
Packit Service 706eca
Packit Service 706eca
#ifndef HAVE_FPREGSET_T 
Packit Service 706eca
typedef struct fpreg fpregset_t; 
Packit Service 706eca
#endif 
Packit Service 706eca
Packit Service 706eca
#include "gregset.h"
Packit Service 706eca
Packit Service 706eca
struct alpha_bsd_nat_target final : public inf_ptrace_target
Packit Service 706eca
{
Packit Service 706eca
  void fetch_registers (struct regcache *, int) override;
Packit Service 706eca
  void store_registers (struct regcache *, int) override;
Packit Service 706eca
};
Packit Service 706eca
Packit Service 706eca
static alpha_bsd_nat_target the_alpha_bsd_nat_target;
Packit Service 706eca
Packit Service 706eca
/* Provide *regset() wrappers around the generic Alpha BSD register
Packit Service 706eca
   supply/fill routines.  */
Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
Packit Service 706eca
{
Packit Service 706eca
  alphabsd_supply_reg (regcache, (const char *) gregsetp, -1);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
Packit Service 706eca
{
Packit Service 706eca
  alphabsd_fill_reg (regcache, (char *) gregsetp, regno);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
Packit Service 706eca
{
Packit Service 706eca
  alphabsd_supply_fpreg (regcache, (const char *) fpregsetp, -1);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
fill_fpregset (const struct regcache *regcache,
Packit Service 706eca
	       fpregset_t *fpregsetp, int regno)
Packit Service 706eca
{
Packit Service 706eca
  alphabsd_fill_fpreg (regcache, (char *) fpregsetp, regno);
Packit Service 706eca
}
Packit Service 706eca

Packit Service 706eca
/* Determine if PT_GETREGS fetches this register.  */
Packit Service 706eca
Packit Service 706eca
static int
Packit Service 706eca
getregs_supplies (int regno)
Packit Service 706eca
{
Packit Service 706eca
  return ((regno >= ALPHA_V0_REGNUM && regno <= ALPHA_ZERO_REGNUM)
Packit Service 706eca
	  || regno >= ALPHA_PC_REGNUM);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
/* Fetch register REGNO from the inferior.  If REGNO is -1, do this
Packit Service 706eca
   for all registers (including the floating point registers).  */
Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
alpha_bsd_nat_target::fetch_registers (struct regcache *regcache, int regno)
Packit Service 706eca
{
Packit Service 706eca
  if (regno == -1 || getregs_supplies (regno))
Packit Service 706eca
    {
Packit Service 706eca
      struct reg gregs;
Packit Service 706eca
Packit Service 706eca
      if (ptrace (PT_GETREGS, regcache->ptid ().pid (),
Packit Service 706eca
		  (PTRACE_TYPE_ARG3) &gregs, 0) == -1)
Packit Service 706eca
	perror_with_name (_("Couldn't get registers"));
Packit Service 706eca
Packit Service 706eca
      alphabsd_supply_reg (regcache, (char *) &gregs, regno);
Packit Service 706eca
      if (regno != -1)
Packit Service 706eca
	return;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  if (regno == -1
Packit Service 706eca
      || regno >= gdbarch_fp0_regnum (regcache->arch ()))
Packit Service 706eca
    {
Packit Service 706eca
      struct fpreg fpregs;
Packit Service 706eca
Packit Service 706eca
      if (ptrace (PT_GETFPREGS, regcache->ptid ().pid (),
Packit Service 706eca
		  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
Packit Service 706eca
	perror_with_name (_("Couldn't get floating point status"));
Packit Service 706eca
Packit Service 706eca
      alphabsd_supply_fpreg (regcache, (char *) &fpregs, regno);
Packit Service 706eca
    }
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
/* Store register REGNO back into the inferior.  If REGNO is -1, do
Packit Service 706eca
   this for all registers (including the floating point registers).  */
Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
alpha_bsd_nat_target::store_registers (struct regcache *regcache, int regno)
Packit Service 706eca
{
Packit Service 706eca
  if (regno == -1 || getregs_supplies (regno))
Packit Service 706eca
    {
Packit Service 706eca
      struct reg gregs;
Packit Service 706eca
      if (ptrace (PT_GETREGS, regcache->ptid ().pid (),
Packit Service 706eca
                  (PTRACE_TYPE_ARG3) &gregs, 0) == -1)
Packit Service 706eca
        perror_with_name (_("Couldn't get registers"));
Packit Service 706eca
Packit Service 706eca
      alphabsd_fill_reg (regcache, (char *) &gregs, regno);
Packit Service 706eca
Packit Service 706eca
      if (ptrace (PT_SETREGS, regcache->ptid ().pid (),
Packit Service 706eca
                  (PTRACE_TYPE_ARG3) &gregs, 0) == -1)
Packit Service 706eca
        perror_with_name (_("Couldn't write registers"));
Packit Service 706eca
Packit Service 706eca
      if (regno != -1)
Packit Service 706eca
	return;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  if (regno == -1
Packit Service 706eca
      || regno >= gdbarch_fp0_regnum (regcache->arch ()))
Packit Service 706eca
    {
Packit Service 706eca
      struct fpreg fpregs;
Packit Service 706eca
Packit Service 706eca
      if (ptrace (PT_GETFPREGS, regcache->ptid ().pid (),
Packit Service 706eca
		  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
Packit Service 706eca
	perror_with_name (_("Couldn't get floating point status"));
Packit Service 706eca
Packit Service 706eca
      alphabsd_fill_fpreg (regcache, (char *) &fpregs, regno);
Packit Service 706eca
Packit Service 706eca
      if (ptrace (PT_SETFPREGS, regcache->ptid ().pid (),
Packit Service 706eca
		  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
Packit Service 706eca
	perror_with_name (_("Couldn't write floating point status"));
Packit Service 706eca
    }
Packit Service 706eca
}
Packit Service 706eca

Packit Service 706eca
Packit Service 706eca
/* Support for debugging kernel virtual memory images.  */
Packit Service 706eca
Packit Service 706eca
#include <sys/signal.h>
Packit Service 706eca
#include <machine/pcb.h>
Packit Service 706eca
Packit Service 706eca
#include "bsd-kvm.h"
Packit Service 706eca
Packit Service 706eca
static int
Packit Service 706eca
alphabsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
Packit Service 706eca
{
Packit Service 706eca
  int regnum;
Packit Service 706eca
Packit Service 706eca
  /* The following is true for OpenBSD 3.9:
Packit Service 706eca
Packit Service 706eca
     The pcb contains the register state at the context switch inside
Packit Service 706eca
     cpu_switch().  */
Packit Service 706eca
Packit Service 706eca
  /* The stack pointer shouldn't be zero.  */
Packit Service 706eca
  if (pcb->pcb_hw.apcb_ksp == 0)
Packit Service 706eca
    return 0;
Packit Service 706eca
Packit Service 706eca
  regcache->raw_supply (ALPHA_SP_REGNUM, &pcb->pcb_hw.apcb_ksp);
Packit Service 706eca
Packit Service 706eca
  for (regnum = ALPHA_S0_REGNUM; regnum < ALPHA_A0_REGNUM; regnum++)
Packit Service 706eca
    regcache->raw_supply (regnum, &pcb->pcb_context[regnum - ALPHA_S0_REGNUM]);
Packit Service 706eca
  regcache->raw_supply (ALPHA_RA_REGNUM, &pcb->pcb_context[7]);
Packit Service 706eca
Packit Service 706eca
  return 1;
Packit Service 706eca
}
Packit Service 706eca

Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
_initialize_alphabsd_nat (void)
Packit Service 706eca
{
Packit Service 706eca
  add_inf_child_target (&the_alpha_bsd_nat_target);
Packit Service 706eca
Packit Service 706eca
  /* Support debugging kernel virtual memory images.  */
Packit Service 706eca
  bsd_kvm_add_target (alphabsd_supply_pcb);
Packit Service 706eca
}