* linux-nat.c (linux_nat_new_thread): New variable.
(linux_child_follow_fork): Set inferior_ptid to include LWP ID. Use linux_nat_switch_fork. (lwp_list): Make public. (add_lwp): Call linux_nat_new_thread. (lin_lwp_attach_lwp, linux_nat_attach): Call add_lwp after stopping the new thread. (resume_callback): Clear lp->siginfo. Remove unused variable. (linux_nat_resume): Assert that the LWP list is already initialized. Clear lp->siginfo. (save_siginfo): New. (stop_wait_callback, linux_nat_wait): Call it. (linux_nat_set_new_thread, linux_nat_get_siginfo): New. * linux-nat.h (struct lwp_info): Add siginfo. (lwp_list, linux_nat_set_new_thread, linux_nat_get_siginfo): Declare. (ALL_LWPS): Define. * amd64-linux-nat.c (amd64_linux_dr): New. (amd64_linux_dr_get): Take a PTID argument. Correct typo. (amd64_linux_dr_set): Take a PTID argument. (amd64_linux_dr_set_control, amd64_linux_dr_set_addr): Use ALL_LWPS. (amd64_linux_dr_reset_addr): Use amd64_linux_dr_set_addr. (amd64_linux_dr_get_status): Pass inferior_ptid to amd64_linux_dr_get. (amd64_linux_new_thread): New. (_initialize_amd64_linux_nat): Call linux_nat_set_new_thread. * i386-linux-nat.c (i386_linux_dr): New. (i386_linux_dr_get, i386_linux_dr_set): Take a PTID argument. (i386_linux_dr_set_control, i386_linux_dr_set_addr): Use ALL_LWPS. (i386_linux_dr_reset_addr): Use i386_linux_dr_set_addr. (i386_linux_dr_get_status): Pass inferior_ptid to i386_linux_dr_get. (i386_linux_new_thread): New. (i386_linux_resume): Remove unnecessary PID check. (_initialize_i386_linux_nat): Call linux_nat_set_new_thread. * ia64-linux-nat.c (enable_watchpoints_in_psr): Take PTID argument. (fetch_debug_register, fetch_debug_register_pair): Delete. (debug_registers): New. (ia64_linux_insert_watchpoint, ia64_linux_remove_watchpoint): Use ALL_LWPS and debug_registers. (ia64_linux_new_thread): New. (ia64_linux_stopped_data_address): Use linux_nat_get_siginfo. (_initialize_ia64_linux_nat): Call linux_nat_set_new_thread. * ppc-linux-nat.c (last_stopped_data_address): Delete. (saved_dabr_value): New. (ppc_linux_insert_watchpoint, ppc_linux_remove_watchpoint): Use ALL_LWPS. (ppc_linux_new_thread): New. (ppc_linux_stopped_data_address): Use linux_nat_get_siginfo. (ppc_linux_stopped_by_watchpoint): Call ppc_linux_stopped_data_address. (_initialize_ppc_linux_nat): Call linux_nat_set_new_thread. * s390-nat.c (s390_stopped_by_watchpoint): Clear the watchpoint status after reading it. (s390_fix_watch_points): Take a PTID argument. (s390_insert_watchpoint, s390_remove_watchpoint): Use ALL_LWPS. (_initialize_s390_nat): Call linux_nat_set_new_thread.
This commit is contained in:
parent
d983da9c3d
commit
9f0bdab802
8 changed files with 391 additions and 193 deletions
|
@ -252,6 +252,7 @@ s390_stopped_by_watchpoint (void)
|
|||
{
|
||||
per_lowcore_bits per_lowcore;
|
||||
ptrace_area parea;
|
||||
int result;
|
||||
|
||||
/* Speed up common case. */
|
||||
if (!watch_base)
|
||||
|
@ -263,14 +264,24 @@ s390_stopped_by_watchpoint (void)
|
|||
if (ptrace (PTRACE_PEEKUSR_AREA, s390_inferior_tid (), &parea) < 0)
|
||||
perror_with_name (_("Couldn't retrieve watchpoint status"));
|
||||
|
||||
return per_lowcore.perc_storage_alteration == 1
|
||||
&& per_lowcore.perc_store_real_address == 0;
|
||||
result = (per_lowcore.perc_storage_alteration == 1
|
||||
&& per_lowcore.perc_store_real_address == 0);
|
||||
|
||||
if (result)
|
||||
{
|
||||
/* Do not report this watchpoint again. */
|
||||
memset (&per_lowcore, 0, sizeof (per_lowcore));
|
||||
if (ptrace (PTRACE_POKEUSR_AREA, s390_inferior_tid (), &parea) < 0)
|
||||
perror_with_name (_("Couldn't clear watchpoint status"));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
s390_fix_watch_points (void)
|
||||
s390_fix_watch_points (ptid_t ptid)
|
||||
{
|
||||
int tid = s390_inferior_tid ();
|
||||
int tid;
|
||||
|
||||
per_struct per_info;
|
||||
ptrace_area parea;
|
||||
|
@ -278,6 +289,10 @@ s390_fix_watch_points (void)
|
|||
CORE_ADDR watch_lo_addr = (CORE_ADDR)-1, watch_hi_addr = 0;
|
||||
struct watch_area *area;
|
||||
|
||||
tid = TIDGET (ptid);
|
||||
if (tid == 0)
|
||||
tid = PIDGET (ptid);
|
||||
|
||||
for (area = watch_base; area; area = area->next)
|
||||
{
|
||||
watch_lo_addr = min (watch_lo_addr, area->lo_addr);
|
||||
|
@ -310,7 +325,10 @@ s390_fix_watch_points (void)
|
|||
static int
|
||||
s390_insert_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
{
|
||||
struct lwp_info *lp;
|
||||
ptid_t ptid;
|
||||
struct watch_area *area = xmalloc (sizeof (struct watch_area));
|
||||
|
||||
if (!area)
|
||||
return -1;
|
||||
|
||||
|
@ -320,13 +338,16 @@ s390_insert_watchpoint (CORE_ADDR addr, int len, int type)
|
|||
area->next = watch_base;
|
||||
watch_base = area;
|
||||
|
||||
s390_fix_watch_points ();
|
||||
ALL_LWPS (lp, ptid)
|
||||
s390_fix_watch_points (ptid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
s390_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
||||
{
|
||||
struct lwp_info *lp;
|
||||
ptid_t ptid;
|
||||
struct watch_area *area, **parea;
|
||||
|
||||
for (parea = &watch_base; *parea; parea = &(*parea)->next)
|
||||
|
@ -345,7 +366,8 @@ s390_remove_watchpoint (CORE_ADDR addr, int len, int type)
|
|||
*parea = area->next;
|
||||
xfree (area);
|
||||
|
||||
s390_fix_watch_points ();
|
||||
ALL_LWPS (lp, ptid)
|
||||
s390_fix_watch_points (ptid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -386,4 +408,5 @@ _initialize_s390_nat (void)
|
|||
|
||||
/* Register the target. */
|
||||
linux_nat_add_target (t);
|
||||
linux_nat_set_new_thread (t, s390_fix_watch_points);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue