diff options
author | Michael Snyder <msnyder@vmware.com> | 2000-03-28 22:30:19 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 2000-03-28 22:30:19 +0000 |
commit | 692590c19f459c379c6e13f83448ad5d11ebf1ed (patch) | |
tree | 30045b6da58f8c7811603dbfae1be9e0e5bd2302 /gdb/infrun.c | |
parent | e529db18ad8e3f2d8060c13a7e83a52da28d0ee5 (diff) | |
download | gdb-692590c19f459c379c6e13f83448ad5d11ebf1ed.zip gdb-692590c19f459c379c6e13f83448ad5d11ebf1ed.tar.gz gdb-692590c19f459c379c6e13f83448ad5d11ebf1ed.tar.bz2 |
2000-03-28 Peter Schauer <pes@regent.e-technik.tu-muenchen.de>
breakpoint.c, breakpoint.h (remove_hw_watchpoints): New function.
infrun.c (resume): Remove hardware watchpoints before stepping
when CANNOT_STEP_HW_WATCHPOINTS is nonzero.
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r-- | gdb/infrun.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c index 96a659e..6bc32d8 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -296,6 +296,13 @@ a command like `return' or `jump' to continue execution.\n"); #define HAVE_CONTINUABLE_WATCHPOINT 1 #endif +#ifndef CANNOT_STEP_HW_WATCHPOINTS +#define CANNOT_STEP_HW_WATCHPOINTS 0 +#else +#undef CANNOT_STEP_HW_WATCHPOINTS +#define CANNOT_STEP_HW_WATCHPOINTS 1 +#endif + /* Tables of how to react to signals; the user sets them. */ static unsigned char *signal_stop; @@ -796,6 +803,18 @@ resume (int step, enum target_signal sig) step = 0; #endif + /* Some targets (e.g. Solaris x86) have a kernel bug when stepping + over an instruction that causes a page fault without triggering + a hardware watchpoint. The kernel properly notices that it shouldn't + stop, because the hardware watchpoint is not triggered, but it forgets + the step request and continues the program normally. + Work around the problem by removing hardware watchpoints if a step is + requested, GDB will check for a hardware watchpoint trigger after the + step anyway. */ + if (CANNOT_STEP_HW_WATCHPOINTS && step && breakpoints_inserted) + remove_hw_watchpoints (); + + /* Normally, by the time we reach `resume', the breakpoints are either removed or inserted, as appropriate. The exception is if we're sitting at a permanent breakpoint; we need to step over it, but permanent |