X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fm68klinux-tdep.c;h=fd9c146cc1a11cd9498b2d0f7674b3fffab21e87;hb=0154d99053a95392380cd4629a89b0ac46df3737;hp=cf53baeaafcfac0ca4e48feb677ac8ee379bc72d;hpb=0b30217134add051e159a192066a1e568ebd837f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m68klinux-tdep.c b/gdb/m68klinux-tdep.c index cf53baeaaf..fd9c146cc1 100644 --- a/gdb/m68klinux-tdep.c +++ b/gdb/m68klinux-tdep.c @@ -1,7 +1,6 @@ /* Motorola m68k target-dependent support for GNU/Linux. - Copyright (C) 1996, 1998, 2000-2004, 2007-2012 Free Software - Foundation, Inc. + Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +23,6 @@ #include "floatformat.h" #include "frame.h" #include "target.h" -#include "gdb_string.h" #include "gdbtypes.h" #include "osabi.h" #include "regcache.h" @@ -39,6 +37,7 @@ #include "observer.h" #include "elf/common.h" #include "linux-tdep.h" +#include "regset.h" /* Offsets (in target ints) into jmp_buf. */ @@ -68,7 +67,6 @@ m68k_linux_pc_in_sigtramp (struct frame_info *this_frame) { struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - CORE_ADDR sp; gdb_byte buf[12]; unsigned long insn0, insn1, insn2; CORE_ADDR pc = get_frame_pc (this_frame); @@ -230,16 +228,10 @@ m68k_linux_get_sigtramp_info (struct frame_info *this_frame) CORE_ADDR sp; struct m68k_linux_sigtramp_info info; + /* Determine whether we are running on a uClinux or normal GNU/Linux + target so we can use the correct sigcontext layouts. */ if (target_is_uclinux == -1) - { - /* Determine whether we are running on a uClinux or normal GNU/Linux - target so we can use the correct sigcontext layouts. */ - CORE_ADDR dummy; - - target_is_uclinux - = (target_auxv_search (¤t_target, AT_NULL, &dummy) > 0 - && target_auxv_search (¤t_target, AT_PAGESZ, &dummy) == 0); - } + target_is_uclinux = linux_is_uclinux (); sp = get_frame_register_unsigned (this_frame, M68K_SP_REGNUM); @@ -271,7 +263,7 @@ m68k_linux_sigtramp_frame_cache (struct frame_info *this_frame, int i; if (*this_cache) - return *this_cache; + return (struct trad_frame_cache *) *this_cache; cache = trad_frame_cache_zalloc (this_frame); @@ -335,6 +327,60 @@ static const struct frame_unwind m68k_linux_sigtramp_frame_unwind = m68k_linux_sigtramp_frame_sniffer }; +/* Register maps for supply/collect regset functions. */ + +static const struct regcache_map_entry m68k_linux_gregmap[] = + { + { 7, M68K_D1_REGNUM, 4 }, /* d1 ... d7 */ + { 7, M68K_A0_REGNUM, 4 }, /* a0 ... a6 */ + { 1, M68K_D0_REGNUM, 4 }, + { 1, M68K_SP_REGNUM, 4 }, + { 1, REGCACHE_MAP_SKIP, 4 }, /* orig_d0 (skip) */ + { 1, M68K_PS_REGNUM, 4 }, + { 1, M68K_PC_REGNUM, 4 }, + /* Ignore 16-bit fields 'fmtvec' and '__fill'. */ + { 0 } + }; + +#define M68K_LINUX_GREGS_SIZE (20 * 4) + +static const struct regcache_map_entry m68k_linux_fpregmap[] = + { + { 8, M68K_FP0_REGNUM, 12 }, /* fp0 ... fp7 */ + { 1, M68K_FPC_REGNUM, 4 }, + { 1, M68K_FPS_REGNUM, 4 }, + { 1, M68K_FPI_REGNUM, 4 }, + { 0 } + }; + +#define M68K_LINUX_FPREGS_SIZE (27 * 4) + +/* Register sets. */ + +static const struct regset m68k_linux_gregset = + { + m68k_linux_gregmap, + regcache_supply_regset, regcache_collect_regset + }; + +static const struct regset m68k_linux_fpregset = + { + m68k_linux_fpregmap, + regcache_supply_regset, regcache_collect_regset + }; + +/* Iterate over core file register note sections. */ + +static void +m68k_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, + iterate_over_regset_sections_cb *cb, + void *cb_data, + const struct regcache *regcache) +{ + cb (".reg", M68K_LINUX_GREGS_SIZE, &m68k_linux_gregset, NULL, cb_data); + cb (".reg2", M68K_LINUX_FPREGS_SIZE, &m68k_linux_fpregset, NULL, cb_data); +} + static void m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -369,6 +415,10 @@ m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + /* Core file support. */ + set_gdbarch_iterate_over_regset_sections + (gdbarch, m68k_linux_iterate_over_regset_sections); + /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map);