X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdcache.c;h=60caa29077f66c1ab5e534e04fb38c77592dc6ea;hb=6c890568ff69b3a6966b4619515cf27e2177bd74;hp=61e4ed0e9b7e1e5bb51e2290e23260d6cf1c3272;hpb=45993f6118fb8065ed70d448f4e741763cb8fe4d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dcache.c b/gdb/dcache.c index 61e4ed0e9b..60caa29077 100644 --- a/gdb/dcache.c +++ b/gdb/dcache.c @@ -17,12 +17,12 @@ 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 +#include "gdb_string.h" /* @@ -111,8 +111,8 @@ 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,7 +148,24 @@ struct dcache_struct int cache_has_stuff; } ; -int remote_dcache = 1; +static int +dcache_poke_byte PARAMS ((DCACHE *dcache, CORE_ADDR addr, char *ptr)); + +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)); + +int remote_dcache = 0; DCACHE *last_cache; /* Used by info dcache */ @@ -186,11 +203,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 +247,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 +278,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 +289,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 +319,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 +338,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 +359,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 +386,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 +398,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 +429,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); } @@ -533,11 +526,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"); } }