[PATCH v2 22/22] Add watchpoint support to gdb simulator interface.

Jiri Gaisler
2015-02-19T22:32:57Z

Currently, only the sparc sim supports watchpoints. Stubs for the
watchpoint functions were added to all other built-in sims
to avoid linking errors.
---
gdb/remote-sim.c | 69 +++++++++++++
include/gdb/remote-sim.h | 24 +++++
sim/arm/wrapper.c | 26 +++++
sim/avr/interp.c | 25 +++++
sim/bfin/Makefile.in | 1 +
sim/common/sim-watch-remote.c | 27 +++++
sim/cr16/interp.c | 26 +++++
sim/cris/Makefile.in | 1 +
sim/erc32/interf.c | 235 ++++++++++++++++++++++++++++++++----------
sim/frv/Makefile.in | 1 +
sim/h8300/Makefile.in | 1 +
sim/iq2000/Makefile.in | 1 +
sim/lm32/Makefile.in | 1 +
sim/m32c/gdb-if.c | 26 +++++
sim/m32r/Makefile.in | 1 +
sim/m68hc11/Makefile.in | 1 +
sim/mcore/interp.c | 26 +++++
sim/microblaze/Makefile.in | 2 +-
sim/mips/Makefile.in | 1 +
sim/mn10300/Makefile.in | 1 +
sim/moxie/interp.c | 26 +++++
sim/msp430/Makefile.in | 1 +
sim/ppc/gdb-sim.c | 26 +++++
sim/rl78/gdb-if.c | 26 +++++
sim/rx/gdb-if.c | 26 +++++
sim/sh/interp.c | 26 +++++
sim/sh64/Makefile.in | 1 +
sim/v850/Makefile.in | 3 +-
28 files changed, 577 insertions(+), 54 deletions(-)
create mode 100644 sim/common/sim-watch-remote.c

diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index fd2fd58..af17e85 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -1294,6 +1294,70 @@ gdbsim_has_memory (struct target_ops *ops)
return 1;
}

+static int
+gdbsim_insert_watchpoint (struct target_ops *self,
+ CORE_ADDR addr, int len, int type,
+ struct expression *cond)
+{
+ struct sim_inferior_data *sim_data
+ = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
+
+ if (remote_debug)
+ fprintf_unfiltered (gdb_stdlog, "gdbsim_insert_watchpoint: %d\n", type);
+
+ if (sim_set_watchpoint (sim_data->gdbsim_desc, addr, len, type) != SIM_RC_OK)
+ return -1;
+
+ return 0;
+}
+
+static int
+gdbsim_remove_watchpoint (struct target_ops *self,
+ CORE_ADDR addr, int len, int type,
+ struct expression *cond)
+{
+ struct sim_inferior_data *sim_data
+ = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
+
+ if (remote_debug)
+ fprintf_unfiltered (gdb_stdlog, "gdbsim_remove_watchpoint: %d\n", type);
+
+ if (sim_clear_watchpoint (sim_data->gdbsim_desc, addr, len, type) != SIM_RC_OK)
+ return -1;
+
+ return 0;
+}
+
+
+static int
+gdbsim_can_use_hw_breakpoint (struct target_ops *self,
+ int type, int cnt, int othertype)
+{
+ struct sim_inferior_data *sim_data
+ = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
+
+ return (sim_can_use_hw_breakpoint(sim_data->gdbsim_desc, type, cnt, othertype));
+}
+
+static int
+gdbsim_stopped_by_watchpoint (struct target_ops *ops)
+{
+ struct sim_inferior_data *sim_data
+ = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
+
+ return (sim_stopped_by_watchpoint(sim_data->gdbsim_desc));;
+}
+
+static int
+gdbsim_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr)
+{
+ struct sim_inferior_data *sim_data
+ = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
+
+ *addr = sim_watchpoint_address(sim_data->gdbsim_desc);;
+ return (1);
+}
+
/* Define the target subroutine names. */

struct target_ops gdbsim_ops;
@@ -1316,6 +1380,11 @@ init_gdbsim_ops (void)
gdbsim_ops.to_files_info = gdbsim_files_info;
gdbsim_ops.to_insert_breakpoint = memory_insert_breakpoint;
gdbsim_ops.to_remove_breakpoint = memory_remove_breakpoint;
+ gdbsim_ops.to_insert_watchpoint = gdbsim_insert_watchpoint;
+ gdbsim_ops.to_remove_watchpoint = gdbsim_remove_watchpoint;
+ gdbsim_ops.to_stopped_by_watchpoint = gdbsim_stopped_by_watchpoint;
+ gdbsim_ops.to_can_use_hw_breakpoint = gdbsim_can_use_hw_breakpoint;
+ gdbsim_ops.to_stopped_data_address = gdbsim_stopped_data_address;
gdbsim_ops.to_kill = gdbsim_kill;
gdbsim_ops.to_load = gdbsim_load;
gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
diff --git a/include/gdb/remote-sim.h b/include/gdb/remote-sim.h
index 3dca380..36fef3c 100644
--- a/include/gdb/remote-sim.h
+++ b/include/gdb/remote-sim.h
@@ -280,6 +280,30 @@ void sim_do_command (SIM_DESC sd, const char *cmd);

char **sim_complete_command (SIM_DESC sd, const char *text, const char *word);

+/* Add hardware watchpoint. See to_insert_watchpoint() in target.h
+ for description of parameters. */
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type);
+
+/* Remove hardware watchpoint. See to_remove_watchpoint() in target.h
+ for description of parameters. */
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type);
+
+/* Returns data address when watchpoint has been hit. See
+ to_stopped_data_address() in target.h for description. */
+
+int sim_watchpoint_address (SIM_DESC sd);
+
+/* Returns 1 if simulator was stopped by watchpoint hit. */
+
+int sim_stopped_by_watchpoint(SIM_DESC sd);
+
+/* Returns non-zero if we can set a hardware watchpoint of type TYPE.
+ See to_can_use_hw_breakpoint() in target.h for details. */
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype);
+
#ifdef __cplusplus
}
#endif
diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c
index 0ccc7fb..a4f6824 100644
--- a/sim/arm/wrapper.c
+++ b/sim/arm/wrapper.c
@@ -1016,3 +1016,29 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word)
{
return NULL;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/avr/interp.c b/sim/avr/interp.c
index 8ae4887..c9f944c 100644
--- a/sim/avr/interp.c
+++ b/sim/avr/interp.c
@@ -1859,3 +1859,28 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word)
{
return NULL;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
diff --git a/sim/bfin/Makefile.in b/sim/bfin/Makefile.in
index b6cfeb5..d3fa401 100644
--- a/sim/bfin/Makefile.in
+++ b/sim/bfin/Makefile.in
@@ -39,6 +39,7 @@ SIM_OBJS = \
sim-reg.o \
sim-resume.o \
sim-stop.o \
+ sim-watch-remote.o \
@BFIN_SIM_EXTRA_OBJS@ \
$(SIM_EXTRA_OBJS)

diff --git a/sim/common/sim-watch-remote.c b/sim/common/sim-watch-remote.c
new file mode 100644
index 0000000..279bb06
--- /dev/null
+++ b/sim/common/sim-watch-remote.c
@@ -0,0 +1,27 @@
+
+#include "gdb/remote-sim.h"
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
diff --git a/sim/cr16/interp.c b/sim/cr16/interp.c
index 9c85948..4199579 100644
--- a/sim/cr16/interp.c
+++ b/sim/cr16/interp.c
@@ -1584,3 +1584,29 @@ sim_load (SIM_DESC sd, const char *prog, struct bfd *abfd, int from_tty)
prog_bfd_was_opened_p = abfd == NULL;
return SIM_RC_OK;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/cris/Makefile.in b/sim/cris/Makefile.in
index a4332c8..6607c32 100644
--- a/sim/cris/Makefile.in
+++ b/sim/cris/Makefile.in
@@ -30,6 +30,7 @@ SIM_OBJS = \
sim-hrw.o \
sim-model.o \
sim-reg.o \
+ sim-watch-remote.o \
cgen-utils.o cgen-trace.o cgen-scache.o \
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
sim-if.o arch.o \
diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c
index 8988f23..cfc1b4f 100644
--- a/sim/erc32/interf.c
+++ b/sim/erc32/interf.c
@@ -36,8 +36,6 @@

#define PSR_CWP 0x7

-int sis_gdb_break = 1;
-
int
run_sim(sregs, icount, dis)
struct pstate *sregs;
@@ -52,37 +50,14 @@ run_sim(sregs, icount, dis)
ms->init_stdio();
sregs->starttime = get_time();
irq = 0;
+ if (sregs->err_mode) icount = 0;
if ((sregs->pc != 0) && (ebase.simtime == 0)) ms->boot_init();
- while (!sregs->err_mode & (icount > 0)) {
-
+ while (icount > 0) {
sregs->fhold = 0;
- sregs->hold = 0;
sregs->icnt = 1;
-
- if (sregs->psr & 0x080)
- sregs->asi = 8;
- else
- sregs->asi = 9;
-
-#if 0 /* DELETE ME! for debugging purposes only */
- if (sis_verbose > 1)
- if (sregs->pc == 0 || sregs->npc == 0)
- printf ("bogus pc or npc\n");
-#endif
mexc = ms->memory_iread(sregs->pc, &sregs->inst, &sregs->hold);
-#if 0 /* DELETE ME! for debugging purposes only */
- if (sis_verbose > 2)
- printf("pc %x, np %x, sp %x, fp %x, wm %x, cw %x, i %08x\n",
- sregs->pc, sregs->npc,
- sregs->r[(((sregs->psr & 7) << 4) + 14) & 0x7f],
- sregs->r[(((sregs->psr & 7) << 4) + 30) & 0x7f],
- sregs->wim,
- sregs->psr & 7,
- sregs->inst);
-#endif
if (sregs->annul) {
sregs->annul = 0;
- sregs->icnt = 1;
sregs->pc = sregs->npc;
sregs->npc = sregs->npc + 4;
} else {
@@ -91,47 +66,40 @@ run_sim(sregs, icount, dis)
if (mexc) {
sregs->trap = I_ACC_EXC;
} else {
- if ((sis_gdb_break) && (sregs->inst == 0x91d02001)) {
- if (sis_verbose)
- (*sim_callback->printf_filtered) (sim_callback,
- "SW BP hit at %x\n", sregs->pc);
- ms->sim_halt();
- ms->restore_stdio();
- clearerr(stdin);
- return (BPT_HIT);
- } else
- dispatch_instruction(sregs);
+ dispatch_instruction(sregs);
+ icount--;
}
- icount--;
}
if (sregs->trap) {
irq = 0;
- sregs->err_mode = execute_trap(sregs);
+ if ((sregs->err_mode = execute_trap(sregs)) == WPT_HIT) {
+ sregs->err_mode = 0;
+ sregs->trap = 0;
+ icount = 0;
+ }
+ if (sregs->err_mode) icount = 0;
+
}
}
advance_time(sregs);
- if (ctrl_c) {
+ if (ctrl_c)
icount = 0;
- }
}
ms->sim_halt();
sregs->tottime += get_time() - sregs->starttime;
ms->restore_stdio();
clearerr(stdin);
- if (sregs->err_mode)
+ if (sregs->err_mode) {
ms->error_mode(sregs->pc);
- if (sregs->err_mode)
return (ERROR);
- if (sregs->bphit) {
- if (sis_verbose)
- (*sim_callback->printf_filtered) (sim_callback,
- "HW BP hit at %x\n", sregs->pc);
- return (BPT_HIT);
}
if (ctrl_c) {
ctrl_c = 0;
+ sregs->wphit = sregs->bphit = 0;
return (CTRL_C);
}
+ if ((sregs->bphit) || (sregs->wphit))
+ return (BPT_HIT);
return (TIME_OUT);
}

@@ -161,6 +129,7 @@ sim_open (kind, callback, abfd, argv)
int freq = 0;

sim_callback = callback;
+ sis_gdb_break = 1;

while (argv[argc])
argc++;
@@ -413,12 +382,15 @@ sim_stop_reason(sd, reason, sigrc)
{

switch (simstat) {
- case CTRL_C:
+ case CTRL_C:
*reason = sim_stopped;
*sigrc = GDB_SIGNAL_INT;
break;
case OK:
case TIME_OUT:
+ *reason = sim_stopped;
+ *sigrc = 0;
+ break;
case BPT_HIT:
*reason = sim_stopped;
*sigrc = GDB_SIGNAL_TRAP;
@@ -427,8 +399,10 @@ sim_stop_reason(sd, reason, sigrc)
*sigrc = 0;
*reason = sim_exited;
}
- ctrl_c = 0;
- simstat = OK;
+
+ if (sis_verbose)
+ (*sim_callback->printf_filtered) (sim_callback,
+ "sim_stop_reason %x : %x\n", *reason, *sigrc);
}

/* Flush all register windows out to the stack. Starting after the invalid
@@ -489,7 +463,25 @@ flush_windows ()
void
sim_resume(SIM_DESC sd, int step, int siggnal)
{
- simstat = run_sim(&sregs, UINT64_MAX, 0);
+ if (sis_verbose)
+ (*sim_callback->printf_filtered) (sim_callback,
+ "sim_resume %x : %x : %x : %x : 0x%08x\n", step, siggnal, sregs.bphit, sregs.wphit, sregs.pc);
+ if (step) {
+ sregs.bphit = 0;
+ sregs.wphit = 1;
+ simstat = run_sim(&sregs, 1, 0);
+ sregs.bphit = 0;
+ sregs.wphit = 0;
+ } else if (sregs.bphit || sregs.wphit) {
+ sregs.bphit = 0;
+ sregs.wphit = 1;
+ simstat = run_sim(&sregs, 1, 0);
+ sregs.bphit = sregs.wphit = 0;
+ simstat = run_sim(&sregs, UINT64_MAX, 0);
+ sregs.bphit = 0;
+ }
+ else
+ simstat = run_sim(&sregs, UINT64_MAX, 0);

if (sis_gdb_break) flush_windows ();
}
@@ -524,6 +516,145 @@ sim_stop(SIM_DESC sd)
return 1;
}

+static int
+sis_insert_watchpoint_read(int addr, unsigned char mask)
+{
+ if (sregs.wprnum < WPR_MAX) {
+ sregs.wprs[sregs.wprnum] = addr;
+ sregs.wprm[sregs.wprnum] = mask;
+ sregs.wprnum++;
+ if (sis_verbose)
+ (*sim_callback->printf_filtered) (sim_callback, "inserted read watchpoint at %x\n", addr);
+ return SIM_RC_OK;
+ } else
+ return SIM_RC_FAIL;
+}
+
+static int
+sis_remove_watchpoint_read(int addr)
+{
+ int i = 0;
+
+ while ((i < sregs.wprnum) && (sregs.wprs[i] != addr))
+ i++;
+ if (addr == sregs.wprs[i]) {
+ for (; i < sregs.wprnum - 1; i++)
+ sregs.wprs[i] = sregs.wprs[i + 1];
+ sregs.wprnum -= 1;
+ if (sis_verbose)
+ (*sim_callback->printf_filtered) (sim_callback, "removed read watchpoint at %x\n", addr);
+ return 0;
+ }
+ return 1;
+}
+
+static int
+sis_insert_watchpoint_write(int32 addr, unsigned char mask)
+{
+ if (sregs.wpwnum < WPR_MAX) {
+ sregs.wpws[sregs.wpwnum] = addr;
+ sregs.wpwm[sregs.wpwnum] = mask;
+ sregs.wpwnum++;
+ if (sis_verbose)
+ (*sim_callback->printf_filtered) (sim_callback, "sim_insert_watchpoint_write: 0x%08x : %x\n", addr, mask);
+ return SIM_RC_OK;
+ } else
+ return SIM_RC_FAIL;
+}
+
+static int
+sis_remove_watchpoint_write(int addr)
+{
+ int i = 0;
+
+ while ((i < sregs.wpwnum) && (sregs.wpws[i] != addr))
+ i++;
+ if (addr == sregs.wpws[i]) {
+ for (; i < sregs.wpwnum - 1; i++)
+ sregs.wpws[i] = sregs.wpws[i + 1];
+ sregs.wpwnum -= 1;
+ if (sis_verbose)
+ (*sim_callback->printf_filtered) (sim_callback, "removed write watchpoint at %x\n", addr);
+ return SIM_RC_OK;
+ }
+ return SIM_RC_FAIL;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ if (type == 2) /* bp_hardware_breakpoint not supported */
+ return 0;
+ else
+ return 1;
+}
+
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ int res;
+ unsigned char mask;
+
+ switch (length) {
+ case 1: mask = 0; break;
+ case 2: mask = 1; break;
+ case 4: mask = 3; break;
+ default: mask = 7; break;
+ }
+
+ switch (type) {
+ case 0:
+ res = sis_insert_watchpoint_write (mem, mask);
+ break;
+ case 1:
+ res = sis_insert_watchpoint_read (mem, mask);
+ break;
+ case 2:
+ if ((res = sis_insert_watchpoint_write (mem, mask)) == SIM_RC_OK)
+ res = sis_insert_watchpoint_read (mem, mask);
+ if (res == SIM_RC_FAIL)
+ sis_remove_watchpoint_read (mem);
+ break;
+ default:
+ res = -1;
+ }
+ return (res);
+}
+
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ int res;
+ switch (type) {
+ case 0:
+ res = sis_remove_watchpoint_write (mem);
+ break;
+ case 1:
+ res = sis_remove_watchpoint_read (mem);
+ break;
+ case 2:
+ if ((res = sis_remove_watchpoint_write (mem)) == SIM_RC_OK)
+ res = sis_remove_watchpoint_read (mem);
+ else
+ sis_remove_watchpoint_read (mem);
+ break;
+ default:
+ res = -1;
+ }
+ return (res);
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ if (sis_verbose)
+ (*sim_callback->printf_filtered) (sim_callback, "sim_stopped_by_watchpoint %x\n", sregs.wphit);
+ return((sregs.wphit != 0));
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return(sregs.wpaddress);
+}
+
#if 0 /* FIXME: These shouldn't exist. */

int
diff --git a/sim/frv/Makefile.in b/sim/frv/Makefile.in
index ea34bf2..1e1398d 100644
--- a/sim/frv/Makefile.in
+++ b/sim/frv/Makefile.in
@@ -26,6 +26,7 @@ SIM_OBJS = \
sim-hrw.o \
sim-model.o \
sim-reg.o \
+ sim-watch-remote.o \
cgen-utils.o cgen-trace.o cgen-scache.o cgen-fpu.o cgen-accfp.o \
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
sim-if.o arch.o \
diff --git a/sim/h8300/Makefile.in b/sim/h8300/Makefile.in
index 7a569bd..3337b89 100644
--- a/sim/h8300/Makefile.in
+++ b/sim/h8300/Makefile.in
@@ -25,6 +25,7 @@ SIM_OBJS = compile.o \
sim-cpu.o \
sim-engine.o \
sim-load.o \
+ sim-watch-remote.o \
$(SIM_EXTRA_OBJS)

## COMMON_POST_CONFIG_FRAG
diff --git a/sim/iq2000/Makefile.in b/sim/iq2000/Makefile.in
index 7606b26..c079248 100644
--- a/sim/iq2000/Makefile.in
+++ b/sim/iq2000/Makefile.in
@@ -32,6 +32,7 @@ SIM_OBJS = \
cgen-utils.o cgen-trace.o cgen-scache.o \
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
sim-if.o arch.o \
+ sim-watch-remote.o \
$(IQ2000_OBJS) \
$(CONFIG_DEVICES)

diff --git a/sim/lm32/Makefile.in b/sim/lm32/Makefile.in
index 05cf53b..d8d5a2a 100644
--- a/sim/lm32/Makefile.in
+++ b/sim/lm32/Makefile.in
@@ -15,6 +15,7 @@ SIM_OBJS = \
cgen-utils.o cgen-trace.o cgen-scache.o \
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
sim-if.o arch.o \
+ sim-watch-remote.o \
cpu.o decode.o sem.o model.o mloop.o \
lm32.o traps.o user.o

diff --git a/sim/m32c/gdb-if.c b/sim/m32c/gdb-if.c
index 62ec28c..525c934 100644
--- a/sim/m32c/gdb-if.c
+++ b/sim/m32c/gdb-if.c
@@ -710,3 +710,29 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word)
{
return NULL;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/m32r/Makefile.in b/sim/m32r/Makefile.in
index 12a6a8d..dfa7bd0 100644
--- a/sim/m32r/Makefile.in
+++ b/sim/m32r/Makefile.in
@@ -34,6 +34,7 @@ SIM_OBJS = \
cgen-utils.o cgen-trace.o cgen-scache.o \
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
sim-if.o arch.o \
+ sim-watch-remote.o \
$(M32R_OBJS) \
$(M32RX_OBJS) \
$(M32R2_OBJS) \
diff --git a/sim/m68hc11/Makefile.in b/sim/m68hc11/Makefile.in
index fac0b24..62915d1 100644
--- a/sim/m68hc11/Makefile.in
+++ b/sim/m68hc11/Makefile.in
@@ -31,6 +31,7 @@ SIM_OBJS = $(M68HC11_OBJS) \
sim-stop.o \
sim-hrw.o \
sim-reason.o \
+ sim-watch-remote.o \
$(SIM_EXTRA_OBJS)

SIM_PROFILE= -DPROFILE=1 -DWITH_PROFILE=-1
diff --git a/sim/mcore/interp.c b/sim/mcore/interp.c
index 7e2be0d..6e9e332 100644
--- a/sim/mcore/interp.c
+++ b/sim/mcore/interp.c
@@ -2208,3 +2208,29 @@ sim_set_callbacks (ptr)
{
callback = ptr;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/microblaze/Makefile.in b/sim/microblaze/Makefile.in
index dda4650..49be635 100644
--- a/sim/microblaze/Makefile.in
+++ b/sim/microblaze/Makefile.in
@@ -17,7 +17,7 @@

## COMMON_PRE_CONFIG_FRAG

-SIM_OBJS = interp.o sim-load.o
+SIM_OBJS = interp.o sim-load.o sim-watch-remote.o
SIM_EXTRA_LIBS = -lm
SIM_EXTRA_CLEAN = microblaze-clean

diff --git a/sim/mips/Makefile.in b/sim/mips/Makefile.in
index 985f4e5..22b4714 100644
--- a/sim/mips/Makefile.in
+++ b/sim/mips/Makefile.in
@@ -54,6 +54,7 @@ SIM_OBJS = \
sim-stop.o \
sim-resume.o \
sim-reason.o \
+ sim-watch-remote.o

# List of flags to always pass to $(CC).
diff --git a/sim/mn10300/Makefile.in b/sim/mn10300/Makefile.in
index c94e531..0a8cd86 100644
--- a/sim/mn10300/Makefile.in
+++ b/sim/mn10300/Makefile.in
@@ -27,6 +27,7 @@ MN10300_OBJS = \
sim-resume.o \
sim-reason.o \
sim-stop.o \
+ sim-watch-remote.o \
dv-sockser.o

SIM_OBJS = $(MN10300_OBJS) interp.o
diff --git a/sim/moxie/interp.c b/sim/moxie/interp.c
index 5f449af..4697274 100644
--- a/sim/moxie/interp.c
+++ b/sim/moxie/interp.c
@@ -1475,3 +1475,29 @@ sim_set_callbacks (ptr)
{
callback = ptr;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/msp430/Makefile.in b/sim/msp430/Makefile.in
index e398d0d..5982f4b 100644
--- a/sim/msp430/Makefile.in
+++ b/sim/msp430/Makefile.in
@@ -36,6 +36,7 @@ SIM_OBJS = \
sim-reg.o \
sim-resume.o \
sim-stop.o \
+ sim-watch-remote.o \
$(SIM_EXTRA_OBJS)

# List of extra dependencies.
diff --git a/sim/ppc/gdb-sim.c b/sim/ppc/gdb-sim.c
index 0269458..b591e9e 100644
--- a/sim/ppc/gdb-sim.c
+++ b/sim/ppc/gdb-sim.c
@@ -1296,3 +1296,29 @@ sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
return psim_write_register(simulator, MAX_NR_PROCESSORS,
buf, regname, raw_transfer);
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/rl78/gdb-if.c b/sim/rl78/gdb-if.c
index 6317a73..26a425b 100644
--- a/sim/rl78/gdb-if.c
+++ b/sim/rl78/gdb-if.c
@@ -571,3 +571,29 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word)
{
return NULL;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/rx/gdb-if.c b/sim/rx/gdb-if.c
index 762c3d2..56eb8e6 100644
--- a/sim/rx/gdb-if.c
+++ b/sim/rx/gdb-if.c
@@ -853,3 +853,29 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word)
{
return NULL;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/sh/interp.c b/sim/sh/interp.c
index c854174..f1bcd06 100644
--- a/sim/sh/interp.c
+++ b/sim/sh/interp.c
@@ -2780,3 +2780,29 @@ sim_complete_command (SIM_DESC sd, const char *text, const char *word)
{
return NULL;
}
+
+int sim_set_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_clear_watchpoint (SIM_DESC sd, SIM_ADDR mem, int length, int type)
+{
+ return -1;
+}
+
+int sim_stopped_by_watchpoint (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_watchpoint_address (SIM_DESC sd)
+{
+ return 0;
+}
+
+int sim_can_use_hw_breakpoint (SIM_DESC sd, int type, int cnt, int othertype)
+{
+ return 0;
+}
+
diff --git a/sim/sh64/Makefile.in b/sim/sh64/Makefile.in
index 0022d8e..a9cf62a 100644
--- a/sim/sh64/Makefile.in
+++ b/sim/sh64/Makefile.in
@@ -34,6 +34,7 @@ SIM_OBJS = \
cgen-utils.o cgen-trace.o cgen-scache.o \
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
sim-if.o arch.o \
+ sim-watch-remote.o \
$(SH64_OBJS) \
$(CONFIG_DEVICES)

diff --git a/sim/v850/Makefile.in b/sim/v850/Makefile.in
index 067158f..ad24cd8 100644
--- a/sim/v850/Makefile.in
+++ b/sim/v850/Makefile.in
@@ -28,7 +28,8 @@ SIM_OBJS = \
sim-hrw.o \
sim-resume.o \
sim-reason.o \
- sim-stop.o
+ sim-stop.o \
+ sim-watch-remote.o

SIM_RUN_OBJS = nrun.o

--
2.1.0