forked from Imagelibrary/binutils-gdb
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.
234 lines
5.9 KiB
C
234 lines
5.9 KiB
C
|
|
/*
|
|
* Ovlymgr.c -- Runtime Overlay Manager for the GDB testsuite.
|
|
*/
|
|
|
|
#include "ovlymgr.h"
|
|
|
|
/* Local functions and data: */
|
|
|
|
extern unsigned long _ovly_table[][4];
|
|
extern unsigned long _novlys __attribute__ ((section (".data")));
|
|
enum ovly_index { VMA, SIZE, LMA, MAPPED};
|
|
|
|
static void ovly_copy (unsigned long dst, unsigned long src, long size);
|
|
|
|
/* Flush the data and instruction caches at address START for SIZE bytes.
|
|
Support for each new port must be added here. */
|
|
/* FIXME: Might be better to have a standard libgloss function that
|
|
ports provide that we can then use. Use libgloss instead of newlib
|
|
since libgloss is the one intended to handle low level system issues.
|
|
I would suggest something like _flush_cache to avoid the user's namespace
|
|
but not be completely obscure as other things may need this facility. */
|
|
|
|
static void
|
|
FlushCache (void)
|
|
{
|
|
#ifdef __M32R__
|
|
volatile char *mspr = (char *) 0xfffffff7;
|
|
*mspr = 1;
|
|
#endif
|
|
}
|
|
|
|
/* _ovly_debug_event:
|
|
* Debuggers may set a breakpoint here, to be notified
|
|
* when the overlay table has been modified.
|
|
*/
|
|
static void
|
|
_ovly_debug_event (void)
|
|
{
|
|
}
|
|
|
|
/* OverlayLoad:
|
|
* Copy the overlay into its runtime region,
|
|
* and mark the overlay as "mapped".
|
|
*/
|
|
|
|
bool
|
|
OverlayLoad (unsigned long ovlyno)
|
|
{
|
|
unsigned long i;
|
|
|
|
if (ovlyno < 0 || ovlyno >= _novlys)
|
|
exit (-1); /* fail, bad ovly number */
|
|
|
|
if (_ovly_table[ovlyno][MAPPED])
|
|
return TRUE; /* this overlay already mapped -- nothing to do! */
|
|
|
|
for (i = 0; i < _novlys; i++)
|
|
if (i == ovlyno)
|
|
_ovly_table[i][MAPPED] = 1; /* this one now mapped */
|
|
else if (_ovly_table[i][VMA] == _ovly_table[ovlyno][VMA])
|
|
_ovly_table[i][MAPPED] = 0; /* this one now un-mapped */
|
|
|
|
ovly_copy (_ovly_table[ovlyno][VMA],
|
|
_ovly_table[ovlyno][LMA],
|
|
_ovly_table[ovlyno][SIZE]);
|
|
|
|
FlushCache ();
|
|
_ovly_debug_event ();
|
|
return TRUE;
|
|
}
|
|
|
|
/* OverlayUnload:
|
|
* Copy the overlay back into its "load" region.
|
|
* Does NOT mark overlay as "unmapped", therefore may be called
|
|
* more than once for the same mapped overlay.
|
|
*/
|
|
|
|
bool
|
|
OverlayUnload (unsigned long ovlyno)
|
|
{
|
|
if (ovlyno < 0 || ovlyno >= _novlys)
|
|
exit (-1); /* fail, bad ovly number */
|
|
|
|
if (!_ovly_table[ovlyno][MAPPED])
|
|
exit (-1); /* error, can't copy out a segment that's not "in" */
|
|
|
|
ovly_copy (_ovly_table[ovlyno][LMA],
|
|
_ovly_table[ovlyno][VMA],
|
|
_ovly_table[ovlyno][SIZE]);
|
|
|
|
_ovly_debug_event ();
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef __D10V__
|
|
#define IMAP0 (*(short *)(0xff00))
|
|
#define IMAP1 (*(short *)(0xff02))
|
|
#define DMAP (*(short *)(0xff04))
|
|
|
|
static void
|
|
D10VTranslate (unsigned long logical,
|
|
short *dmap,
|
|
unsigned long **addr)
|
|
{
|
|
unsigned long physical;
|
|
unsigned long seg;
|
|
unsigned long off;
|
|
|
|
/* to access data, we use the following mapping
|
|
0x00xxxxxx: Logical data address segment (DMAP translated memory)
|
|
0x01xxxxxx: Logical instruction address segment (IMAP translated memory)
|
|
0x10xxxxxx: Physical data memory segment (On-chip data memory)
|
|
0x11xxxxxx: Physical instruction memory segment (On-chip insn memory)
|
|
0x12xxxxxx: Phisical unified memory segment (Unified memory)
|
|
*/
|
|
|
|
/* Addresses must be correctly aligned */
|
|
if (logical & (sizeof (**addr) - 1))
|
|
exit (-1);
|
|
|
|
/* If the address is in one of the two logical address spaces, it is
|
|
first translated into a physical address */
|
|
seg = (logical >> 24);
|
|
off = (logical & 0xffffffL);
|
|
switch (seg)
|
|
{
|
|
case 0x00: /* in logical data address segment */
|
|
if (off <= 0x7fffL)
|
|
physical = (0x10L << 24) + off;
|
|
else
|
|
/* Logical address out side of on-chip segment, not
|
|
supported */
|
|
exit (-1);
|
|
break;
|
|
case 0x01: /* in logical instruction address segment */
|
|
{
|
|
short map;
|
|
if (off <= 0x1ffffL)
|
|
map = IMAP0;
|
|
else if (off <= 0x3ffffL)
|
|
map = IMAP1;
|
|
else
|
|
/* Logical address outside of IMAP[01] segment, not
|
|
supported */
|
|
exit (-1);
|
|
if (map & 0x1000L)
|
|
{
|
|
/* Instruction memory */
|
|
physical = (0x11L << 24) | off;
|
|
}
|
|
else
|
|
{
|
|
/* Unified memory */
|
|
physical = ((map & 0x7fL) << 17) + (off & 0x1ffffL);
|
|
if (physical > 0xffffffL)
|
|
/* Address outside of unified address segment */
|
|
exit (-1);
|
|
physical |= (0x12L << 24);
|
|
}
|
|
break;
|
|
}
|
|
case 0x10:
|
|
case 0x11:
|
|
case 0x12:
|
|
physical = logical;
|
|
break;
|
|
default:
|
|
exit (-1); /* error */
|
|
}
|
|
|
|
seg = (physical >> 24);
|
|
off = (physical & 0xffffffL);
|
|
switch (seg)
|
|
{
|
|
case 0x10: /* dst is a 15 bit offset into the on-chip memory */
|
|
*dmap = 0;
|
|
*addr = (long *) (0x0000 + ((short)off & 0x7fff));
|
|
break;
|
|
case 0x11: /* dst is an 18-bit offset into the on-chip
|
|
instruction memory */
|
|
*dmap = 0x1000L | ((off & 0x3ffffL) >> 14);
|
|
*addr = (long *) (0x8000 + ((short)off & 0x3fff));
|
|
break;
|
|
case 0x12: /* dst is a 24-bit offset into unified memory */
|
|
*dmap = off >> 14;
|
|
*addr = (long *) (0x8000 + ((short)off & 0x3fff));
|
|
break;
|
|
default:
|
|
exit (-1); /* error */
|
|
}
|
|
}
|
|
#endif /* __D10V__ */
|
|
|
|
static void
|
|
ovly_copy (unsigned long dst, unsigned long src, long size)
|
|
{
|
|
#ifdef __D10V__
|
|
unsigned long *s, *d, tmp;
|
|
short dmap_src, dmap_dst;
|
|
short dmap_save;
|
|
|
|
/* all section sizes should by multiples of 4 bytes */
|
|
dmap_save = DMAP;
|
|
|
|
D10VTranslate (src, &dmap_src, &s);
|
|
D10VTranslate (dst, &dmap_dst, &d);
|
|
|
|
while (size > 0)
|
|
{
|
|
/* NB: Transfer 4 byte (long) quantites, problems occure
|
|
when only two bytes are transfered */
|
|
DMAP = dmap_src;
|
|
tmp = *s;
|
|
DMAP = dmap_dst;
|
|
*d = tmp;
|
|
d++;
|
|
s++;
|
|
size -= sizeof (tmp);
|
|
src += sizeof (tmp);
|
|
dst += sizeof (tmp);
|
|
if ((src & 0x3fff) == 0)
|
|
D10VTranslate (src, &dmap_src, &s);
|
|
if ((dst & 0x3fff) == 0)
|
|
D10VTranslate (dst, &dmap_dst, &d);
|
|
}
|
|
DMAP = dmap_save;
|
|
#else
|
|
memcpy ((void *) dst, (void *) src, size);
|
|
#endif /* D10V */
|
|
return;
|
|
}
|
|
|