From 7b46bf6f83c444ac84b3b88ebd89a8dae0de2f37 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 12 Jun 2020 16:06:43 -0400 Subject: [PATCH] gdbserver: remove support for CRIS This port has been unmaintained for years and the upstream Linux kernel does not support this architecture anymore, remove it. gdbserver/ChangeLog: * Makefile.in (SFILES): Remove linux-cris-low.c. * configure.srv: Remove cris cases. * linux-cris-low.cc, linux-crisv32-low.cc: Remove. Change-Id: Ib3ff436b03373548215f15540a47f39cbec5f512 --- gdbserver/ChangeLog | 6 + gdbserver/Makefile.in | 2 - gdbserver/configure.srv | 10 - gdbserver/linux-cris-low.cc | 169 ------------ gdbserver/linux-crisv32-low.cc | 472 --------------------------------- 5 files changed, 6 insertions(+), 653 deletions(-) delete mode 100644 gdbserver/linux-cris-low.cc delete mode 100644 gdbserver/linux-crisv32-low.cc diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index e49c8186556..c857f001404 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2020-06-12 Simon Marchi + + * Makefile.in (SFILES): Remove linux-cris-low.c. + * configure.srv: Remove cris cases. + * linux-cris-low.cc, linux-crisv32-low.cc: Remove. + 2020-06-12 Simon Marchi * Makefile.in (SFILES): Remove linux-bfin-low.c. diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in index 58577ca898c..32996293817 100644 --- a/gdbserver/Makefile.in +++ b/gdbserver/Makefile.in @@ -180,8 +180,6 @@ SFILES = \ $(srcdir)/inferiors.cc \ $(srcdir)/linux-aarch64-low.cc \ $(srcdir)/linux-arm-low.cc \ - $(srcdir)/linux-cris-low.cc \ - $(srcdir)/linux-crisv32-low.cc \ $(srcdir)/linux-ia64-low.cc \ $(srcdir)/linux-low.cc \ $(srcdir)/linux-m32r-low.cc \ diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv index 4b4e25a5e5e..e362c961703 100644 --- a/gdbserver/configure.srv +++ b/gdbserver/configure.srv @@ -81,16 +81,6 @@ case "${gdbserver_host}" in srv_mingw=yes srv_mingwce=yes ;; - crisv32-*-linux*) srv_regobj=reg-crisv32.o - srv_tgtobj="$srv_linux_obj linux-crisv32-low.o" - srv_linux_regsets=yes - srv_linux_thread_db=yes - ;; - cris-*-linux*) srv_regobj=reg-cris.o - srv_tgtobj="$srv_linux_obj linux-cris-low.o" - srv_linux_usrregs=yes - srv_linux_thread_db=yes - ;; i[34567]86-*-cygwin*) srv_regobj="" srv_tgtobj="x86-low.o nat/x86-dregs.o win32-low.o" srv_tgtobj="${srv_tgtobj} win32-i386-low.o" diff --git a/gdbserver/linux-cris-low.cc b/gdbserver/linux-cris-low.cc deleted file mode 100644 index 555941414e0..00000000000 --- a/gdbserver/linux-cris-low.cc +++ /dev/null @@ -1,169 +0,0 @@ -/* GNU/Linux/CRIS specific low level interface, for the remote server for GDB. - Copyright (C) 1995-2020 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 . */ - -#include "server.h" -#include "linux-low.h" -#include "nat/gdb_ptrace.h" - -/* Linux target op definitions for the CRIS architecture. */ - -class cris_target : public linux_process_target -{ -public: - - const regs_info *get_regs_info () override; - - const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override; - -protected: - - void low_arch_setup () override; - - bool low_cannot_fetch_register (int regno) override; - - bool low_cannot_store_register (int regno) override; - - bool low_supports_breakpoints () override; - - CORE_ADDR low_get_pc (regcache *regcache) override; - - void low_set_pc (regcache *regcache, CORE_ADDR newpc) override; - - bool low_breakpoint_at (CORE_ADDR pc) override; -}; - -/* The singleton target ops object. */ - -static cris_target the_cris_target; - -bool -cris_target::low_supports_breakpoints () -{ - return true; -} - -CORE_ADDR -cris_target::low_get_pc (regcache *regcache) -{ - return linux_get_pc_32bit (regcache); -} - -void -cris_target::low_set_pc (regcache *regcache, CORE_ADDR pc) -{ - linux_set_pc_32bit (regcache, pc); -} - -/* Defined in auto-generated file reg-cris.c. */ -void init_registers_cris (void); -extern const struct target_desc *tdesc_cris; - -/* CRISv10 */ -#define cris_num_regs 32 - -/* Locations need to match . */ -static int cris_regmap[] = { - 15*4, 14*4, 13*4, 12*4, - 11*4, 10*4, 9*4, 8*4, - 7*4, 6*4, 5*4, 4*4, - 3*4, 2*4, 23*4, 19*4, - - -1, -1, -1, -1, - -1, 17*4, -1, 16*4, - -1, -1, -1, 18*4, - -1, 17*4, -1, -1 - -}; - -bool -cris_target::low_cannot_store_register (int regno) -{ - if (cris_regmap[regno] == -1) - return true; - - return (regno >= cris_num_regs); -} - -bool -cris_target::low_cannot_fetch_register (int regno) -{ - if (cris_regmap[regno] == -1) - return true; - - return (regno >= cris_num_regs); -} - -static const unsigned short cris_breakpoint = 0xe938; -#define cris_breakpoint_len 2 - -/* Implementation of target ops method "sw_breakpoint_from_kind". */ - -const gdb_byte * -cris_target::sw_breakpoint_from_kind (int kind, int *size) -{ - *size = cris_breakpoint_len; - return (const gdb_byte *) &cris_breakpoint; -} - -bool -cris_target::low_breakpoint_at (CORE_ADDR where) -{ - unsigned short insn; - - read_memory (where, (unsigned char *) &insn, cris_breakpoint_len); - if (insn == cris_breakpoint) - return true; - - /* If necessary, recognize more trap instructions here. GDB only uses the - one. */ - return false; -} - -void -cris_target::low_arch_setup () -{ - current_process ()->tdesc = tdesc_cris; -} - -static struct usrregs_info cris_usrregs_info = - { - cris_num_regs, - cris_regmap, - }; - -static struct regs_info myregs_info = - { - NULL, /* regset_bitmap */ - &cris_usrregs_info, - }; - -const regs_info * -cris_target::get_regs_info () -{ - return &myregs_info; -} - -/* The linux target ops object. */ - -linux_process_target *the_linux_target = &the_cris_target; - -void -initialize_low_arch (void) -{ - init_registers_cris (); -} diff --git a/gdbserver/linux-crisv32-low.cc b/gdbserver/linux-crisv32-low.cc deleted file mode 100644 index 577039ae2db..00000000000 --- a/gdbserver/linux-crisv32-low.cc +++ /dev/null @@ -1,472 +0,0 @@ -/* GNU/Linux/CRIS specific low level interface, for the remote server for GDB. - Copyright (C) 1995-2020 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 . */ - -#include "server.h" -#include "linux-low.h" -#include "nat/gdb_ptrace.h" - -/* Linux target op definitions for the CRIS architecture. */ - -class crisv32_target : public linux_process_target -{ -public: - - const regs_info *get_regs_info () override; - - const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override; - - bool supports_z_point_type (char z_type) override; - -protected: - - void low_arch_setup () override; - - bool low_cannot_fetch_register (int regno) override; - - bool low_cannot_store_register (int regno) override; - - bool low_supports_breakpoints () override; - - CORE_ADDR low_get_pc (regcache *regcache) override; - - void low_set_pc (regcache *regcache, CORE_ADDR newpc) override; - - bool low_breakpoint_at (CORE_ADDR pc) override; - - int low_insert_point (raw_bkpt_type type, CORE_ADDR addr, - int size, raw_breakpoint *bp) override; - - int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, - int size, raw_breakpoint *bp) override; - - bool low_stopped_by_watchpoint () override; - - CORE_ADDR low_stopped_data_address () override; -}; - -/* The singleton target ops object. */ - -static crisv32_target the_crisv32_target; - -bool -crisv32_target::low_cannot_fetch_register (int regno) -{ - gdb_assert_not_reached ("linux target op low_cannot_fetch_register " - "is not implemented by the target"); -} - -bool -crisv32_target::low_cannot_store_register (int regno) -{ - gdb_assert_not_reached ("linux target op low_cannot_store_register " - "is not implemented by the target"); -} - -bool -crisv32_target::low_supports_breakpoints () -{ - return true; -} - -CORE_ADDR -crisv32_target::low_get_pc (regcache *regcache) -{ - return linux_get_pc_32bit (regcache); -} - -void -crisv32_target::low_set_pc (regcache *regcache, CORE_ADDR pc) -{ - linux_set_pc_32bit (regcache, pc); -} - -/* Defined in auto-generated file reg-crisv32.c. */ -void init_registers_crisv32 (void); -extern const struct target_desc *tdesc_crisv32; - -/* CRISv32 */ -#define cris_num_regs 49 - -#ifndef PTRACE_GET_THREAD_AREA -#define PTRACE_GET_THREAD_AREA 25 -#endif - -/* Note: Ignoring USP (having the stack pointer in two locations causes trouble - without any significant gain). */ - -/* Locations need to match . */ -static int cris_regmap[] = { - 1*4, 2*4, 3*4, 4*4, - 5*4, 6*4, 7*4, 8*4, - 9*4, 10*4, 11*4, 12*4, - 13*4, 14*4, 24*4, 15*4, - - -1, -1, -1, 16*4, - -1, 22*4, 23*4, 17*4, - -1, -1, 21*4, 20*4, - -1, 19*4, -1, 18*4, - - 25*4, - - 26*4, -1, -1, 29*4, - 30*4, 31*4, 32*4, 33*4, - 34*4, 35*4, 36*4, 37*4, - 38*4, 39*4, 40*4, -1 - -}; - -static const unsigned short cris_breakpoint = 0xe938; -#define cris_breakpoint_len 2 - -/* Implementation of target ops method "sw_breakpoint_from_kind". */ - -const gdb_byte * -crisv32_target::sw_breakpoint_from_kind (int kind, int *size) -{ - *size = cris_breakpoint_len; - return (const gdb_byte *) &cris_breakpoint; -} - -bool -crisv32_target::low_breakpoint_at (CORE_ADDR where) -{ - unsigned short insn; - - read_memory (where, (unsigned char *) &insn, cris_breakpoint_len); - if (insn == cris_breakpoint) - return true; - - /* If necessary, recognize more trap instructions here. GDB only uses the - one. */ - return false; -} - -static void -cris_write_data_breakpoint (struct regcache *regcache, - int bp, unsigned long start, unsigned long end) -{ - switch (bp) - { - case 0: - supply_register_by_name (regcache, "s3", &start); - supply_register_by_name (regcache, "s4", &end); - break; - case 1: - supply_register_by_name (regcache, "s5", &start); - supply_register_by_name (regcache, "s6", &end); - break; - case 2: - supply_register_by_name (regcache, "s7", &start); - supply_register_by_name (regcache, "s8", &end); - break; - case 3: - supply_register_by_name (regcache, "s9", &start); - supply_register_by_name (regcache, "s10", &end); - break; - case 4: - supply_register_by_name (regcache, "s11", &start); - supply_register_by_name (regcache, "s12", &end); - break; - case 5: - supply_register_by_name (regcache, "s13", &start); - supply_register_by_name (regcache, "s14", &end); - break; - } -} - -bool -crisv32_target::supports_z_point_type (char z_type) -{ - switch (z_type) - { - case Z_PACKET_WRITE_WP: - case Z_PACKET_READ_WP: - case Z_PACKET_ACCESS_WP: - return true; - default: - return false; - } -} - -int -crisv32_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr, - int len, raw_breakpoint *bp) -{ - int bp; - unsigned long bp_ctrl; - unsigned long start, end; - unsigned long ccs; - struct regcache *regcache; - - regcache = get_thread_regcache (current_thread, 1); - - /* Read watchpoints are set as access watchpoints, because of GDB's - inability to deal with pure read watchpoints. */ - if (type == raw_bkpt_type_read_wp) - type = raw_bkpt_type_access_wp; - - /* Get the configuration register. */ - collect_register_by_name (regcache, "s0", &bp_ctrl); - - /* The watchpoint allocation scheme is the simplest possible. - For example, if a region is watched for read and - a write watch is requested, a new watchpoint will - be used. Also, if a watch for a region that is already - covered by one or more existing watchpoints, a new - watchpoint will be used. */ - - /* First, find a free data watchpoint. */ - for (bp = 0; bp < 6; bp++) - { - /* Each data watchpoint's control registers occupy 2 bits - (hence the 3), starting at bit 2 for D0 (hence the 2) - with 4 bits between for each watchpoint (yes, the 4). */ - if (!(bp_ctrl & (0x3 << (2 + (bp * 4))))) - break; - } - - if (bp > 5) - { - /* We're out of watchpoints. */ - return -1; - } - - /* Configure the control register first. */ - if (type == raw_bkpt_type_read_wp || type == raw_bkpt_type_access_wp) - { - /* Trigger on read. */ - bp_ctrl |= (1 << (2 + bp * 4)); - } - if (type == raw_bkpt_type_write_wp || type == raw_bkpt_type_access_wp) - { - /* Trigger on write. */ - bp_ctrl |= (2 << (2 + bp * 4)); - } - - /* Setup the configuration register. */ - supply_register_by_name (regcache, "s0", &bp_ctrl); - - /* Setup the range. */ - start = addr; - end = addr + len - 1; - - /* Configure the watchpoint register. */ - cris_write_data_breakpoint (regcache, bp, start, end); - - collect_register_by_name (regcache, "ccs", &ccs); - /* Set the S1 flag to enable watchpoints. */ - ccs |= (1 << 19); - supply_register_by_name (regcache, "ccs", &ccs); - - return 0; -} - -int -crisv32_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, - int len, raw_breakpoint *bp) -{ - int bp; - unsigned long bp_ctrl; - unsigned long start, end; - struct regcache *regcache; - unsigned long bp_d_regs[12]; - - regcache = get_thread_regcache (current_thread, 1); - - /* Read watchpoints are set as access watchpoints, because of GDB's - inability to deal with pure read watchpoints. */ - if (type == raw_bkpt_type_read_wp) - type = raw_bkpt_type_access_wp; - - /* Get the configuration register. */ - collect_register_by_name (regcache, "s0", &bp_ctrl); - - /* Try to find a watchpoint that is configured for the - specified range, then check that read/write also matches. */ - - /* Ugly pointer arithmetic, since I cannot rely on a - single switch (addr) as there may be several watchpoints with - the same start address for example. */ - - /* Get all range registers to simplify search. */ - collect_register_by_name (regcache, "s3", &bp_d_regs[0]); - collect_register_by_name (regcache, "s4", &bp_d_regs[1]); - collect_register_by_name (regcache, "s5", &bp_d_regs[2]); - collect_register_by_name (regcache, "s6", &bp_d_regs[3]); - collect_register_by_name (regcache, "s7", &bp_d_regs[4]); - collect_register_by_name (regcache, "s8", &bp_d_regs[5]); - collect_register_by_name (regcache, "s9", &bp_d_regs[6]); - collect_register_by_name (regcache, "s10", &bp_d_regs[7]); - collect_register_by_name (regcache, "s11", &bp_d_regs[8]); - collect_register_by_name (regcache, "s12", &bp_d_regs[9]); - collect_register_by_name (regcache, "s13", &bp_d_regs[10]); - collect_register_by_name (regcache, "s14", &bp_d_regs[11]); - - for (bp = 0; bp < 6; bp++) - { - if (bp_d_regs[bp * 2] == addr - && bp_d_regs[bp * 2 + 1] == (addr + len - 1)) { - /* Matching range. */ - int bitpos = 2 + bp * 4; - int rw_bits; - - /* Read/write bits for this BP. */ - rw_bits = (bp_ctrl & (0x3 << bitpos)) >> bitpos; - - if ((type == raw_bkpt_type_read_wp && rw_bits == 0x1) - || (type == raw_bkpt_type_write_wp && rw_bits == 0x2) - || (type == raw_bkpt_type_access_wp && rw_bits == 0x3)) - { - /* Read/write matched. */ - break; - } - } - } - - if (bp > 5) - { - /* No watchpoint matched. */ - return -1; - } - - /* Found a matching watchpoint. Now, deconfigure it by - both disabling read/write in bp_ctrl and zeroing its - start/end addresses. */ - bp_ctrl &= ~(3 << (2 + (bp * 4))); - /* Setup the configuration register. */ - supply_register_by_name (regcache, "s0", &bp_ctrl); - - start = end = 0; - /* Configure the watchpoint register. */ - cris_write_data_breakpoint (regcache, bp, start, end); - - /* Note that we don't clear the S1 flag here. It's done when continuing. */ - return 0; -} - -bool -crisv32_target::low_stopped_by_watchpoint () -{ - unsigned long exs; - struct regcache *regcache = get_thread_regcache (current_thread, 1); - - collect_register_by_name (regcache, "exs", &exs); - - return (((exs & 0xff00) >> 8) == 0xc); -} - -CORE_ADDR -crisv32_target::low_stopped_data_address () -{ - unsigned long eda; - struct regcache *regcache = get_thread_regcache (current_thread, 1); - - collect_register_by_name (regcache, "eda", &eda); - - /* FIXME: Possibly adjust to match watched range. */ - return eda; -} - -ps_err_e -ps_get_thread_area (struct ps_prochandle *ph, - lwpid_t lwpid, int idx, void **base) -{ - if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0) - return PS_ERR; - - /* IDX is the bias from the thread pointer to the beginning of the - thread descriptor. It has to be subtracted due to implementation - quirks in libthread_db. */ - *base = (void *) ((char *) *base - idx); - return PS_OK; -} - -static void -cris_fill_gregset (struct regcache *regcache, void *buf) -{ - int i; - - for (i = 0; i < cris_num_regs; i++) - { - if (cris_regmap[i] != -1) - collect_register (regcache, i, ((char *) buf) + cris_regmap[i]); - } -} - -static void -cris_store_gregset (struct regcache *regcache, const void *buf) -{ - int i; - - for (i = 0; i < cris_num_regs; i++) - { - if (cris_regmap[i] != -1) - supply_register (regcache, i, ((char *) buf) + cris_regmap[i]); - } -} - -void -crisv32_target::low_arch_setup () -{ - current_process ()->tdesc = tdesc_crisv32; -} - -static struct regset_info cris_regsets[] = { - { PTRACE_GETREGS, PTRACE_SETREGS, 0, cris_num_regs * 4, - GENERAL_REGS, cris_fill_gregset, cris_store_gregset }, - NULL_REGSET -}; - - -static struct regsets_info cris_regsets_info = - { - cris_regsets, /* regsets */ - 0, /* num_regsets */ - NULL, /* disabled_regsets */ - }; - -static struct usrregs_info cris_usrregs_info = - { - cris_num_regs, - cris_regmap, - }; - -static struct regs_info myregs_info = - { - NULL, /* regset_bitmap */ - &cris_usrregs_info, - &cris_regsets_info - }; - -const regs_info * -crisv32_target::get_regs_info () -{ - return &myregs_info; -} - -/* The linux target ops object. */ - -linux_process_target *the_linux_target = &the_crisv32_target; - -void -initialize_low_arch (void) -{ - init_registers_crisv32 (); - - initialize_regsets_info (&cris_regsets_info); -} -- 2.30.2