binutils-gdb/gdb/gdbserver/linux-ppc-ipa.c
Ulrich Weigand abf516c693 Remove Cell Broadband Engine debugging support
This patch implements removal of Cell/B.E. support, including
- Support for the spu-*-* target
- Support for native stand-alone SPU debugging
- Support for integrated debugging of combined PPU/SPU applications
- Remote debugging (gdbserver) support for all the above.

The patch also removes the TARGET_OBJECT_SPU target object type,
as this is available only on Cell/B.E. targets, including
- Native Linux support
- Core file support (including core file generation)
- Remote target support, including removal of the qXfer:spu:read
  and qXfer:spu:write remote protocal packets and associated
  support in gdbserver.

gdb/ChangeLog
2019-09-20  Ulrich Weigand  <uweigand@de.ibm.com>

	* NEWS: Mention that Cell/B.E. debugging support was removed.
	* MAINTAINERS: Remove spu target.

	* config/djgpp/fnchange.lst: Remove entries for removed files.

	* Makefile.in (ALL_TARGET_OBS): Remove solib-spu.o,
	spu-multiarch.o, and spu-tdep.o.
	(HFILES_NO_SRCDIR): Remove solib-spu.h and spu-tdep.h.
	(ALLDEPFILES): Remove solib-spu.c, spu-linux-nat.c,
	spu-multiarch.c, and spu-tdep.c.
	* spu-linux-nat.c: Remove file.
	* spu-multiarch.c: Remove file.
	* spu-tdep.c: Remove file.
	* spu-tdep.h: Remove file.
	* solib-spu.c: Remove file.
	* solib-spu.h: Remove file.

	* configure.host (powerpc64*-*-linux*): Remove Cell/B.E. support.
	* configure.nat (spu-linux): Remove.
	* configure.tgt (powerpc*-*-linux*): Remove solib-spu.o and
	solib-multiarch.o from gdb_target_obs.
	(spu*-*-*): Remove.

	* arch/ppc-linux-common.h (struct ppc_linux_features): Remove "cell"
	feature flag.
	(ppc_linux_no_features): Update.
	* arch/ppc-linux-common.c (ppc_linux_match_description): Remove
	Cell/B.E. support.
	* arch/ppc-linux-tdesc.h (tdesc_powerpc_cell32l): Remove declaration.
	(tdesc_powerpc_cell64l): Likewise.
	* nat/ppc-linux.h (PPC_FEATURE_CELL): Remove.
	* ppc-linux-nat.c (ppc_linux_nat_target::read_description): Remove
	Cell/B.E. support.
	* ppc-linux-tdep.h: Do not include "solib-spu.h" or "spu-tdep.h".
	Do not include "features/rs6000/powerpc-cell32l.c" or
	"features/rs6000/powerpc-cell64l.c".
	(ppc_linux_spu_section): Remove.
	(ppc_linux_core_read_description): Remove Cell/B.E. support.
	(spe_context_objfile, spe_context_lm_addr, spe_context_offset,
	spe_context_cache_ptid, spe_context_cache_ptid): Remove.
	(ppc_linux_spe_context_lookup): Remove.
	(ppc_linux_spe_context_inferior_created): Remove.
	(ppc_linux_spe_context_solib_loaded): Remove.
	(ppc_linux_spe_context_solib_unloaded): Remove.
	(ppc_linux_spe_context): Remove.
	(struct ppu2spu_cache): Remove.
	(ppu2spu_prev_arch, ppu2spu_this_id, ppu2spu_prev_register): Remove.
	(struct ppu2spu_data): Remove.
	(ppu2spu_unwind_register, ppu2spu_sniffer, ppu2spu_dealloc_cache,
	ppu2spu_unwind): Remove.
	(ppc_linux_init_abi): Remove Cell/B.E. support.
	* rs6000-tdep.h (rs6000_gdbarch_init): Remove Cell/B.E. support.

	* features/Makefile (rs6000/powerpc-cell32l-expedite): Remove.
	(rs6000/powerpc-cell64l-expedite): Likewise
	(WHICH): Remove rs6000/powerpc-cell32l and rs6000/powerpc-cell64l.
	(XMLTOC): Remove rs6000/powerpc-cell32l.xml and
	rs6000/powerpc-cell64l.xml.
	* features/rs6000/powerpc-cell32l.xml: Remove.
	* features/rs6000/powerpc-cell64l.xml: Likewise.
	* features/rs6000/powerpc-cell32l.c: Remove generated file.
	* features/rs6000/powerpc-cell64l.c: Likewise.
	* regformats/rs6000/powerpc-cell32l.dat: Remove generated file.
	* regformats/rs6000/powerpc-cell64l.dat: Likewise.
	* regformats/reg-spu.dat: Remove.

	* target.h (enum target_object): Remove TARGET_OBJECT_SPU.
	* corelow.c (struct spuid_list): Remove.
	(add_to_spuid_list): Remove.
	(core_target::xfer_partial): Remove support for TARGET_OBJECT_SPU.
	* remote.c (PACKET_qXfer_spu_read, PACKET_qXfer_spu_write): Remove.
	(remote_protocol_features): Remove associated entries.
	(_initialize_remote): No longer initialize them.
	(remote_target::xfer_partial): Remove support for TARGET_OBJECT_SPU.
	* linux-nat.c (SPUFS_MAGIC): Remove.
	(linux_proc_xfer_spu): Remove.
	(spu_enumerate_spu_ids): Remove.
	(linux_nat_target::xfer_partial): Remove support for TARGET_OBJECT_SPU.
	* linux-tdep.c (-linux_spu_make_corefile_notes): Remove.
	(linux_make_corefile_notes): No longer call it.

	* regcache.c (cooked_read_test): Remove bfd_arch_spu special case.
	(cooked_write_test): Likewise.

gdb/doc/ChangeLog
2019-09-20  Ulrich Weigand  <uweigand@de.ibm.com>

	* doc/gdb.texinfo (Remote Configuration): Remove documentation for
	qXfer:spu:read and qXfer:spu:write.
	(General Query Packets): Likewise.
	(Cell Broadband Engine SPU architecture): Remove subsection.

gdb/gdbserver/ChangeLog
2019-09-20  Ulrich Weigand  <uweigand@de.ibm.com>

	* configure.srv (ipa_ppc_linux_regobj): Remove powerpc-cell32l-ipa.o
	and powerpc-cell64l-ipa.o.
	(powerpc*-*-linux*): Remove powerpc-cell32l.o and powerpc-cell64l.o
	from srv_regobj.  Remove rs6000/powerpc-cell32l.xml and
	rs6000/powerpc-cell64l.xml from srv_xmlfiles.
	(spu*-*-*): Remove.

	* spu-low.c: Remove file.

	* linux-ppc-low.c (INSTR_SC, NR_spu_run): Remove.
	(parse_spufs_run): Remove.
	(ppc_get_pc): Remove Cell/B.E. support.
	(ppc_set_pc): Likewise.
	(ppc_breakpoint_at): Likewise.
	(ppc_arch_setup): Likewise.
	(ppc_get_ipa_tdesc_idx): Do not handle tdesc_powerpc_cell64l or
	tdesc_powerpc_cell32l.
	(initialize_low_arch): Do not call init_registers_powerpc_cell64l
	or init_registers_powerpc_cell32l.
	* linux-ppc-ipa.c (get_ipa_tdesc): Do not handle PPC_TDESC_CELL.
	(initialize_low_tracepoint): Do not call init_registers_powerpc_cell64l
	or init_registers_powerpc_cell32l.
	* linux-ppc-tdesc-init.h (PPC_TDESC_CELL): Mark as unused.
	(init_registers_powerpc_cell32l): Remove prototype.
	(init_registers_powerpc_cell64l): Likewise.

	* target.h (struct target_ops): Remove qxfer_spu member.
	* server.c (handle_qxfer_spu): Remove.
	(qxfer_packets): Remove entry for "spu".
	(handle_query): No longer support qXfer:spu:read or qXfer:spu:write.
	* linux-low.c (SPUFS_MAGIC): Remove.
	(spu_enumerate_spu_ids): Remove.
	(linux_qxfer_spu): Remove.
	(linux_target_ops): Remove qxfer_spu member.
	* lynx-low.c (lynx_target_ops): Remove qxfer_spu member.
	* nto-low.c (nto_target_ops): Remove qxfer_spu member.
	* win32-low.c (win32_target_ops): Remove qxfer_spu member.

gdb/testsuite/ChangeLog
2019-09-20  Ulrich Weigand  <uweigand@de.ibm.com>

	* gdb.arch/spu-info.exp: Remove file.
	* gdb.arch/spu-info.c: Remove file.
	* gdb.arch/spu-ls.exp: Remove file.
	* gdb.arch/spu-ls.c: Remove file.

	* gdb.asm/asm-source.exp: Remove support for spu*-*-*.
	* gdb.asm/spu.inc: Remove file.

	* gdb.base/dump.exp: Remove support for spu*-*-*.
	* gdb.base/stack-checking.exp: Likewise.
	* gdb.base/overlays.exp: Likewise.
	* gdb.base/ovlymgr.c: Likewise.
	* gdb.base/spu.ld: Remove file.

	* gdb.cp/bs15503.exp: Remove support for spu*-*-*.
	* gdb.cp/cpexprs.exp: Likewise.
	* gdb.cp/exception.exp: Likewise.
	* gdb.cp/gdb2495.exp: Likewise.
	* gdb.cp/mb-templates.exp: Likewise.
	* gdb.cp/pr9167.exp: Likewise.
	* gdb.cp/userdef.exp: Likewise.

	* gdb.xml/tdesc-regs.exp: Remove support for spu*-*-*.

	* gdb.cell: Remove directory.
	* lib/cell.exp: Remove file.
2019-09-20 23:06:57 +02:00

260 lines
7.5 KiB
C

/* GNU/Linux/PowerPC specific low level interface, for the in-process
agent library for GDB.
Copyright (C) 2016-2019 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 "server.h"
#include <sys/mman.h>
#include "tracepoint.h"
#include "arch/ppc-linux-tdesc.h"
#include "linux-ppc-tdesc-init.h"
#include <elf.h>
#ifdef HAVE_GETAUXVAL
#include <sys/auxv.h>
#endif
/* These macros define the position of registers in the buffer collected
by the fast tracepoint jump pad. */
#define FT_CR_R0 0
#define FT_CR_CR 32
#define FT_CR_XER 33
#define FT_CR_LR 34
#define FT_CR_CTR 35
#define FT_CR_PC 36
#define FT_CR_GPR(n) (FT_CR_R0 + (n))
static const int ppc_ft_collect_regmap[] = {
/* GPRs */
FT_CR_GPR (0), FT_CR_GPR (1), FT_CR_GPR (2),
FT_CR_GPR (3), FT_CR_GPR (4), FT_CR_GPR (5),
FT_CR_GPR (6), FT_CR_GPR (7), FT_CR_GPR (8),
FT_CR_GPR (9), FT_CR_GPR (10), FT_CR_GPR (11),
FT_CR_GPR (12), FT_CR_GPR (13), FT_CR_GPR (14),
FT_CR_GPR (15), FT_CR_GPR (16), FT_CR_GPR (17),
FT_CR_GPR (18), FT_CR_GPR (19), FT_CR_GPR (20),
FT_CR_GPR (21), FT_CR_GPR (22), FT_CR_GPR (23),
FT_CR_GPR (24), FT_CR_GPR (25), FT_CR_GPR (26),
FT_CR_GPR (27), FT_CR_GPR (28), FT_CR_GPR (29),
FT_CR_GPR (30), FT_CR_GPR (31),
/* FPRs - not collected. */
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
FT_CR_PC, /* PC */
-1, /* MSR */
FT_CR_CR, /* CR */
FT_CR_LR, /* LR */
FT_CR_CTR, /* CTR */
FT_CR_XER, /* XER */
-1, /* FPSCR */
};
#define PPC_NUM_FT_COLLECT_GREGS \
(sizeof (ppc_ft_collect_regmap) / sizeof(ppc_ft_collect_regmap[0]))
/* Supply registers collected by the fast tracepoint jump pad.
BUF is the second argument we pass to gdb_collect in jump pad. */
void
supply_fast_tracepoint_registers (struct regcache *regcache,
const unsigned char *buf)
{
int i;
for (i = 0; i < PPC_NUM_FT_COLLECT_GREGS; i++)
{
if (ppc_ft_collect_regmap[i] == -1)
continue;
supply_register (regcache, i,
((char *) buf)
+ ppc_ft_collect_regmap[i] * sizeof (long));
}
}
/* Return the value of register REGNUM. RAW_REGS is collected buffer
by jump pad. This function is called by emit_reg. */
ULONGEST
get_raw_reg (const unsigned char *raw_regs, int regnum)
{
if (regnum >= PPC_NUM_FT_COLLECT_GREGS)
return 0;
if (ppc_ft_collect_regmap[regnum] == -1)
return 0;
return *(unsigned long *) (raw_regs
+ ppc_ft_collect_regmap[regnum] * sizeof (long));
}
/* Allocate buffer for the jump pads. The branch instruction has a reach
of +/- 32MiB, and the executable is loaded at 0x10000000 (256MiB).
64-bit: To maximize the area of executable that can use tracepoints,
try allocating at 0x10000000 - size initially, decreasing until we hit
a free area.
32-bit: ld.so loads dynamic libraries right below the executable, so
we cannot depend on that area (dynamic libraries can be quite large).
Instead, aim right after the executable - at sbrk(0). This will
cause future brk to fail, and malloc will fallback to mmap. */
void *
alloc_jump_pad_buffer (size_t size)
{
#ifdef __powerpc64__
uintptr_t addr;
uintptr_t exec_base = getauxval (AT_PHDR);
int pagesize;
void *res;
if (exec_base == 0)
exec_base = 0x10000000;
pagesize = sysconf (_SC_PAGE_SIZE);
if (pagesize == -1)
perror_with_name ("sysconf");
addr = exec_base - size;
/* size should already be page-aligned, but this can't hurt. */
addr &= ~(pagesize - 1);
/* Search for a free area. If we hit 0, we're out of luck. */
for (; addr; addr -= pagesize)
{
/* No MAP_FIXED - we don't want to zap someone's mapping. */
res = mmap ((void *) addr, size,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
/* If we got what we wanted, return. */
if ((uintptr_t) res == addr)
return res;
/* If we got a mapping, but at a wrong address, undo it. */
if (res != MAP_FAILED)
munmap (res, size);
}
return NULL;
#else
void *target = sbrk (0);
void *res = mmap (target, size, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (res == target)
return res;
if (res != MAP_FAILED)
munmap (res, size);
return NULL;
#endif
}
/* Return target_desc to use for IPA, given the tdesc index passed by
gdbserver. */
const struct target_desc *
get_ipa_tdesc (int idx)
{
switch (idx)
{
#ifdef __powerpc64__
case PPC_TDESC_BASE:
return tdesc_powerpc_64l;
case PPC_TDESC_ALTIVEC:
return tdesc_powerpc_altivec64l;
case PPC_TDESC_VSX:
return tdesc_powerpc_vsx64l;
case PPC_TDESC_ISA205:
return tdesc_powerpc_isa205_64l;
case PPC_TDESC_ISA205_ALTIVEC:
return tdesc_powerpc_isa205_altivec64l;
case PPC_TDESC_ISA205_VSX:
return tdesc_powerpc_isa205_vsx64l;
case PPC_TDESC_ISA205_PPR_DSCR_VSX:
return tdesc_powerpc_isa205_ppr_dscr_vsx64l;
case PPC_TDESC_ISA207_VSX:
return tdesc_powerpc_isa207_vsx64l;
case PPC_TDESC_ISA207_HTM_VSX:
return tdesc_powerpc_isa207_htm_vsx64l;
#else
case PPC_TDESC_BASE:
return tdesc_powerpc_32l;
case PPC_TDESC_ALTIVEC:
return tdesc_powerpc_altivec32l;
case PPC_TDESC_VSX:
return tdesc_powerpc_vsx32l;
case PPC_TDESC_ISA205:
return tdesc_powerpc_isa205_32l;
case PPC_TDESC_ISA205_ALTIVEC:
return tdesc_powerpc_isa205_altivec32l;
case PPC_TDESC_ISA205_VSX:
return tdesc_powerpc_isa205_vsx32l;
case PPC_TDESC_ISA205_PPR_DSCR_VSX:
return tdesc_powerpc_isa205_ppr_dscr_vsx32l;
case PPC_TDESC_ISA207_VSX:
return tdesc_powerpc_isa207_vsx32l;
case PPC_TDESC_ISA207_HTM_VSX:
return tdesc_powerpc_isa207_htm_vsx32l;
case PPC_TDESC_E500:
return tdesc_powerpc_e500l;
#endif
default:
internal_error (__FILE__, __LINE__,
"unknown ipa tdesc index: %d", idx);
#ifdef __powerpc64__
return tdesc_powerpc_64l;
#else
return tdesc_powerpc_32l;
#endif
}
}
/* Initialize ipa_tdesc and others. */
void
initialize_low_tracepoint (void)
{
#ifdef __powerpc64__
init_registers_powerpc_64l ();
init_registers_powerpc_altivec64l ();
init_registers_powerpc_vsx64l ();
init_registers_powerpc_isa205_64l ();
init_registers_powerpc_isa205_altivec64l ();
init_registers_powerpc_isa205_vsx64l ();
init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
init_registers_powerpc_isa207_vsx64l ();
init_registers_powerpc_isa207_htm_vsx64l ();
#else
init_registers_powerpc_32l ();
init_registers_powerpc_altivec32l ();
init_registers_powerpc_vsx32l ();
init_registers_powerpc_isa205_32l ();
init_registers_powerpc_isa205_altivec32l ();
init_registers_powerpc_isa205_vsx32l ();
init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
init_registers_powerpc_isa207_vsx32l ();
init_registers_powerpc_isa207_htm_vsx32l ();
init_registers_powerpc_e500l ();
#endif
}