mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-21 18:11:31 +00:00
Fix watching PC for 64bit (mips) target.
Stop watchpoints corrupting the event queue.
This commit is contained in:
parent
2f2e6c5d5b
commit
1a70e182aa
@ -1,5 +1,14 @@
|
||||
Tue May 27 14:32:00 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* sim-events.c (sim_events_process): Don't blat the event queue
|
||||
when processing watchpoints.
|
||||
|
||||
* sim-watch.h: Make arg unsigned long - stop sign extension.
|
||||
|
||||
* sim-events.c (sim_watch_valid): rewrite so debugable.
|
||||
|
||||
* sim-config.h (WITH_XOR_ENDIAN): Default to zero.
|
||||
|
||||
* sim-watch.c (schedule_watchpoint): Add is_within option so that
|
||||
inequality test is possible.
|
||||
(handle_watchpoint): Re-pass is_within arg.
|
||||
|
@ -676,54 +676,150 @@ sim_watch_valid (SIM_DESC sd,
|
||||
{
|
||||
|
||||
#define WATCH_CORE(N,OP,EXT) \
|
||||
{ \
|
||||
unsigned_##N word = 0; \
|
||||
int nr_read = sim_core_read_buffer (sd, NULL, to_do->core_map, &word, to_do->core_addr, sizeof (word)); \
|
||||
OP (word); \
|
||||
return (nr_read == sizeof (unsigned_##N) \
|
||||
&& (to_do->is_within \
|
||||
== (word >= to_do->lb##EXT \
|
||||
&& word <= to_do->ub##EXT))); \
|
||||
int ok; \
|
||||
unsigned_##N word = 0; \
|
||||
int nr_read = sim_core_read_buffer (sd, NULL, to_do->core_map, &word, \
|
||||
to_do->core_addr, sizeof (word)); \
|
||||
OP (word); \
|
||||
ok = (nr_read == sizeof (unsigned_##N) \
|
||||
&& (to_do->is_within \
|
||||
== (word >= to_do->lb##EXT \
|
||||
&& word <= to_do->ub##EXT)));
|
||||
|
||||
case watch_core_targ_1:
|
||||
{
|
||||
WATCH_CORE (1, T2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_targ_2:
|
||||
{
|
||||
WATCH_CORE (2, T2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_targ_4:
|
||||
{
|
||||
WATCH_CORE (4, T2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_targ_8:
|
||||
{
|
||||
WATCH_CORE (8, T2H,64);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_targ_1: WATCH_CORE (1, T2H,);
|
||||
case watch_core_targ_2: WATCH_CORE (2, T2H,);
|
||||
case watch_core_targ_4: WATCH_CORE (4, T2H,);
|
||||
case watch_core_targ_8: WATCH_CORE (8, T2H,64);
|
||||
|
||||
case watch_core_be_1: WATCH_CORE (1, BE2H,);
|
||||
case watch_core_be_2: WATCH_CORE (2, BE2H,);
|
||||
case watch_core_be_4: WATCH_CORE (4, BE2H,);
|
||||
case watch_core_be_8: WATCH_CORE (8, BE2H,64);
|
||||
case watch_core_be_1:
|
||||
{
|
||||
WATCH_CORE (1, BE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_be_2:
|
||||
{
|
||||
WATCH_CORE (2, BE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_be_4:
|
||||
{
|
||||
WATCH_CORE (4, BE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_be_8:
|
||||
{
|
||||
WATCH_CORE (8, BE2H,64);
|
||||
return ok;
|
||||
}
|
||||
|
||||
case watch_core_le_1: WATCH_CORE (1, LE2H,);
|
||||
case watch_core_le_2: WATCH_CORE (2, LE2H,);
|
||||
case watch_core_le_4: WATCH_CORE (4, LE2H,);
|
||||
case watch_core_le_8: WATCH_CORE (8, LE2H,64);
|
||||
case watch_core_le_1:
|
||||
{
|
||||
WATCH_CORE (1, LE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_le_2:
|
||||
{
|
||||
WATCH_CORE (2, LE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_le_4:
|
||||
{
|
||||
WATCH_CORE (4, LE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_core_le_8:
|
||||
{
|
||||
WATCH_CORE (8, LE2H,64);
|
||||
return ok;
|
||||
}
|
||||
#undef WATCH_CORE
|
||||
|
||||
#define WATCH_SIM(N,OP,EXT) \
|
||||
{ \
|
||||
unsigned_##N word = *(unsigned_##N*)to_do->host_addr; \
|
||||
OP (word); \
|
||||
return (to_do->is_within \
|
||||
== (word >= to_do->lb##EXT \
|
||||
&& word <= to_do->ub##EXT)); \
|
||||
int ok; \
|
||||
unsigned_##N word = *(unsigned_##N*)to_do->host_addr; \
|
||||
OP (word); \
|
||||
ok = (to_do->is_within \
|
||||
== (word >= to_do->lb##EXT \
|
||||
&& word <= to_do->ub##EXT));
|
||||
|
||||
case watch_sim_host_1:
|
||||
{
|
||||
WATCH_SIM (1, word = ,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_host_2:
|
||||
{
|
||||
WATCH_SIM (2, word = ,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_host_4:
|
||||
{
|
||||
WATCH_SIM (4, word = ,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_host_8:
|
||||
{
|
||||
WATCH_SIM (8, word = ,64);
|
||||
return ok;
|
||||
}
|
||||
|
||||
case watch_sim_host_1: WATCH_SIM (1, word = ,);
|
||||
case watch_sim_host_2: WATCH_SIM (2, word = ,);
|
||||
case watch_sim_host_4: WATCH_SIM (4, word = ,);
|
||||
case watch_sim_host_8: WATCH_SIM (8, word = ,64);
|
||||
case watch_sim_be_1:
|
||||
{
|
||||
WATCH_SIM (1, BE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_be_2:
|
||||
{
|
||||
WATCH_SIM (2, BE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_be_4:
|
||||
{
|
||||
WATCH_SIM (4, BE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_be_8:
|
||||
{
|
||||
WATCH_SIM (8, BE2H,64);
|
||||
return ok;
|
||||
}
|
||||
|
||||
case watch_sim_be_1: WATCH_SIM (1, BE2H,);
|
||||
case watch_sim_be_2: WATCH_SIM (2, BE2H,);
|
||||
case watch_sim_be_4: WATCH_SIM (4, BE2H,);
|
||||
case watch_sim_be_8: WATCH_SIM (8, BE2H,64);
|
||||
|
||||
case watch_sim_le_1: WATCH_SIM (1, LE2H,);
|
||||
case watch_sim_le_2: WATCH_SIM (1, LE2H,);
|
||||
case watch_sim_le_4: WATCH_SIM (1, LE2H,);
|
||||
case watch_sim_le_8: WATCH_SIM (1, LE2H,64);
|
||||
case watch_sim_le_1:
|
||||
{
|
||||
WATCH_SIM (1, LE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_le_2:
|
||||
{
|
||||
WATCH_SIM (1, LE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_le_4:
|
||||
{
|
||||
WATCH_SIM (1, LE2H,);
|
||||
return ok;
|
||||
}
|
||||
case watch_sim_le_8:
|
||||
{
|
||||
WATCH_SIM (1, LE2H,64);
|
||||
return ok;
|
||||
}
|
||||
#undef WATCH_SIM
|
||||
|
||||
case watch_clock: /* wallclock */
|
||||
@ -868,7 +964,6 @@ sim_events_process (SIM_DESC sd)
|
||||
{
|
||||
sim_event_handler *handler = to_do->handler;
|
||||
void *data = to_do->data;
|
||||
events->queue = to_do->next;
|
||||
ETRACE((_ETRACE,
|
||||
"event issued at %ld - tag 0x%lx - handler 0x%lx, data 0x%lx\n",
|
||||
(long) event_time,
|
||||
|
Loading…
x
Reference in New Issue
Block a user