| From 976a0e2664559cc194eee8040280cd29e2672d26 Mon Sep 17 00:00:00 2001 |
| From: Nagaraju Mekala <nmekala@xilix.com> |
| Date: Fri, 17 Feb 2017 14:09:40 +0530 |
| Subject: [PATCH 40/52] Fixing the issues related to GDB-7.12 added all the |
| required function which are new in 7.12 and removed few deprecated functions |
| from 7.6 |
| |
| --- |
| gdb/config/microblaze/linux.mh | 4 +- |
| gdb/microblaze-linux-tdep.c | 68 ++++++++++++++++++++-- |
| gdb/microblaze-tdep.h | 1 + |
| gdbserver/configure.srv | 3 +- |
| gdbserver/linux-microblaze-low.c | 97 +++++++++++++++++++++++++++----- |
| 5 files changed, 153 insertions(+), 20 deletions(-) |
| |
| diff --git a/gdb/config/microblaze/linux.mh b/gdb/config/microblaze/linux.mh |
| index a4eaf540e1..74a53b854a 100644 |
| --- a/gdb/config/microblaze/linux.mh |
| +++ b/gdb/config/microblaze/linux.mh |
| @@ -1,9 +1,11 @@ |
| # Host: Microblaze, running Linux |
| |
| +#linux-nat.o linux-waitpid.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o |
| NAT_FILE= config/nm-linux.h |
| NATDEPFILES= inf-ptrace.o fork-child.o \ |
| microblaze-linux-nat.o proc-service.o linux-thread-db.o \ |
| - linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o |
| + linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ |
| + linux-waitpid.o linux-personality.o linux-namespaces.o |
| NAT_CDEPS = $(srcdir)/proc-service.list |
| |
| LOADLIBES = -ldl $(RDYNAMIC) |
| diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c |
| index 2725ce1789..a2e858d10f 100644 |
| --- a/gdb/microblaze-linux-tdep.c |
| +++ b/gdb/microblaze-linux-tdep.c |
| @@ -29,13 +29,76 @@ |
| #include "regcache.h" |
| #include "value.h" |
| #include "osabi.h" |
| -#include "regset.h" |
| #include "solib-svr4.h" |
| #include "microblaze-tdep.h" |
| #include "trad-frame.h" |
| #include "frame-unwind.h" |
| #include "tramp-frame.h" |
| #include "linux-tdep.h" |
| +#include "glibc-tdep.h" |
| + |
| +#include "gdb_assert.h" |
| + |
| +#ifndef REGSET_H |
| +#define REGSET_H 1 |
| + |
| +struct gdbarch; |
| +struct regcache; |
| + |
| +/* Data structure for the supported register notes in a core file. */ |
| +struct core_regset_section |
| +{ |
| + const char *sect_name; |
| + int size; |
| + const char *human_name; |
| +}; |
| + |
| +/* Data structure describing a register set. */ |
| + |
| +typedef void (supply_regset_ftype) (const struct regset *, struct regcache *, |
| + int, const void *, size_t); |
| +typedef void (collect_regset_ftype) (const struct regset *, |
| + const struct regcache *, |
| + int, void *, size_t); |
| + |
| +struct regset |
| +{ |
| + /* Data pointer for private use by the methods below, presumably |
| + providing some sort of description of the register set. */ |
| + const void *descr; |
| + |
| + /* Function supplying values in a register set to a register cache. */ |
| + supply_regset_ftype *supply_regset; |
| + |
| + /* Function collecting values in a register set from a register cache. */ |
| + collect_regset_ftype *collect_regset; |
| + |
| + /* Architecture associated with the register set. */ |
| + struct gdbarch *arch; |
| +}; |
| + |
| +#endif |
| + |
| +/* Allocate a fresh 'struct regset' whose supply_regset function is |
| + SUPPLY_REGSET, and whose collect_regset function is COLLECT_REGSET. |
| + If the regset has no collect_regset function, pass NULL for |
| + COLLECT_REGSET. |
| + |
| + The object returned is allocated on ARCH's obstack. */ |
| + |
| +struct regset * |
| +regset_alloc (struct gdbarch *arch, |
| + supply_regset_ftype *supply_regset, |
| + collect_regset_ftype *collect_regset) |
| +{ |
| + struct regset *regset = GDBARCH_OBSTACK_ZALLOC (arch, struct regset); |
| + |
| + regset->arch = arch; |
| + regset->supply_regset = supply_regset; |
| + regset->collect_regset = collect_regset; |
| + |
| + return regset; |
| +} |
| |
| static int microblaze_debug_flag = 0; |
| |
| @@ -207,9 +270,6 @@ microblaze_linux_init_abi (struct gdbarch_info info, |
| set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); |
| set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); |
| |
| - set_gdbarch_regset_from_core_section (gdbarch, |
| - microblaze_regset_from_core_section); |
| - |
| /* Enable TLS support. */ |
| set_gdbarch_fetch_tls_load_module_address (gdbarch, |
| svr4_fetch_objfile_link_map); |
| diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h |
| index de66a05cab..1234f8a36f 100644 |
| --- a/gdb/microblaze-tdep.h |
| +++ b/gdb/microblaze-tdep.h |
| @@ -24,6 +24,7 @@ |
| /* Microblaze architecture-specific information. */ |
| struct microblaze_gregset |
| { |
| + microblaze_gregset() {} |
| unsigned int gregs[32]; |
| unsigned int fpregs[32]; |
| unsigned int pregs[16]; |
| diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv |
| index 7e81388850..456f4b3349 100644 |
| --- a/gdbserver/configure.srv |
| +++ b/gdbserver/configure.srv |
| @@ -156,8 +156,7 @@ case "${gdbserver_host}" in |
| srv_linux_thread_db=yes |
| ;; |
| microblaze*-*-linux*) srv_regobj=microblaze-linux.o |
| - srv_tgtobj="linux-low.o linux-osdata.o linux-microblaze-low.o " |
| - srv_tgtobj="${srv_tgtobj} linux-procfs.o linux-ptrace.o" |
| + srv_tgtobj="$srv_linux_obj linux-microblaze-low.o " |
| srv_linux_regsets=yes |
| srv_linux_usrregs=yes |
| srv_linux_thread_db=yes |
| diff --git a/gdbserver/linux-microblaze-low.c b/gdbserver/linux-microblaze-low.c |
| index cba5d6fc58..a2733f3c21 100644 |
| --- a/gdbserver/linux-microblaze-low.c |
| +++ b/gdbserver/linux-microblaze-low.c |
| @@ -39,10 +39,11 @@ static int microblaze_regmap[] = |
| PT_FSR |
| }; |
| |
| -#define microblaze_num_regs (sizeof microblaze_regmap / sizeof microblaze_regmap[0]) |
| +#define microblaze_num_regs (sizeof (microblaze_regmap) / sizeof (microblaze_regmap[0])) |
| |
| /* Defined in auto-generated file microblaze-linux.c. */ |
| void init_registers_microblaze (void); |
| +extern const struct target_desc *tdesc_microblaze; |
| |
| static int |
| microblaze_cannot_store_register (int regno) |
| @@ -81,6 +82,15 @@ microblaze_set_pc (struct regcache *regcache, CORE_ADDR pc) |
| static const unsigned long microblaze_breakpoint = 0xba0c0018; |
| #define microblaze_breakpoint_len 4 |
| |
| +/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */ |
| + |
| +static const gdb_byte * |
| +microblaze_sw_breakpoint_from_kind (int kind, int *size) |
| +{ |
| + *size = microblaze_breakpoint_len; |
| + return (const gdb_byte *) µblaze_breakpoint; |
| +} |
| + |
| static int |
| microblaze_breakpoint_at (CORE_ADDR where) |
| { |
| @@ -107,7 +117,7 @@ microblaze_reinsert_addr (struct regcache *regcache) |
| static void |
| microblaze_collect_ptrace_register (struct regcache *regcache, int regno, char *buf) |
| { |
| - int size = register_size (regno); |
| + int size = register_size (regcache->tdesc, regno); |
| |
| memset (buf, 0, sizeof (long)); |
| |
| @@ -121,7 +131,7 @@ static void |
| microblaze_supply_ptrace_register (struct regcache *regcache, |
| int regno, const char *buf) |
| { |
| - int size = register_size (regno); |
| + int size = register_size (regcache->tdesc, regno); |
| |
| if (regno == 0) { |
| unsigned long regbuf_0 = 0; |
| @@ -157,33 +167,94 @@ microblaze_store_gregset (struct regcache *regcache, const void *buf) |
| |
| #endif /* HAVE_PTRACE_GETREGS */ |
| |
| -struct regset_info target_regsets[] = { |
| +static struct regset_info microblaze_regsets[] = { |
| #ifdef HAVE_PTRACE_GETREGS |
| { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, microblaze_fill_gregset, microblaze_store_gregset }, |
| - { 0, 0, 0, -1, -1, NULL, NULL }, |
| + { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, |
| #endif /* HAVE_PTRACE_GETREGS */ |
| - { 0, 0, 0, -1, -1, NULL, NULL } |
| + { 0, 0, 0, -1, GENERAL_REGS, NULL, NULL }, |
| + NULL_REGSET |
| }; |
| |
| +static struct usrregs_info microblaze_usrregs_info = |
| + { |
| + microblaze_num_regs, |
| + microblaze_regmap, |
| + }; |
| + |
| +static struct regsets_info microblaze_regsets_info = |
| + { |
| + microblaze_regsets, /* regsets */ |
| + 0, /* num_regsets */ |
| + NULL, /* disabled_regsets */ |
| + }; |
| + |
| +static struct regs_info regs_info = |
| + { |
| + NULL, /* regset_bitmap */ |
| + µblaze_usrregs_info, |
| + µblaze_regsets_info |
| + }; |
| + |
| +static const struct regs_info * |
| +microblaze_regs_info (void) |
| +{ |
| + return ®s_info; |
| +} |
| + |
| +/* Support for hardware single step. */ |
| + |
| +static int |
| +microblaze_supports_hardware_single_step (void) |
| +{ |
| + return 1; |
| +} |
| + |
| + |
| +static void |
| +microblaze_arch_setup (void) |
| +{ |
| + current_process ()->tdesc = tdesc_microblaze; |
| +} |
| + |
| struct linux_target_ops the_low_target = { |
| - init_registers_microblaze, |
| - microblaze_num_regs, |
| - microblaze_regmap, |
| - NULL, |
| + microblaze_arch_setup, |
| + microblaze_regs_info, |
| microblaze_cannot_fetch_register, |
| microblaze_cannot_store_register, |
| NULL, /* fetch_register */ |
| microblaze_get_pc, |
| microblaze_set_pc, |
| - (const unsigned char *) µblaze_breakpoint, |
| - microblaze_breakpoint_len, |
| - microblaze_reinsert_addr, |
| + NULL, |
| + microblaze_sw_breakpoint_from_kind, |
| + NULL, |
| 0, |
| microblaze_breakpoint_at, |
| NULL, |
| NULL, |
| NULL, |
| NULL, |
| + NULL, |
| microblaze_collect_ptrace_register, |
| microblaze_supply_ptrace_register, |
| + NULL, /* siginfo_fixup */ |
| + NULL, /* new_process */ |
| + NULL, /* new_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 */ |
| + microblaze_supports_hardware_single_step, |
| }; |
| + |
| +void |
| +initialize_low_arch (void) |
| +{ |
| + init_registers_microblaze (); |
| +} |
| -- |
| 2.17.1 |
| |