X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsparc-nat.c;h=8d5bf350bdbb30a8ee03a423067f2f84678c5b32;hb=348fe36b1d64f12c60e08f6313520b3191663063;hp=8b5c68619de7f3caf48300954a6239839066211c;hpb=f6ac5f3d63e03a81c4ff3749aba234961cc9090e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/sparc-nat.c b/gdb/sparc-nat.c index 8b5c68619d..8d5bf350bd 100644 --- a/gdb/sparc-nat.c +++ b/gdb/sparc-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for SPARC. - Copyright (C) 2003-2018 Free Software Foundation, Inc. + Copyright (C) 2003-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +24,7 @@ #include #include -#include "gdb_wait.h" +#include "gdbsupport/gdb_wait.h" #ifdef HAVE_MACHINE_REG_H #include #endif @@ -78,6 +78,19 @@ typedef struct fp_status fpregset_t; #define PTRACE_SETFPREGS PT_SETFPREGS #endif +static PTRACE_TYPE_RET +gdb_ptrace (PTRACE_TYPE_ARG1 request, ptid_t ptid, PTRACE_TYPE_ARG3 addr) +{ +#ifdef __NetBSD__ + /* Support for NetBSD threads: unlike other ptrace implementations in this + file, NetBSD requires that we pass both the pid and lwp. */ + return ptrace (request, ptid.pid (), addr, ptid.lwp ()); +#else + pid_t pid = get_ptrace_pid (ptid); + return ptrace (request, pid, addr, 0); +#endif +} + /* Register set description. */ const struct sparc_gregmap *sparc_gregmap; const struct sparc_fpregmap *sparc_fpregmap; @@ -137,28 +150,13 @@ void sparc_fetch_inferior_registers (struct regcache *regcache, int regnum) { struct gdbarch *gdbarch = regcache->arch (); - pid_t pid; - - /* NOTE: cagney/2002-12-03: This code assumes that the currently - selected light weight processes' registers can be written - directly into the selected thread's register cache. This works - fine when given an 1:1 LWP:thread model (such as found on - GNU/Linux) but will, likely, have problems when used on an N:1 - (userland threads) or N:M (userland multiple LWP) model. In the - case of the latter two, the LWP's registers do not necessarily - belong to the selected thread (the LWP could be in the middle of - executing the thread switch code). - - These functions should instead be paramaterized with an explicit - object (struct regcache, struct thread_info?) into which the LWPs - registers can be written. */ - pid = get_ptrace_pid (regcache_get_ptid (regcache)); + ptid_t ptid = regcache->ptid (); if (regnum == SPARC_G0_REGNUM) { gdb_byte zero[8] = { 0 }; - regcache_raw_supply (regcache, SPARC_G0_REGNUM, &zero); + regcache->raw_supply (SPARC_G0_REGNUM, &zero); return; } @@ -166,7 +164,7 @@ sparc_fetch_inferior_registers (struct regcache *regcache, int regnum) { gregset_t regs; - if (ptrace (PTRACE_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (gdb_ptrace (PTRACE_GETREGS, ptid, (PTRACE_TYPE_ARG3) ®s) == -1) perror_with_name (_("Couldn't get registers")); sparc_supply_gregset (sparc_gregmap, regcache, -1, ®s); @@ -178,7 +176,7 @@ sparc_fetch_inferior_registers (struct regcache *regcache, int regnum) { fpregset_t fpregs; - if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (gdb_ptrace (PTRACE_GETFPREGS, ptid, (PTRACE_TYPE_ARG3) &fpregs) == -1) perror_with_name (_("Couldn't get floating point status")); sparc_supply_fpregset (sparc_fpregmap, regcache, -1, &fpregs); @@ -189,22 +187,18 @@ void sparc_store_inferior_registers (struct regcache *regcache, int regnum) { struct gdbarch *gdbarch = regcache->arch (); - pid_t pid; - - /* NOTE: cagney/2002-12-02: See comment in fetch_inferior_registers - about threaded assumptions. */ - pid = get_ptrace_pid (regcache_get_ptid (regcache)); + ptid_t ptid = regcache->ptid (); if (regnum == -1 || sparc_gregset_supplies_p (gdbarch, regnum)) { gregset_t regs; - if (ptrace (PTRACE_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (gdb_ptrace (PTRACE_GETREGS, ptid, (PTRACE_TYPE_ARG3) ®s) == -1) perror_with_name (_("Couldn't get registers")); sparc_collect_gregset (sparc_gregmap, regcache, regnum, ®s); - if (ptrace (PTRACE_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (gdb_ptrace (PTRACE_SETREGS, ptid, (PTRACE_TYPE_ARG3) ®s) == -1) perror_with_name (_("Couldn't write registers")); /* Deal with the stack regs. */ @@ -225,7 +219,7 @@ sparc_store_inferior_registers (struct regcache *regcache, int regnum) { fpregset_t fpregs, saved_fpregs; - if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (gdb_ptrace (PTRACE_GETFPREGS, ptid, (PTRACE_TYPE_ARG3) &fpregs) == -1) perror_with_name (_("Couldn't get floating-point registers")); memcpy (&saved_fpregs, &fpregs, sizeof (fpregs)); @@ -237,8 +231,8 @@ sparc_store_inferior_registers (struct regcache *regcache, int regnum) to write the registers if nothing changed. */ if (memcmp (&saved_fpregs, &fpregs, sizeof (fpregs)) != 0) { - if (ptrace (PTRACE_SETFPREGS, pid, - (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (gdb_ptrace (PTRACE_SETFPREGS, ptid, + (PTRACE_TYPE_ARG3) &fpregs) == -1) perror_with_name (_("Couldn't write floating-point registers")); } @@ -252,7 +246,7 @@ sparc_store_inferior_registers (struct regcache *regcache, int regnum) TARGET_OBJECT_WCOOKIE. Fetch StackGhost Per-Process XOR cookie. */ enum target_xfer_status -sparc_xfer_wcookie (struct target_ops *ops, enum target_object object, +sparc_xfer_wcookie (enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) @@ -274,7 +268,7 @@ sparc_xfer_wcookie (struct target_ops *ops, enum target_object object, later). Since release 3.6, OpenBSD uses a fully randomized cookie. */ { - int pid = ptid_get_pid (inferior_ptid); + int pid = inferior_ptid.pid (); /* Sanity check. The proper type for a cookie is register_t, but we can't assume that this type exists on all systems supported @@ -305,10 +299,11 @@ sparc_xfer_wcookie (struct target_ops *ops, enum target_object object, } +void _initialize_sparc_nat (); void -_initialize_sparc_nat (void) +_initialize_sparc_nat () { - /* Deafult to using SunOS 4 register sets. */ + /* Default to using SunOS 4 register sets. */ if (sparc_gregmap == NULL) sparc_gregmap = &sparc32_sunos4_gregmap; if (sparc_fpregmap == NULL)