2009-11-17 Daniel Jacobowitz <dan@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / gdbserver / mem-break.c
index 8f5872f284bf7c684b93190e7c898c2bc7dac3f3..9d89326b06cbc9ae55d155ad13aa924e3905b99e 100644 (file)
@@ -1,5 +1,6 @@
 /* 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.
 
@@ -45,17 +46,16 @@ struct breakpoint
   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,
@@ -66,24 +66,25 @@ set_breakpoint_at (CORE_ADDR where, int (*handler) (CORE_ADDR))
   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)
@@ -101,7 +102,8 @@ delete_breakpoint (struct breakpoint *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)
     {
@@ -224,7 +226,8 @@ set_breakpoint_data (const unsigned char *bp_data, int bp_len)
 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)
@@ -257,7 +260,8 @@ check_mem_read (CORE_ADDR mem_addr, unsigned char *buf, int mem_len)
 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)
@@ -289,11 +293,29 @@ check_mem_write (CORE_ADDR mem_addr, unsigned char *buf, int mem_len)
     }
 }
 
-/* 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);
+    }
 }
This page took 0.027878 seconds and 4 git commands to generate.