]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/dcache.c
* config/sh/tm-sh.h (BELIEVE_PCC_PROMOTION): Define, so that
[thirdparty/binutils-gdb.git] / gdb / dcache.c
index 61e4ed0e9b7e1e5bb51e2290e23260d6cf1c3272..a97a940a4a68293c35dc94d4b01e8e01d0f545aa 100644 (file)
@@ -1,7 +1,7 @@
 /* Caching code.  Typically used by remote back ends for
    caching remote memory.
 
-   Copyright 1992, 1993, 1995 Free Software Foundation, Inc.
+   Copyright 1992, 1993, 1995, 1998 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "dcache.h"
 #include "gdbcmd.h"
-#include <string.h>
-
+#include "gdb_string.h"
+#include "gdbcore.h"
 
 /* 
    The data cache could lead to incorrect results because it doesn't know
 struct dcache_block
 {
   struct dcache_block *p;      /* next in list */
-  unsigned int addr;           /* Address for which data is recorded.  */
-  unsigned char data[LINE_SIZE]; /* bytes at given address */
+  CORE_ADDR addr;              /* Address for which data is recorded.  */
+  char data[LINE_SIZE];                /* bytes at given address */
   unsigned char state[LINE_SIZE]; /* what state the data is in */
 
   /* whether anything in state is dirty - used to speed up the 
@@ -148,10 +148,28 @@ struct dcache_struct
   int cache_has_stuff;
 } ;
 
-int remote_dcache = 1;
+static int dcache_poke_byte PARAMS ((DCACHE *dcache, CORE_ADDR addr, 
+                                     char *ptr));
 
-DCACHE *last_cache; /* Used by info dcache */
+static int dcache_peek_byte PARAMS ((DCACHE *dcache, CORE_ADDR addr, 
+                                     char *ptr));
+
+static struct dcache_block *dcache_hit PARAMS ((DCACHE *dcache, 
+                                                CORE_ADDR addr));
+
+static int dcache_write_line PARAMS ((DCACHE *dcache,struct dcache_block *db));
+
+static struct dcache_block *dcache_alloc PARAMS ((DCACHE *dcache));
+
+static int dcache_writeback PARAMS ((DCACHE *dcache));
 
+static void dcache_info PARAMS ((char *exp, int tty));
+
+void _initialize_dcache PARAMS ((void));
+
+int remote_dcache = 0;
+
+DCACHE *last_cache; /* Used by info dcache */
 
 
 /* Free all the data cache blocks, thus discarding all cached data.  */
@@ -186,11 +204,11 @@ dcache_flush (dcache)
 
 /* If addr is present in the dcache, return the address of the block
    containing it. */
-static
-struct dcache_block *
+
+static struct dcache_block *
 dcache_hit (dcache, addr)
      DCACHE *dcache;
-     unsigned int addr;
+     CORE_ADDR addr;
 {
   register struct dcache_block *db;
 
@@ -230,22 +248,22 @@ dcache_write_line (dcache, db)
              int len = 0;
              for (e = s ; e < LINE_SIZE; e++, len++)
                if (db->state[e] != ENTRY_DIRTY)
-                 {
-                   /* all bytes from s..s+len-1 need to
-                      be written out */
-                   int done = 0;
-                   while (done < len) {
-                     int t = dcache->write_memory (db->addr + s + done,
-                                                   db->data + s + done,
-                                                   len - done);
-                     if (t == 0)
-                       return 0;
-                     done += t;
-                   }
-                   memset (db->state + s, ENTRY_OK, len);
-                   s = e;
-                   break;
-                 }
+                 break;
+             {
+               /* all bytes from s..s+len-1 need to
+                  be written out */
+               int done = 0;
+               while (done < len) {
+                 int t = dcache->write_memory (db->addr + s + done,
+                                               db->data + s + done,
+                                               len - done);
+                 if (t == 0)
+                   return 0;
+                 done += t;
+               }
+               memset (db->state + s, ENTRY_OK, len);
+               s = e;
+             }
            }
        }
       db->anydirty = 0;
@@ -261,8 +279,8 @@ dcache_write_line (dcache, db)
    prevents errors from creeping in if a memory retrieval is
    interrupted (which used to put garbage blocks in the valid
    list...).  */
-static
-struct dcache_block *
+
+static struct dcache_block *
 dcache_alloc (dcache)
      DCACHE *dcache;
 {
@@ -272,14 +290,14 @@ dcache_alloc (dcache)
     abort ();
 
   /* Take something from the free list */
-  if (db = dcache->free_head)
+  db = dcache->free_head;
+  if (db)
     {
       dcache->free_head = db->p;
     }
-
-  if (!db)
+  else
     {
-      /* Nothing left on free list, so grab on from the valid list */
+      /* Nothing left on free list, so grab one from the valid list */
       db = dcache->valid_head;
       dcache->valid_head = db->p;
 
@@ -302,11 +320,11 @@ dcache_alloc (dcache)
 
    Returns 0 on error. */
 
-int
+static int
 dcache_peek_byte (dcache, addr, ptr)
      DCACHE *dcache;
      CORE_ADDR addr;
-     unsigned char *ptr;
+     char *ptr;
 {
   register struct dcache_block *db = dcache_hit (dcache, addr);
   int ok=1;
@@ -321,13 +339,13 @@ dcache_peek_byte (dcache, addr, ptr)
     else
       db = dcache_alloc (dcache);
       immediate_quit++;
-           db->addr = MASK (addr);
+      db->addr = MASK (addr);
       while (done < LINE_SIZE) 
        {
          int try =
            (*dcache->read_memory)
              (db->addr + done,
-              (unsigned char *) db->data + done,
+              db->data + done,
               LINE_SIZE - done);
          if (try == 0)
            return 0;
@@ -342,28 +360,6 @@ dcache_peek_byte (dcache, addr, ptr)
   return ok;
 }
 
-/* Using the data cache DCACHE return the contents of the word at
-   address ADDR in the remote machine.  
-
-   Returns 0 on error. */
-
-int
-dcache_peek (dcache, addr, data)
-     DCACHE *dcache;
-     CORE_ADDR addr;
-     int *data;
-{
-  unsigned char *dp = (unsigned char *) data;
-  int i;
-  for (i = 0; i < sizeof (int); i++)
-    {
-      if (!dcache_peek_byte (dcache, addr, dp + i))
-       return 0;
-    }
-  return 1;
-}
-
-
 /* Writeback any dirty lines to the remote. */
 static int
 dcache_writeback (dcache)
@@ -391,7 +387,10 @@ dcache_fetch (dcache, addr)
      CORE_ADDR addr;
 {
   int res;
-  dcache_peek (dcache, addr, &res);
+
+  if (dcache_xfer_memory (dcache, addr, (char *)&res, sizeof res, 0) != sizeof res)
+    memory_error (EIO, addr);
+
   return res;
 }
 
@@ -400,7 +399,7 @@ dcache_fetch (dcache, addr)
    Return zero on write error.
  */
 
-int
+static int
 dcache_poke_byte (dcache, addr, ptr)
      DCACHE *dcache;
      CORE_ADDR addr;
@@ -431,15 +430,10 @@ dcache_poke (dcache, addr, data)
      CORE_ADDR addr;
      int data;
 {
-  unsigned char *dp = (unsigned char *) (&data);
-  int i;
-  for (i = 0; i < sizeof (int); i++)
-    {
-      if (!dcache_poke_byte (dcache, addr, dp + i))
-       return 0;
-    }
-  dcache_writeback (dcache);
-  return 1;
+  if (dcache_xfer_memory (dcache, addr, (char *)&data, sizeof data, 1) != sizeof data)
+    return 0;
+
+  return dcache_writeback (dcache);
 }
 
 
@@ -485,8 +479,8 @@ dcache_xfer_memory (dcache, memaddr, myaddr, len, should_write)
 
   if (remote_dcache) 
     {
-      int (*xfunc) ()
-       = should_write ? dcache_poke_byte : dcache_peek_byte;
+      int (*xfunc) PARAMS ((DCACHE *dcache, CORE_ADDR addr, char *ptr));
+      xfunc = should_write ? dcache_poke_byte : dcache_peek_byte;
 
       for (i = 0; i < len; i++)
        {
@@ -498,8 +492,8 @@ dcache_xfer_memory (dcache, memaddr, myaddr, len, should_write)
     }
   else 
     {
-      int (*xfunc) () 
-       = should_write ? dcache->write_memory : dcache->read_memory;
+      memxferfunc xfunc;
+      xfunc = should_write ? dcache->write_memory : dcache->read_memory;
 
       if (dcache->cache_has_stuff)
        dcache_flush (dcache);
@@ -533,11 +527,11 @@ dcache_info (exp, tty)
                       p->addr, p->refs);
 
       for (j = 0; j < LINE_SIZE; j++)
-       printf_filtered ("%02x", p->data[j]);
+       printf_filtered ("%02x", p->data[j] & 0xFF);
       printf_filtered ("\n");
 
       for (j = 0; j < LINE_SIZE; j++)
-       printf_filtered ("2x", p->state[j]);
+       printf_filtered (" %2x", p->state[j]);
       printf_filtered ("\n");
     }
 }