X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fm68klinux-nat.c;h=ebfe847ea6d186ddc8b5300ce14b9f57a6ade262;hb=ae6a105d22fb603dbfb956bbcedf9ae469323d55;hp=348f2cf58e11413e50f3d50d3c0dd3e27a634918;hpb=025bb325db8dce957db69eaf148c5bec373d4bb6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m68klinux-nat.c b/gdb/m68klinux-nat.c index 348f2cf58e..ebfe847ea6 100644 --- a/gdb/m68klinux-nat.c +++ b/gdb/m68klinux-nat.c @@ -1,7 +1,6 @@ /* Motorola m68k native support for GNU/Linux. - Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1996-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -23,14 +22,12 @@ #include "inferior.h" #include "language.h" #include "gdbcore.h" -#include "gdb_string.h" #include "regcache.h" #include "target.h" #include "linux-nat.h" #include "m68k-tdep.h" -#include #include #include #include @@ -44,14 +41,19 @@ #endif #include -#include "gdb_stat.h" +#include #include "floatformat.h" -#include "target.h" - /* Prototypes for supply_gregset etc. */ #include "gregset.h" + +/* Defines ps_err_e, struct ps_prochandle. */ +#include "gdb_proc_service.h" + +#ifndef PTRACE_GET_THREAD_AREA +#define PTRACE_GET_THREAD_AREA 25 +#endif /* This table must line up with gdbarch_register_name in "m68k-tdep.c". */ static const int regmap[] = @@ -70,20 +72,20 @@ static const int regmap[] = #define NUM_GREGS (18) #define MAX_NUM_REGS (NUM_GREGS + 11) -int +static int getregs_supplies (int regno) { return 0 <= regno && regno < NUM_GREGS; } -int +static int getfpregs_supplies (int regno) { return M68K_FP0_REGNUM <= regno && regno <= M68K_FPI_REGNUM; } /* Does the current host support the GETREGS request? */ -int have_ptrace_getregs = +static int have_ptrace_getregs = #ifdef HAVE_PTRACE_GETREGS 1 #else @@ -101,22 +103,23 @@ static void fetch_register (struct regcache *regcache, int regno) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - long regaddr; + long regaddr, val; int i; - char buf[MAX_REGISTER_SIZE]; + gdb_byte buf[MAX_REGISTER_SIZE]; int tid; /* Overload thread id onto process id. */ - tid = TIDGET (inferior_ptid); + tid = ptid_get_lwp (inferior_ptid); if (tid == 0) - tid = PIDGET (inferior_ptid); /* no thread id, just use + tid = ptid_get_pid (inferior_ptid); /* no thread id, just use process id. */ regaddr = 4 * regmap[regno]; for (i = 0; i < register_size (gdbarch, regno); i += sizeof (long)) { errno = 0; - *(long *) &buf[i] = ptrace (PTRACE_PEEKUSER, tid, regaddr, 0); + val = ptrace (PTRACE_PEEKUSER, tid, regaddr, 0); + memcpy (&buf[i], &val, sizeof (long)); regaddr += sizeof (long); if (errno != 0) error (_("Couldn't read register %s (#%d): %s."), @@ -154,15 +157,15 @@ static void store_register (const struct regcache *regcache, int regno) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - long regaddr; + long regaddr, val; int i; int tid; - char buf[MAX_REGISTER_SIZE]; + gdb_byte buf[MAX_REGISTER_SIZE]; /* Overload thread id onto process id. */ - tid = TIDGET (inferior_ptid); + tid = ptid_get_lwp (inferior_ptid); if (tid == 0) - tid = PIDGET (inferior_ptid); /* no thread id, just use + tid = ptid_get_pid (inferior_ptid); /* no thread id, just use process id. */ regaddr = 4 * regmap[regno]; @@ -174,7 +177,8 @@ store_register (const struct regcache *regcache, int regno) for (i = 0; i < register_size (gdbarch, regno); i += sizeof (long)) { errno = 0; - ptrace (PTRACE_POKEUSER, tid, regaddr, *(long *) &buf[i]); + memcpy (&val, &buf[i], sizeof (long)); + ptrace (PTRACE_POKEUSER, tid, regaddr, val); regaddr += sizeof (long); if (errno != 0) error (_("Couldn't write register %s (#%d): %s."), @@ -413,9 +417,9 @@ m68k_linux_fetch_inferior_registers (struct target_ops *ops, } /* GNU/Linux LWP ID's are process ID's. */ - tid = TIDGET (inferior_ptid); + tid = ptid_get_lwp (inferior_ptid); if (tid == 0) - tid = PIDGET (inferior_ptid); /* Not a threaded program. */ + tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */ /* Use the PTRACE_GETFPXREGS request whenever possible, since it transfers more registers in one system call, and we'll cache the @@ -470,9 +474,9 @@ m68k_linux_store_inferior_registers (struct target_ops *ops, } /* GNU/Linux LWP ID's are process ID's. */ - tid = TIDGET (inferior_ptid); + tid = ptid_get_lwp (inferior_ptid); if (tid == 0) - tid = PIDGET (inferior_ptid); /* Not a threaded program. */ + tid = ptid_get_pid (inferior_ptid); /* Not a threaded program. */ /* Use the PTRACE_SETFPREGS requests whenever possible, since it transfers more registers in one system call. But remember that @@ -500,75 +504,25 @@ m68k_linux_store_inferior_registers (struct target_ops *ops, _("Got request to store bad register number %d."), regno); } -/* Interpreting register set info found in core files. */ - -/* Provide registers to GDB from a core file. - (We can't use the generic version of this function in - core-regset.c, because we need to use elf_gregset_t instead of - gregset_t.) +/* Fetch the thread-local storage pointer for libthread_db. */ - CORE_REG_SECT points to an array of bytes, which are the contents - of a `note' from a core file which BFD thinks might contain - register contents. CORE_REG_SIZE is its size. - - WHICH says which register set corelow suspects this is: - 0 --- the general-purpose register set, in elf_gregset_t format - 2 --- the floating-point register set, in elf_fpregset_t format - - REG_ADDR isn't used on GNU/Linux. */ - -static void -fetch_core_registers (struct regcache *regcache, - char *core_reg_sect, unsigned core_reg_size, - int which, CORE_ADDR reg_addr) +ps_err_e +ps_get_thread_area (const struct ps_prochandle *ph, + lwpid_t lwpid, int idx, void **base) { - elf_gregset_t gregset; - elf_fpregset_t fpregset; - - switch (which) - { - case 0: - if (core_reg_size != sizeof (gregset)) - warning (_("Wrong size gregset in core file.")); - else - { - memcpy (&gregset, core_reg_sect, sizeof (gregset)); - supply_gregset (regcache, (const elf_gregset_t *) &gregset); - } - break; + if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) < 0) + return PS_ERR; - case 2: - if (core_reg_size != sizeof (fpregset)) - warning (_("Wrong size fpregset in core file.")); - else - { - memcpy (&fpregset, core_reg_sect, sizeof (fpregset)); - supply_fpregset (regcache, (const elf_fpregset_t *) &fpregset); - } - break; + /* IDX is the bias from the thread pointer to the beginning of the + thread descriptor. It has to be subtracted due to implementation + quirks in libthread_db. */ + *base = (char *) *base - idx; - default: - /* We've covered all the kinds of registers we know about here, - so this must be something we wouldn't know what to do with - anyway. Just ignore it. */ - break; - } + return PS_OK; } -/* Register that we are able to handle GNU/Linux ELF core file - formats. */ - -static struct core_fns linux_elf_core_fns = -{ - bfd_target_elf_flavour, /* core_flavour */ - default_check_format, /* check_format */ - default_core_sniffer, /* core_sniffer */ - fetch_core_registers, /* core_read_registers */ - NULL /* next */ -}; - void _initialize_m68k_linux_nat (void); void @@ -585,6 +539,4 @@ _initialize_m68k_linux_nat (void) /* Register the target. */ linux_nat_add_target (t); - - deprecated_add_core_fns (&linux_elf_core_fns); }