summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/binutils
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2012-04-09 10:15:49 +0000
committerkettenis <kettenis@openbsd.org>2012-04-09 10:15:49 +0000
commitc3cbb1d2008aa7fa74ba2f8f947af7c873b16b39 (patch)
treeec282b369eb9b5a3e391ee0ed22f5b4c8c64c4cc /gnu/usr.bin/binutils
parentSync with the current state of things (diff)
downloadwireguard-openbsd-c3cbb1d2008aa7fa74ba2f8f947af7c873b16b39.tar.xz
wireguard-openbsd-c3cbb1d2008aa7fa74ba2f8f947af7c873b16b39.zip
Minimal threads support for mips64.
Diffstat (limited to 'gnu/usr.bin/binutils')
-rw-r--r--gnu/usr.bin/binutils/gdb/config/mips/obsd64.mh2
-rw-r--r--gnu/usr.bin/binutils/gdb/mips64obsd-nat.c26
2 files changed, 21 insertions, 7 deletions
diff --git a/gnu/usr.bin/binutils/gdb/config/mips/obsd64.mh b/gnu/usr.bin/binutils/gdb/config/mips/obsd64.mh
index b41b2ee61f1..ed04f9eea3a 100644
--- a/gnu/usr.bin/binutils/gdb/config/mips/obsd64.mh
+++ b/gnu/usr.bin/binutils/gdb/config/mips/obsd64.mh
@@ -1,2 +1,2 @@
# Host: OpenBSD/mips64
-NATDEPFILES= fork-child.o inf-ptrace.o mips64obsd-nat.o
+NATDEPFILES= fork-child.o inf-ptrace.o obsd-nat.o mips64obsd-nat.o
diff --git a/gnu/usr.bin/binutils/gdb/mips64obsd-nat.c b/gnu/usr.bin/binutils/gdb/mips64obsd-nat.c
index d3f1d690f2e..31502b226b8 100644
--- a/gnu/usr.bin/binutils/gdb/mips64obsd-nat.c
+++ b/gnu/usr.bin/binutils/gdb/mips64obsd-nat.c
@@ -30,6 +30,7 @@
#include "mips-tdep.h"
#include "inf-ptrace.h"
+#include "obsd-nat.h"
/* Shorthand for some register numbers used below. */
#define MIPS_PC_REGNUM MIPS_EMBED_PC_REGNUM
@@ -82,9 +83,15 @@ static void
mips64obsd_fetch_inferior_registers (int regnum)
{
struct reg regs;
+ int pid;
- if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
- (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ /* Cater for systems like OpenBSD, that implement threads as
+ separate processes. */
+ pid = ptid_get_lwp (inferior_ptid);
+ if (pid == 0)
+ pid = ptid_get_pid (inferior_ptid);
+
+ if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name ("Couldn't get registers");
mips64obsd_supply_gregset (current_regcache, &regs);
@@ -97,15 +104,20 @@ static void
mips64obsd_store_inferior_registers (int regnum)
{
struct reg regs;
+ int pid;
+
+ /* Cater for systems like OpenBSD, that implement threads as
+ separate processes. */
+ pid = ptid_get_lwp (inferior_ptid);
+ if (pid == 0)
+ pid = ptid_get_pid (inferior_ptid);
- if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
- (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name ("Couldn't get registers");
mips64obsd_collect_gregset (current_regcache, &regs, regnum);
- if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
- (PTRACE_TYPE_ARG3) &regs, 0) == -1)
+ if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name ("Couldn't write registers");
}
@@ -121,5 +133,7 @@ _initialize_mips64obsd_nat (void)
t = inf_ptrace_target ();
t->to_fetch_registers = mips64obsd_fetch_inferior_registers;
t->to_store_registers = mips64obsd_store_inferior_registers;
+ t->to_pid_to_str = obsd_pid_to_str;
+ t->to_find_new_threads = obsd_find_new_threads;
add_target (t);
}