X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-m68k-low.c;h=16f639d02fc5f60a711c23a6ed03cb30687dcc20;hb=3d6e9d2336c9ffcedb10f89631981a23dd518e8e;hp=6769dac9afa6b6d0063b4641aeac4d732561da43;hpb=c14dfd32064a2213d57d8ef551a9c64841e61032;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-m68k-low.c b/gdb/gdbserver/linux-m68k-low.c index 6769dac9af..16f639d02f 100644 --- a/gdb/gdbserver/linux-m68k-low.c +++ b/gdb/gdbserver/linux-m68k-low.c @@ -1,6 +1,5 @@ /* GNU/Linux/m68k specific low level interface, for the remote server for GDB. - Copyright (C) 1995-1996, 1998-2005, 2007-2012 Free Software - Foundation, Inc. + Copyright (C) 1995-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +21,7 @@ /* Defined in auto-generated file reg-m68k.c. */ void init_registers_m68k (void); +extern const struct target_desc *tdesc_m68k; #ifdef HAVE_SYS_REG_H #include @@ -68,7 +68,7 @@ m68k_cannot_fetch_register (int regno) #ifdef HAVE_PTRACE_GETREGS #include -#include +#include "nat/gdb_ptrace.h" static void m68k_fill_gregset (struct regcache *regcache, void *buf) @@ -110,7 +110,7 @@ m68k_store_fpregset (struct regcache *regcache, const void *buf) #endif /* HAVE_PTRACE_GETREGS */ -struct regset_info target_regsets[] = { +static struct regset_info m68k_regsets[] = { #ifdef HAVE_PTRACE_GETREGS { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, @@ -119,27 +119,19 @@ struct regset_info target_regsets[] = { FP_REGS, m68k_fill_fpregset, m68k_store_fpregset }, #endif /* HAVE_PTRACE_GETREGS */ - { 0, 0, 0, -1, -1, NULL, NULL } + NULL_REGSET }; -static const unsigned char m68k_breakpoint[] = { 0x4E, 0x4F }; +static const gdb_byte m68k_breakpoint[] = { 0x4E, 0x4F }; #define m68k_breakpoint_len 2 -static CORE_ADDR -m68k_get_pc (struct regcache *regcache) -{ - unsigned long pc; - - collect_register_by_name (regcache, "pc", &pc); - return pc; -} +/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ -static void -m68k_set_pc (struct regcache *regcache, CORE_ADDR value) +static const gdb_byte * +m68k_sw_breakpoint_from_kind (int kind, int *size) { - unsigned long newpc = value; - - supply_register_by_name (regcache, "pc", &newpc); + *size = m68k_breakpoint_len; + return m68k_breakpoint; } static int @@ -160,7 +152,7 @@ m68k_breakpoint_at (CORE_ADDR pc) /* Fetch the thread-local storage pointer for libthread_db. */ ps_err_e -ps_get_thread_area (const struct ps_prochandle *ph, +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) @@ -175,19 +167,89 @@ ps_get_thread_area (const struct ps_prochandle *ph, } #endif /* PTRACE_GET_THREAD_AREA */ +static struct regsets_info m68k_regsets_info = + { + m68k_regsets, /* regsets */ + 0, /* num_regsets */ + NULL, /* disabled_regsets */ + }; + +static struct usrregs_info m68k_usrregs_info = + { + m68k_num_regs, + m68k_regmap, + }; + +static struct regs_info regs_info = + { + NULL, /* regset_bitmap */ + &m68k_usrregs_info, + &m68k_regsets_info + }; + +static const struct regs_info * +m68k_regs_info (void) +{ + return ®s_info; +} + +static void +m68k_arch_setup (void) +{ + current_process ()->tdesc = tdesc_m68k; +} + +/* Support for hardware single step. */ + +static int +m68k_supports_hardware_single_step (void) +{ + return 1; +} + struct linux_target_ops the_low_target = { - init_registers_m68k, - m68k_num_regs, - m68k_regmap, - NULL, + m68k_arch_setup, + m68k_regs_info, m68k_cannot_fetch_register, m68k_cannot_store_register, NULL, /* fetch_register */ - m68k_get_pc, - m68k_set_pc, - m68k_breakpoint, - m68k_breakpoint_len, + linux_get_pc_32bit, + linux_set_pc_32bit, + NULL, /* breakpoint_kind_from_pc */ + m68k_sw_breakpoint_from_kind, NULL, 2, m68k_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 */ + m68k_supports_hardware_single_step, }; + +void +initialize_low_arch (void) +{ + /* Initialize the Linux target descriptions. */ + init_registers_m68k (); + + initialize_regsets_info (&m68k_regsets_info); +}