From cff068da9d13bc9fa8c04f42151b4e92bfff86a1 Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Tue, 24 Mar 2015 14:05:44 +0000 Subject: [PATCH] Introduce basic LWP accessors This commit introduces three accessors that shared Linux code can use to access fields of struct lwp_info. The GDB and gdbserver Linux x86 code is modified to use them. gdb/ChangeLog: * nat/linux-nat.h (ptid_of_lwp): New declaration. (lwp_is_stopped): Likewise. (lwp_stop_reason): Likewise. * linux-nat.c (ptid_of_lwp): New function. (lwp_is_stopped): Likewise. (lwp_is_stopped_by_watchpoint): Likewise. * x86-linux-nat.c (update_debug_registers_callback): Use lwp_is_stopped. (x86_linux_prepare_to_resume): Use ptid_of_lwp and lwp_stop_reason. gdb/gdbserver/ChangeLog: * linux-low.c (ptid_of_lwp): New function. (lwp_is_stopped): Likewise. (lwp_stop_reason): Likewise. * linux-x86-low.c (update_debug_registers_callback): Use lwp_is_stopped. (x86_linux_prepare_to_resume): Use ptid_of_lwp and lwp_stop_reason. --- gdb/ChangeLog | 13 +++++++++++++ gdb/gdbserver/ChangeLog | 10 ++++++++++ gdb/gdbserver/linux-low.c | 26 ++++++++++++++++++++++++++ gdb/gdbserver/linux-x86-low.c | 7 ++++--- gdb/linux-nat.c | 27 +++++++++++++++++++++++++++ gdb/nat/linux-nat.h | 14 ++++++++++++++ gdb/x86-linux-nat.c | 16 +++++++++------- 7 files changed, 103 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d38e8283f0..fd5c10ba4f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2015-03-24 Gary Benson + + * nat/linux-nat.h (ptid_of_lwp): New declaration. + (lwp_is_stopped): Likewise. + (lwp_stop_reason): Likewise. + * linux-nat.c (ptid_of_lwp): New function. + (lwp_is_stopped): Likewise. + (lwp_is_stopped_by_watchpoint): Likewise. + * x86-linux-nat.c (update_debug_registers_callback): + Use lwp_is_stopped. + (x86_linux_prepare_to_resume): Use ptid_of_lwp and + lwp_stop_reason. + 2015-03-24 Gary Benson * linux-nat.h (linux_stop_lwp): Move declaration to... diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 0eef24e601..a77f04ba70 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,13 @@ +2015-03-24 Gary Benson + + * linux-low.c (ptid_of_lwp): New function. + (lwp_is_stopped): Likewise. + (lwp_stop_reason): Likewise. + * linux-x86-low.c (update_debug_registers_callback): + Use lwp_is_stopped. + (x86_linux_prepare_to_resume): Use ptid_of_lwp and + lwp_stop_reason. + 2015-03-24 Gary Benson * linux-low.h (linux_stop_lwp): Remove declaration. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 0c74e11b6e..f2a2224601 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -136,6 +136,32 @@ typedef struct } Elf64_auxv_t; #endif +/* LWP accessors. */ + +/* See nat/linux-nat.h. */ + +ptid_t +ptid_of_lwp (struct lwp_info *lwp) +{ + return ptid_of (get_lwp_thread (lwp)); +} + +/* See nat/linux-nat.h. */ + +int +lwp_is_stopped (struct lwp_info *lwp) +{ + return lwp->stopped; +} + +/* See nat/linux-nat.h. */ + +enum target_stop_reason +lwp_stop_reason (struct lwp_info *lwp) +{ + return lwp->stop_reason; +} + /* A list of all unknown processes which receive stop signals. Some other process will presumably claim each of these as forked children momentarily. */ diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c index 34254920d9..43bf8296f5 100644 --- a/gdb/gdbserver/linux-x86-low.c +++ b/gdb/gdbserver/linux-x86-low.c @@ -583,7 +583,7 @@ update_debug_registers_callback (struct lwp_info *lwp, void *arg) /* If the lwp isn't stopped, force it to momentarily pause, so we can update its debug registers. */ - if (!lwp->stopped) + if (!lwp_is_stopped (lwp)) linux_stop_lwp (lwp); return 0; @@ -783,7 +783,7 @@ x86_debug_reg_state (pid_t pid) static void x86_linux_prepare_to_resume (struct lwp_info *lwp) { - ptid_t ptid = ptid_of (get_lwp_thread (lwp)); + ptid_t ptid = ptid_of_lwp (lwp); int clear_status = 0; if (lwp->arch_private->debug_registers_changed) @@ -812,7 +812,8 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp) lwp->arch_private->debug_registers_changed = 0; } - if (clear_status || lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT) + if (clear_status + || lwp_stop_reason (lwp) == TARGET_STOPPED_BY_WATCHPOINT) x86_linux_dr_set (ptid, DR_STATUS, 0); } diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 5a2cba580f..283a12bc71 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -281,6 +281,33 @@ static int check_stopped_by_breakpoint (struct lwp_info *lp); static int sigtrap_is_event (int status); static int (*linux_nat_status_is_event) (int status) = sigtrap_is_event; + +/* LWP accessors. */ + +/* See nat/linux-nat.h. */ + +ptid_t +ptid_of_lwp (struct lwp_info *lwp) +{ + return lwp->ptid; +} + +/* See nat/linux-nat.h. */ + +int +lwp_is_stopped (struct lwp_info *lwp) +{ + return lwp->stopped; +} + +/* See nat/linux-nat.h. */ + +enum target_stop_reason +lwp_stop_reason (struct lwp_info *lwp) +{ + return lwp->stop_reason; +} + /* Trivial list manipulation functions to keep track of a list of new stopped processes. */ diff --git a/gdb/nat/linux-nat.h b/gdb/nat/linux-nat.h index c9830254dc..51d9ead21b 100644 --- a/gdb/nat/linux-nat.h +++ b/gdb/nat/linux-nat.h @@ -47,6 +47,20 @@ extern struct lwp_info *iterate_over_lwps (ptid_t filter, iterate_over_lwps_ftype callback, void *data); +/* Return the ptid of LWP. */ + +extern ptid_t ptid_of_lwp (struct lwp_info *lwp); + +/* Return nonzero if LWP is stopped, zero otherwise. This function + must be provided by the client. */ + +extern int lwp_is_stopped (struct lwp_info *lwp); + +/* Return the reason the LWP last stopped. This function must be + provided by the client. */ + +extern enum target_stop_reason lwp_stop_reason (struct lwp_info *lwp); + /* Cause LWP to stop. This function must be provided by the client. */ diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c index 7e45110051..74b48e378e 100644 --- a/gdb/x86-linux-nat.c +++ b/gdb/x86-linux-nat.c @@ -142,7 +142,7 @@ update_debug_registers_callback (struct lwp_info *lwp, void *arg) /* If the lwp isn't stopped, force it to momentarily pause, so we can update its debug registers. */ - if (!lwp->stopped) + if (!lwp_is_stopped (lwp)) linux_stop_lwp (lwp); /* Continue the iteration. */ @@ -178,6 +178,7 @@ x86_linux_dr_set_addr (int regnum, CORE_ADDR addr) static void x86_linux_prepare_to_resume (struct lwp_info *lwp) { + ptid_t ptid = ptid_of_lwp (lwp); int clear_status = 0; /* NULL means this is the main thread still going through the shell, @@ -189,7 +190,7 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp) if (lwp->arch_private->debug_registers_changed) { struct x86_debug_reg_state *state - = x86_debug_reg_state (ptid_get_pid (lwp->ptid)); + = x86_debug_reg_state (ptid_get_pid (ptid)); int i; /* On Linux kernel before 2.6.33 commit @@ -202,12 +203,12 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp) /* Clear DR_CONTROL first. In some cases, setting DR0-3 to a value that doesn't match what is enabled in DR_CONTROL results in EINVAL. */ - x86_linux_dr_set (lwp->ptid, DR_CONTROL, 0); + x86_linux_dr_set (ptid, DR_CONTROL, 0); ALL_DEBUG_ADDRESS_REGISTERS (i) if (state->dr_ref_count[i] > 0) { - x86_linux_dr_set (lwp->ptid, i, state->dr_mirror[i]); + x86_linux_dr_set (ptid, i, state->dr_mirror[i]); /* If we're setting a watchpoint, any change the inferior had done itself to the debug registers needs to be @@ -219,13 +220,14 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp) /* If DR_CONTROL is supposed to be zero, we've already set it above. */ if (state->dr_control_mirror != 0) - x86_linux_dr_set (lwp->ptid, DR_CONTROL, state->dr_control_mirror); + x86_linux_dr_set (ptid, DR_CONTROL, state->dr_control_mirror); lwp->arch_private->debug_registers_changed = 0; } - if (clear_status || lwp->stop_reason == TARGET_STOPPED_BY_WATCHPOINT) - x86_linux_dr_set (lwp->ptid, DR_STATUS, 0); + if (clear_status + || lwp_stop_reason (lwp) == TARGET_STOPPED_BY_WATCHPOINT) + x86_linux_dr_set (ptid, DR_STATUS, 0); } static void