binutils-gdb/gdb/alpha-linux-nat.c
Pedro Alves 6798487f5b Make inf_ptrace_trad Linux-only, move to separate file
There are only two inf_ptrace_trad_target users, MIPS GNU/Linux and
Alpha GNU/Linux.  They both call it via linux_trad_target.

Move this code out of inf-ptrace.c to a GNU/Linux-specific new file.

Making this code be GNU/Linux-specific simplifies C++ification of
target_ops, because we can make the trad target inherit linux_nat
instead of inheriting inf_ptrace.  That'll be visible in a later patch.

Note this makes linux_target_install_ops an extern function, but that
is temporary -- the function will disappear once target_ops is made a
C++ class with virtual methods, later in the series.  Also, I did not
rename the functions in the new file for a similar reason.  They'll be
renamed again anyway in a couple of patches.

gdb/ChangeLog:
2018-05-02  Pedro Alves  <palves@redhat.com>

	* alpha-linux-nat.c: Include "linux-nat-trad.h" instead of
	"linux-nat.h".
	* configure.nat (alpha-linux, linux-mips): Add linux-nat-trad.o.
	* inf-ptrace.c (inf_ptrace_register_u_offset)
	(inf_ptrace_fetch_register, inf_ptrace_fetch_registers)
	(inf_ptrace_store_register, inf_ptrace_store_registers)
	(inf_ptrace_trad_target): Move to ...
	* linux-nat-trad.c: ... this new file.
	* linux-nat-trad.h: New file.
	* linux-nat.c (linux_target_install_ops): Make extern.
	(linux_trad_target): Delete.
	* linux-nat.h (linux_trad_target): Delete declaration.
	(linux_target_install_ops): Declare.
	* mips-linux-nat.c: Include "linux-nat-trad.h" instead of
	"linux-nat.h".
2018-05-03 00:47:32 +01:00

99 lines
2.7 KiB
C

/* Low level Alpha GNU/Linux interface, for GDB when running native.
Copyright (C) 2005-2018 Free Software Foundation, Inc.
This file is part of GDB.
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
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "target.h"
#include "regcache.h"
#include "linux-nat-trad.h"
#include "alpha-tdep.h"
#include "nat/gdb_ptrace.h"
#include <alpha/ptrace.h>
#include <sys/procfs.h>
#include "gregset.h"
/* The address of UNIQUE for ptrace. */
#define ALPHA_UNIQUE_PTRACE_ADDR 65
/* See the comment in m68k-tdep.c regarding the utility of these
functions. */
void
supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
{
const long *regp = (const long *)gregsetp;
/* PC is in slot 32, UNIQUE is in slot 33. */
alpha_supply_int_regs (regcache, -1, regp, regp + 31, regp + 32);
}
void
fill_gregset (const struct regcache *regcache,
gdb_gregset_t *gregsetp, int regno)
{
long *regp = (long *)gregsetp;
/* PC is in slot 32, UNIQUE is in slot 33. */
alpha_fill_int_regs (regcache, regno, regp, regp + 31, regp + 32);
}
/* Now we do the same thing for floating-point registers.
Again, see the comments in m68k-tdep.c. */
void
supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
{
const long *regp = (const long *)fpregsetp;
/* FPCR is in slot 32. */
alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
}
void
fill_fpregset (const struct regcache *regcache,
gdb_fpregset_t *fpregsetp, int regno)
{
long *regp = (long *)fpregsetp;
/* FPCR is in slot 32. */
alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
}
static CORE_ADDR
alpha_linux_register_u_offset (struct gdbarch *gdbarch, int regno, int store_p)
{
if (regno == gdbarch_pc_regnum (gdbarch))
return PC;
if (regno == ALPHA_UNIQUE_REGNUM)
return ALPHA_UNIQUE_PTRACE_ADDR;
if (regno < gdbarch_fp0_regnum (gdbarch))
return GPR_BASE + regno;
else
return FPR_BASE + regno - gdbarch_fp0_regnum (gdbarch);
}
void
_initialize_alpha_linux_nat (void)
{
linux_nat_add_target (linux_trad_target (alpha_linux_register_u_offset));
}