diff options
Diffstat (limited to 'gdb/dcache.c')
-rw-r--r-- | gdb/dcache.c | 67 |
1 files changed, 56 insertions, 11 deletions
diff --git a/gdb/dcache.c b/gdb/dcache.c index 864b068..1b477b0 100644 --- a/gdb/dcache.c +++ b/gdb/dcache.c @@ -21,10 +21,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defs.h" #include "dcache.h" +#include "gdbcmd.h" extern int insque(); extern int remque(); +int remote_dcache = 0; + /* The data cache records all the data read from the remote machine since the last time it stopped. @@ -41,17 +44,21 @@ dcache_flush (dcache) { register struct dcache_block *db; - while ((db = dcache->dcache_valid.next) != &dcache->dcache_valid) - { - remque (db); - insque (db, &dcache->dcache_free); - } + if (remote_dcache > 0) + while ((db = dcache->dcache_valid.next) != &dcache->dcache_valid) + { + remque (db); + insque (db, &dcache->dcache_free); + } + + return; } /* * If addr is present in the dcache, return the address of the block * containing it. */ +static struct dcache_block * dcache_hit (dcache, addr) DCACHE *dcache; @@ -59,7 +66,8 @@ dcache_hit (dcache, addr) { register struct dcache_block *db; - if (addr & 3) + if (addr & 3 + || remote_dcache == 0) abort (); /* Search all cache blocks for one that is at this address. */ @@ -70,16 +78,19 @@ dcache_hit (dcache, addr) return db; db = db->next; } + return NULL; } /* Return the int data at address ADDR in dcache block DC. */ +static int dcache_value (db, addr) struct dcache_block *db; unsigned int addr; { - if (addr & 3) + if (addr & 3 + || remote_dcache == 0) abort (); return (db->data[XFORM (addr)]); } @@ -91,12 +102,16 @@ dcache_value (db, addr) 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 * dcache_alloc (dcache) DCACHE *dcache; { register struct dcache_block *db; + if (remote_dcache == 0) + abort(); + if ((db = dcache->dcache_free.next) == &dcache->dcache_free) { /* If we can't get one from the free list, take last valid and put @@ -111,8 +126,8 @@ dcache_alloc (dcache) return (db); } -/* Return the contents of the word at address ADDR in the remote machine, - using the data cache. */ +/* Using the data cache DCACHE return the contents of the word at + address ADDR in the remote machine. */ int dcache_fetch (dcache, addr) DCACHE *dcache; @@ -120,6 +135,14 @@ dcache_fetch (dcache, addr) { register struct dcache_block *db; + if (remote_dcache == 0) + { + int i; + + (*dcache->read_memory) (addr, (unsigned char *) &i, 4); + return(i); + } + db = dcache_hit (dcache, addr); if (db == 0) { @@ -143,6 +166,12 @@ dcache_poke (dcache, addr, data) { register struct dcache_block *db; + if (remote_dcache == 0) + { + (*dcache->write_memory) (addr, (unsigned char *) &data, 4); + return; + } + /* First make sure the word is IN the cache. DB is its cache block. */ db = dcache_hit (dcache, addr); if (db == 0) @@ -152,8 +181,8 @@ dcache_poke (dcache, addr, data) (*dcache->write_memory) (addr & ~LINE_SIZE_MASK, (unsigned char *) db->data, LINE_SIZE); immediate_quit--; db->addr = addr & ~LINE_SIZE_MASK; - remque (db); /* Off the free list */ - insque (db, &dcache->dcache_valid); /* On the valid list */ + remque (db); /* Off the free list */ + insque (db, &dcache->dcache_valid); /* On the valid list */ } /* Modify the word in the cache. */ @@ -188,3 +217,19 @@ dcache_init (reading, writing) return(dcache); } +void +_initialitize_dcache () +{ + add_show_from_set + (add_set_cmd ("remotecache", class_support, var_boolean, + (char *) &remote_dcache, + "\ +Set cache use for remote targets.\n\ +When on, use data caching for remote targets. For many remote targets\n\ +this option can offer better throughput for reading target memory.\n\ +Unfortunately, gdb does not currently know anything about volatile\n\ +registers and thus data caching will produce incorrect results with\n\ +volatile registers are in use. By default, this option is off.", + &setlist), + &showlist); +} |