| Index: gdb/dcache.c | 
| diff --git a/gdb/dcache.c b/gdb/dcache.c | 
| index 652cfab9e091e86723e2beef7f797bd4d908641e..804d567d1f8a24d9243c0abe4e515095a242e937 100644 | 
| --- a/gdb/dcache.c | 
| +++ b/gdb/dcache.c | 
| @@ -1,7 +1,6 @@ | 
| /* Caching code for GDB, the GNU debugger. | 
|  | 
| -   Copyright (C) 1992-1993, 1995-1996, 1998-2001, 2003, 2007-2012 Free | 
| -   Software Foundation, Inc. | 
| +   Copyright (C) 1992-2013 Free Software Foundation, Inc. | 
|  | 
| This file is part of GDB. | 
|  | 
| @@ -21,9 +20,9 @@ | 
| #include "defs.h" | 
| #include "dcache.h" | 
| #include "gdbcmd.h" | 
| -#include "gdb_string.h" | 
| +#include <string.h> | 
| #include "gdbcore.h" | 
| -#include "target.h" | 
| +#include "target-dcache.h" | 
| #include "inferior.h" | 
| #include "splay-tree.h" | 
|  | 
| @@ -140,8 +139,6 @@ show_dcache_enabled_p (struct ui_file *file, int from_tty, | 
| fprintf_filtered (file, _("Deprecated remotecache flag is %s.\n"), value); | 
| } | 
|  | 
| -static DCACHE *last_cache; /* Used by info dcache.  */ | 
| - | 
| /* Add BLOCK to circular block list BLIST, behind the block at *BLIST. | 
| *BLIST is not updated (unless it was previously NULL of course). | 
| This is for the least-recently-allocated list's sake: | 
| @@ -226,9 +223,6 @@ free_block (struct dcache_block *block, void *param) | 
| void | 
| dcache_free (DCACHE *dcache) | 
| { | 
| -  if (last_cache == dcache) | 
| -    last_cache = NULL; | 
| - | 
| splay_tree_delete (dcache->tree); | 
| for_each_block (&dcache->oldest, free_block, NULL); | 
| for_each_block (&dcache->freelist, free_block, NULL); | 
| @@ -342,15 +336,14 @@ dcache_read_line (DCACHE *dcache, struct dcache_block *db) | 
| len     -= reg_len; | 
| continue; | 
| } | 
| - | 
| -      res = target_read (¤t_target, TARGET_OBJECT_RAW_MEMORY, | 
| -			 NULL, myaddr, memaddr, reg_len); | 
| -      if (res < reg_len) | 
| + | 
| +      res = target_read_raw_memory (memaddr, myaddr, reg_len); | 
| +      if (res != 0) | 
| return 0; | 
|  | 
| -      memaddr += res; | 
| -      myaddr += res; | 
| -      len -= res; | 
| +      memaddr += reg_len; | 
| +      myaddr += reg_len; | 
| +      len -= reg_len; | 
| } | 
|  | 
| return 1; | 
| @@ -469,7 +462,6 @@ dcache_init (void) | 
| dcache->size = 0; | 
| dcache->line_size = dcache_line_size; | 
| dcache->ptid = null_ptid; | 
| -  last_cache = dcache; | 
|  | 
| return dcache; | 
| } | 
| @@ -558,26 +550,28 @@ dcache_update (DCACHE *dcache, CORE_ADDR memaddr, gdb_byte *myaddr, int len) | 
| dcache_poke_byte (dcache, memaddr + i, myaddr + i); | 
| } | 
|  | 
| +/* Print DCACHE line INDEX.  */ | 
| + | 
| static void | 
| -dcache_print_line (int index) | 
| +dcache_print_line (DCACHE *dcache, int index) | 
| { | 
| splay_tree_node n; | 
| struct dcache_block *db; | 
| int i, j; | 
|  | 
| -  if (!last_cache) | 
| +  if (dcache == NULL) | 
| { | 
| printf_filtered (_("No data cache available.\n")); | 
| return; | 
| } | 
|  | 
| -  n = splay_tree_min (last_cache->tree); | 
| +  n = splay_tree_min (dcache->tree); | 
|  | 
| for (i = index; i > 0; --i) | 
| { | 
| if (!n) | 
| break; | 
| -      n = splay_tree_successor (last_cache->tree, n->key); | 
| +      n = splay_tree_successor (dcache->tree, n->key); | 
| } | 
|  | 
| if (!n) | 
| @@ -589,21 +583,23 @@ dcache_print_line (int index) | 
| db = (struct dcache_block *) n->value; | 
|  | 
| printf_filtered (_("Line %d: address %s [%d hits]\n"), | 
| -		   index, paddress (target_gdbarch, db->addr), db->refs); | 
| +		   index, paddress (target_gdbarch (), db->addr), db->refs); | 
|  | 
| -  for (j = 0; j < last_cache->line_size; j++) | 
| +  for (j = 0; j < dcache->line_size; j++) | 
| { | 
| printf_filtered ("%02x ", db->data[j]); | 
|  | 
| /* Print a newline every 16 bytes (48 characters).  */ | 
| -      if ((j % 16 == 15) && (j != last_cache->line_size - 1)) | 
| +      if ((j % 16 == 15) && (j != dcache->line_size - 1)) | 
| printf_filtered ("\n"); | 
| } | 
| printf_filtered ("\n"); | 
| } | 
|  | 
| +/* Parse EXP and show the info about DCACHE.  */ | 
| + | 
| static void | 
| -dcache_info (char *exp, int tty) | 
| +dcache_info_1 (DCACHE *dcache, char *exp) | 
| { | 
| splay_tree_node n; | 
| int i, refcount; | 
| @@ -619,27 +615,27 @@ dcache_info (char *exp, int tty) | 
| return; | 
| } | 
|  | 
| -      dcache_print_line (i); | 
| +      dcache_print_line (dcache, i); | 
| return; | 
| } | 
|  | 
| printf_filtered (_("Dcache %u lines of %u bytes each.\n"), | 
| dcache_size, | 
| -		   last_cache ? (unsigned) last_cache->line_size | 
| +		   dcache ? (unsigned) dcache->line_size | 
| : dcache_line_size); | 
|  | 
| -  if (!last_cache || ptid_equal (last_cache->ptid, null_ptid)) | 
| +  if (dcache == NULL || ptid_equal (dcache->ptid, null_ptid)) | 
| { | 
| printf_filtered (_("No data cache available.\n")); | 
| return; | 
| } | 
|  | 
| printf_filtered (_("Contains data for %s\n"), | 
| -		   target_pid_to_str (last_cache->ptid)); | 
| +		   target_pid_to_str (dcache->ptid)); | 
|  | 
| refcount = 0; | 
|  | 
| -  n = splay_tree_min (last_cache->tree); | 
| +  n = splay_tree_min (dcache->tree); | 
| i = 0; | 
|  | 
| while (n) | 
| @@ -647,17 +643,23 @@ dcache_info (char *exp, int tty) | 
| struct dcache_block *db = (struct dcache_block *) n->value; | 
|  | 
| printf_filtered (_("Line %d: address %s [%d hits]\n"), | 
| -		       i, paddress (target_gdbarch, db->addr), db->refs); | 
| +		       i, paddress (target_gdbarch (), db->addr), db->refs); | 
| i++; | 
| refcount += db->refs; | 
|  | 
| -      n = splay_tree_successor (last_cache->tree, n->key); | 
| +      n = splay_tree_successor (dcache->tree, n->key); | 
| } | 
|  | 
| printf_filtered (_("Cache state: %d active lines, %d hits\n"), i, refcount); | 
| } | 
|  | 
| static void | 
| +dcache_info (char *exp, int tty) | 
| +{ | 
| +  dcache_info_1 (target_dcache_get (), exp); | 
| +} | 
| + | 
| +static void | 
| set_dcache_size (char *args, int from_tty, | 
| struct cmd_list_element *c) | 
| { | 
| @@ -666,8 +668,7 @@ set_dcache_size (char *args, int from_tty, | 
| dcache_size = DCACHE_DEFAULT_SIZE; | 
| error (_("Dcache size must be greater than 0.")); | 
| } | 
| -  if (last_cache) | 
| -    dcache_invalidate (last_cache); | 
| +  target_dcache_invalidate (); | 
| } | 
|  | 
| static void | 
| @@ -681,8 +682,7 @@ set_dcache_line_size (char *args, int from_tty, | 
| dcache_line_size = DCACHE_DEFAULT_LINE_SIZE; | 
| error (_("Invalid dcache line size: %u (must be power of 2)."), d); | 
| } | 
| -  if (last_cache) | 
| -    dcache_invalidate (last_cache); | 
| +  target_dcache_invalidate (); | 
| } | 
|  | 
| static void | 
| @@ -728,20 +728,20 @@ Use this command to set number of lines in dcache and line-size."), | 
| Show dcachesettings."), | 
| &dcache_show_list, "show dcache ", /*allow_unknown*/0, &showlist); | 
|  | 
| -  add_setshow_uinteger_cmd ("line-size", class_obscure, | 
| -			    &dcache_line_size, _("\ | 
| +  add_setshow_zuinteger_cmd ("line-size", class_obscure, | 
| +			     &dcache_line_size, _("\ | 
| Set dcache line size in bytes (must be power of 2)."), _("\ | 
| Show dcache line size."), | 
| -			    NULL, | 
| -			    set_dcache_line_size, | 
| -			    NULL, | 
| -			    &dcache_set_list, &dcache_show_list); | 
| -  add_setshow_uinteger_cmd ("size", class_obscure, | 
| -			    &dcache_size, _("\ | 
| +			     NULL, | 
| +			     set_dcache_line_size, | 
| +			     NULL, | 
| +			     &dcache_set_list, &dcache_show_list); | 
| +  add_setshow_zuinteger_cmd ("size", class_obscure, | 
| +			     &dcache_size, _("\ | 
| Set number of dcache lines."), _("\ | 
| Show number of dcache lines."), | 
| -			    NULL, | 
| -			    set_dcache_size, | 
| -			    NULL, | 
| -			    &dcache_set_list, &dcache_show_list); | 
| +			     NULL, | 
| +			     set_dcache_size, | 
| +			     NULL, | 
| +			     &dcache_set_list, &dcache_show_list); | 
| } | 
|  |