X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-sh-low.c;h=abe71ff4766b9898097bad88e7ab08c67147fd5a;hb=a61b4f6997cefbf28df45d5e1fa40663f0679ba8;hp=4f2ba395a4609b8e6f7c056fbf0e2008a156dd44;hpb=0b30217134add051e159a192066a1e568ebd837f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-sh-low.c b/gdb/gdbserver/linux-sh-low.c index 4f2ba395a4..abe71ff476 100644 --- a/gdb/gdbserver/linux-sh-low.c +++ b/gdb/gdbserver/linux-sh-low.c @@ -1,6 +1,5 @@ /* GNU/Linux/SH specific low level interface, for the remote server for GDB. - Copyright (C) 1995-1996, 1998-2003, 2005, 2007-2012 Free Software - Foundation, Inc. + Copyright (C) 1995-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +21,7 @@ /* Defined in auto-generated file reg-sh.c. */ void init_registers_sh (void); +extern const struct target_desc *tdesc_sh; #ifdef HAVE_SYS_REG_H #include @@ -58,25 +58,19 @@ sh_cannot_fetch_register (int regno) return 0; } -static CORE_ADDR -sh_get_pc (struct regcache *regcache) -{ - unsigned long pc; - collect_register_by_name (regcache, "pc", &pc); - return pc; -} - -static void -sh_set_pc (struct regcache *regcache, CORE_ADDR pc) -{ - unsigned long newpc = pc; - supply_register_by_name (regcache, "pc", &newpc); -} - /* Correct in either endianness, obviously. */ static const unsigned short sh_breakpoint = 0xc3c3; #define sh_breakpoint_len 2 +/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ + +static const gdb_byte * +sh_sw_breakpoint_from_kind (int kind, int *size) +{ + *size = sh_breakpoint_len; + return (const gdb_byte *) &sh_breakpoint; +} + static int sh_breakpoint_at (CORE_ADDR where) { @@ -91,6 +85,14 @@ sh_breakpoint_at (CORE_ADDR where) return 0; } +/* Support for hardware single step. */ + +static int +sh_supports_hardware_single_step (void) +{ + return 1; +} + /* Provide only a fill function for the general register set. ps_lgetregs will use this for NPTL support. */ @@ -103,22 +105,85 @@ static void sh_fill_gregset (struct regcache *regcache, void *buf) collect_register (regcache, i, (char *) buf + sh_regmap[i]); } -struct regset_info target_regsets[] = { +static struct regset_info sh_regsets[] = { { 0, 0, 0, 0, GENERAL_REGS, sh_fill_gregset, NULL }, - { 0, 0, 0, -1, -1, NULL, NULL } + NULL_REGSET }; +static struct regsets_info sh_regsets_info = + { + sh_regsets, /* regsets */ + 0, /* num_regsets */ + NULL, /* disabled_regsets */ + }; + +static struct usrregs_info sh_usrregs_info = + { + sh_num_regs, + sh_regmap, + }; + +static struct regs_info regs_info = + { + NULL, /* regset_bitmap */ + &sh_usrregs_info, + &sh_regsets_info + }; + +static const struct regs_info * +sh_regs_info (void) +{ + return ®s_info; +} + +static void +sh_arch_setup (void) +{ + current_process ()->tdesc = tdesc_sh; +} + struct linux_target_ops the_low_target = { - init_registers_sh, - sh_num_regs, - sh_regmap, + sh_arch_setup, + sh_regs_info, sh_cannot_fetch_register, sh_cannot_store_register, - sh_get_pc, - sh_set_pc, - (const unsigned char *) &sh_breakpoint, - sh_breakpoint_len, + NULL, /* fetch_register */ + linux_get_pc_32bit, + linux_set_pc_32bit, + NULL, /* breakpoint_kind_from_pc */ + sh_sw_breakpoint_from_kind, NULL, 0, sh_breakpoint_at, + NULL, /* supports_z_point_type */ + NULL, /* insert_point */ + NULL, /* remove_point */ + NULL, /* stopped_by_watchpoint */ + NULL, /* stopped_data_address */ + NULL, /* collect_ptrace_register */ + NULL, /* supply_ptrace_register */ + NULL, /* siginfo_fixup */ + NULL, /* new_process */ + NULL, /* delete_process */ + NULL, /* new_thread */ + NULL, /* delete_thread */ + NULL, /* new_fork */ + NULL, /* prepare_to_resume */ + NULL, /* process_qsupported */ + NULL, /* supports_tracepoints */ + NULL, /* get_thread_area */ + NULL, /* install_fast_tracepoint_jump_pad */ + NULL, /* emit_ops */ + NULL, /* get_min_fast_tracepoint_insn_len */ + NULL, /* supports_range_stepping */ + NULL, /* breakpoint_kind_from_current_state */ + sh_supports_hardware_single_step, }; + +void +initialize_low_arch (void) +{ + init_registers_sh (); + + initialize_regsets_info (&sh_regsets_info); +}