* target.c (memory_xfer_partial): Only update dcache after we know
authorDoug Evans <dje@google.com>
Mon, 14 Sep 2009 20:49:11 +0000 (20:49 +0000)
committerDoug Evans <dje@google.com>
Mon, 14 Sep 2009 20:49:11 +0000 (20:49 +0000)
the write succeeded.

gdb/ChangeLog
gdb/target.c

index 0d6b94729ed10c0cc6b7f3e6c4db9c99fe40a157..ce226cc3dda62511aac29ff51f34ee5a7002e022 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-14  Doug Evans  <dje@google.com>
+
+       * target.c (memory_xfer_partial): Only update dcache after we know
+       the write succeeded.
+
 2009-09-14  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
        *minsyms.c (lookup_minimal_symbol_by_pc_section_1): Assert non-NULL
index a662ecab66966e81a6a43170e3dd686d95439f9b..cb955bda0fe9c1da49a3ff5bb3bf5e7a7625f137 100644 (file)
@@ -1289,19 +1289,6 @@ memory_xfer_partial (struct target_ops *ops, enum target_object object,
        }
     }
 
-  /* Make sure the cache gets updated no matter what - if we are writing
-     to the stack, even if this write is not tagged as such, we still need
-     to update the cache. */
-
-  if (inf != NULL
-      && readbuf == NULL
-      && !region->attrib.cache
-      && stack_cache_enabled_p
-      && object != TARGET_OBJECT_STACK_MEMORY)
-    {
-      dcache_update (target_dcache, memaddr, (void *) writebuf, reg_len);
-    }
-
   /* If none of those methods found the memory we wanted, fall back
      to a target partial transfer.  Normally a single call to
      to_xfer_partial is enough; if it doesn't recognize an object
@@ -1331,6 +1318,20 @@ memory_xfer_partial (struct target_ops *ops, enum target_object object,
   if (readbuf && !show_memory_breakpoints)
     breakpoint_restore_shadows (readbuf, memaddr, reg_len);
 
+  /* Make sure the cache gets updated no matter what - if we are writing
+     to the stack.  Even if this write is not tagged as such, we still need
+     to update the cache.  */
+
+  if (res > 0
+      && inf != NULL
+      && writebuf != NULL
+      && !region->attrib.cache
+      && stack_cache_enabled_p
+      && object != TARGET_OBJECT_STACK_MEMORY)
+    {
+      dcache_update (target_dcache, memaddr, (void *) writebuf, reg_len);
+    }
+
   /* If we still haven't got anything, return the last error.  We
      give up.  */
   return res;