/* Memory breakpoint operations for the remote server for GDB.
- Copyright (C) 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2005, 2007, 2008, 2009
+ Free Software Foundation, Inc.
Contributed by MontaVista Software.
int (*handler) (CORE_ADDR);
};
-struct breakpoint *breakpoints;
-
void
set_breakpoint_at (CORE_ADDR where, int (*handler) (CORE_ADDR))
{
+ struct process_info *proc = current_process ();
struct breakpoint *bp;
if (breakpoint_data == NULL)
error ("Target does not support breakpoints.");
- bp = malloc (sizeof (struct breakpoint));
+ bp = xmalloc (sizeof (struct breakpoint));
memset (bp, 0, sizeof (struct breakpoint));
(*the_target->read_memory) (where, bp->old_data,
bp->pc = where;
bp->handler = handler;
- bp->next = breakpoints;
- breakpoints = bp;
+ bp->next = proc->breakpoints;
+ proc->breakpoints = bp;
}
static void
delete_breakpoint (struct breakpoint *bp)
{
+ struct process_info *proc = current_process ();
struct breakpoint *cur;
- if (breakpoints == bp)
+ if (proc->breakpoints == bp)
{
- breakpoints = bp->next;
+ proc->breakpoints = bp->next;
(*the_target->write_memory) (bp->pc, bp->old_data,
breakpoint_len);
free (bp);
return;
}
- cur = breakpoints;
+ cur = proc->breakpoints;
while (cur->next)
{
if (cur->next == bp)
static struct breakpoint *
find_breakpoint_at (CORE_ADDR where)
{
- struct breakpoint *bp = breakpoints;
+ struct process_info *proc = current_process ();
+ struct breakpoint *bp = proc->breakpoints;
while (bp != NULL)
{
void
check_mem_read (CORE_ADDR mem_addr, unsigned char *buf, int mem_len)
{
- struct breakpoint *bp = breakpoints;
+ struct process_info *proc = current_process ();
+ struct breakpoint *bp = proc->breakpoints;
CORE_ADDR mem_end = mem_addr + mem_len;
for (; bp != NULL; bp = bp->next)
void
check_mem_write (CORE_ADDR mem_addr, unsigned char *buf, int mem_len)
{
- struct breakpoint *bp = breakpoints;
+ struct process_info *proc = current_process ();
+ struct breakpoint *bp = proc->breakpoints;
CORE_ADDR mem_end = mem_addr + mem_len;
for (; bp != NULL; bp = bp->next)
}
}
-/* Delete all breakpoints. */
+/* Delete all breakpoints, and un-insert them from the inferior. */
void
delete_all_breakpoints (void)
{
- while (breakpoints)
- delete_breakpoint (breakpoints);
+ struct process_info *proc = current_process ();
+
+ while (proc->breakpoints)
+ delete_breakpoint (proc->breakpoints);
+}
+
+/* Release all breakpoints, but do not try to un-insert them from the
+ inferior. */
+
+void
+free_all_breakpoints (struct process_info *proc)
+{
+ struct breakpoint *bp;
+
+ while (proc->breakpoints)
+ {
+ bp = proc->breakpoints;
+ proc->breakpoints = bp->next;
+ free (bp);
+ }
}