From fcc7376e0a4c3a68ef0b9d12fcc3733416b1cc8c Mon Sep 17 00:00:00 2001 From: Kamil Rytarowski Date: Thu, 19 Mar 2020 14:01:36 +0100 Subject: [PATCH] Avoid get_ptrace_pid() usage on NetBSD in x86-bsd-nat.c Add gdb_ptrace() that wraps the ptrace(2) API and correctly passes the pid,lwp pair to the calls on NetBSD; and the result of get_ptrace_pid() on other BSD Operating Systems. gdb/ChangeLog: * x86-bsd-nat.c (gdb_ptrace): New. * (x86bsd_dr_set): Add new argument `ptid'. * (x86bsd_dr_get, x86bsd_dr_set, x86bsd_dr_set_control, x86bsd_dr_set_addr): Update. --- gdb/ChangeLog | 7 +++++++ gdb/x86-bsd-nat.c | 43 ++++++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7f87eceaf70..0955d648e79 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2020-03-19 Kamil Rytarowski + + * x86-bsd-nat.c (gdb_ptrace): New. + * (x86bsd_dr_set): Add new argument `ptid'. + * (x86bsd_dr_get, x86bsd_dr_set, x86bsd_dr_set_control, + x86bsd_dr_set_addr): Update. + 2020-03-19 Andrew Burgess * remote.c (remote_target::process_stop_reply): Handle events for diff --git a/gdb/x86-bsd-nat.c b/gdb/x86-bsd-nat.c index 640a3c28110..9e2bea1e020 100644 --- a/gdb/x86-bsd-nat.c +++ b/gdb/x86-bsd-nat.c @@ -33,6 +33,19 @@ #include "inf-ptrace.h" +static int +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 +} + #ifdef PT_GETXSTATE_INFO size_t x86bsd_xsave_len; #endif @@ -56,31 +69,19 @@ static unsigned long x86bsd_dr_get (ptid_t ptid, int regnum) { struct dbreg dbregs; -#ifdef __NetBSD__ - int lwp = inferior_ptid.lwp (); -#else - int lwp = 0; -#endif - if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) &dbregs, lwp) == -1) + if (gdb_ptrace (PT_GETDBREGS, ptid, (PTRACE_TYPE_ARG3) &dbregs) == -1) perror_with_name (_("Couldn't read debug registers")); return DBREG_DRX ((&dbregs), regnum); } static void -x86bsd_dr_set (int regnum, unsigned long value) +x86bsd_dr_set (ptid_t ptid, int regnum, unsigned long value) { struct dbreg dbregs; -#ifdef __NetBSD__ - int lwp = inferior_ptid.lwp (); -#else - int lwp = 0; -#endif - if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) &dbregs, lwp) == -1) + if (gdb_ptrace (PT_GETDBREGS, ptid, (PTRACE_TYPE_ARG3) &dbregs) == -1) perror_with_name (_("Couldn't get debug registers")); /* For some mysterious reason, some of the reserved bits in the @@ -92,12 +93,8 @@ x86bsd_dr_set (int regnum, unsigned long value) for (thread_info *thread : current_inferior ()->non_exited_threads ()) { -#ifdef __NetBSD__ - lwp = thread->ptid.lwp (); -#endif - - if (ptrace (PT_SETDBREGS, get_ptrace_pid (thread->ptid), - (PTRACE_TYPE_ARG3) &dbregs, lwp) == -1) + if (gdb_ptrace (PT_SETDBREGS, thread->ptid, + (PTRACE_TYPE_ARG3) &dbregs) == -1) perror_with_name (_("Couldn't write debug registers")); } } @@ -105,7 +102,7 @@ x86bsd_dr_set (int regnum, unsigned long value) static void x86bsd_dr_set_control (unsigned long control) { - x86bsd_dr_set (7, control); + x86bsd_dr_set (inferior_ptid, 7, control); } static void @@ -113,7 +110,7 @@ x86bsd_dr_set_addr (int regnum, CORE_ADDR addr) { gdb_assert (regnum >= 0 && regnum <= 4); - x86bsd_dr_set (regnum, addr); + x86bsd_dr_set (inferior_ptid, regnum, addr); } static CORE_ADDR -- 2.30.2