X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fm68klinux-tdep.c;h=94fb953edf0681bef2139bc0a1585d5f3e8d0c4c;hb=e385593eef98ac92be57159e141f4b805dadbbb3;hp=29b112065d7eaf9b7b7387a5262fe715fc1e4a17;hpb=c95f502610e9757735f4b06e4be93f8b1b7667f8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m68klinux-tdep.c b/gdb/m68klinux-tdep.c index 29b112065d..94fb953edf 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, 2001, 2002, 2003, 2004, 2007, 2008 - 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" @@ -38,6 +36,8 @@ #include "auxv.h" #include "observer.h" #include "elf/common.h" +#include "linux-tdep.h" +#include "regset.h" /* Offsets (in target ints) into jmp_buf. */ @@ -65,21 +65,22 @@ static int m68k_linux_pc_in_sigtramp (struct frame_info *this_frame) { - CORE_ADDR sp; + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte buf[12]; unsigned long insn0, insn1, insn2; CORE_ADDR pc = get_frame_pc (this_frame); if (!safe_frame_unwind_memory (this_frame, pc - 4, buf, sizeof (buf))) return 0; - insn1 = extract_unsigned_integer (buf + 4, 4); - insn2 = extract_unsigned_integer (buf + 8, 4); + insn1 = extract_unsigned_integer (buf + 4, 4, byte_order); + insn2 = extract_unsigned_integer (buf + 8, 4, byte_order); if (IS_SIGTRAMP (insn1, insn2)) return 1; if (IS_RT_SIGTRAMP (insn1, insn2)) return 2; - insn0 = extract_unsigned_integer (buf, 4); + insn0 = extract_unsigned_integer (buf, 4, byte_order); if (IS_SIGTRAMP (insn0, insn1)) return 1; if (IS_RT_SIGTRAMP (insn0, insn1)) @@ -222,24 +223,20 @@ m68k_linux_inferior_created (struct target_ops *objfile, int from_tty) static struct m68k_linux_sigtramp_info m68k_linux_get_sigtramp_info (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; 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); /* Get sigcontext address, it is the third parameter on the stack. */ - info.sigcontext_addr = read_memory_unsigned_integer (sp + 8, 4); + info.sigcontext_addr = read_memory_unsigned_integer (sp + 8, 4, byte_order); if (m68k_linux_pc_in_sigtramp (this_frame) == 2) info.sc_reg_offset = m68k_linux_ucontext_reg_offset; @@ -258,13 +255,14 @@ m68k_linux_sigtramp_frame_cache (struct frame_info *this_frame, { struct frame_id this_id; struct trad_frame_cache *cache; - struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame)); + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct m68k_linux_sigtramp_info info; gdb_byte buf[4]; int i; if (*this_cache) - return *this_cache; + return (struct trad_frame_cache *) *this_cache; cache = trad_frame_cache_zalloc (this_frame); @@ -274,8 +272,8 @@ m68k_linux_sigtramp_frame_cache (struct frame_info *this_frame, trampoline. */ get_frame_register (this_frame, M68K_SP_REGNUM, buf); /* See the end of m68k_push_dummy_call. */ - this_id = frame_id_build (extract_unsigned_integer (buf, 4) - 4 + 8, - get_frame_pc (this_frame)); + this_id = frame_id_build (extract_unsigned_integer (buf, 4, byte_order) + - 4 + 8, get_frame_pc (this_frame)); trad_frame_set_id (cache, this_id); info = m68k_linux_get_sigtramp_info (this_frame); @@ -321,17 +319,74 @@ m68k_linux_sigtramp_frame_sniffer (const struct frame_unwind *self, static const struct frame_unwind m68k_linux_sigtramp_frame_unwind = { SIGTRAMP_FRAME, + default_frame_unwind_stop_reason, m68k_linux_sigtramp_frame_this_id, m68k_linux_sigtramp_frame_prev_register, NULL, 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) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + linux_init_abi (info, gdbarch); + tdep->jb_pc = M68K_LINUX_JB_PC; tdep->jb_elt_size = M68K_LINUX_JB_ELEMENT_SIZE; @@ -359,11 +414,18 @@ 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); } +/* Provide a prototype to silence -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_m68k_linux_tdep; + void _initialize_m68k_linux_tdep (void) {