From 562efe214c35c0d40c810a11e94cc6e08c32dda5 Mon Sep 17 00:00:00 2001
From: Ron Dreslinski <rdreslin@umich.edu>
Date: Tue, 21 Feb 2006 02:15:02 -0500
Subject: Adding some definitons for read/write blob/string.  I need to locate
 te code stever wrote to break up address ranges into blk/page size chunks.

cpu/simple/cpu.cc:
cpu/simple/cpu.hh:
    Add read/write blob definitions, still need to break it up into blk size chunks (where was the code stever wrote for that?)
mem/physical.hh:
    Remove un-needed function (I think)
mem/port.hh:
    Default these virtual functions to panic unimplented
mem/translating_port.cc:
    Again handling read/write string properly.

    Need the stever code to break things into page size chunks yet
mem/translating_port.hh:
    Having trouble with the const declerator.  I will need to read how it works, for now it compiles if I remove it.

--HG--
extra : convert_revision : f174e06700daa9967958d18e01798270c90d6dac
---
 mem/translating_port.cc | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)

(limited to 'mem/translating_port.cc')

diff --git a/mem/translating_port.cc b/mem/translating_port.cc
index 11004769e..ef4ed83d0 100644
--- a/mem/translating_port.cc
+++ b/mem/translating_port.cc
@@ -55,7 +55,7 @@ TranslatingPort::readBlobFunctional(Addr addr, uint8_t *p, int size)
 }
 
 Fault
-TranslatingPort::writeBlobFunctional(Addr addr, const uint8_t *p, int size)
+TranslatingPort::writeBlobFunctional(Addr addr, uint8_t *p, int size)
 {
     Addr paddr;
 
@@ -75,6 +75,7 @@ TranslatingPort::memsetBlobFunctional(Addr addr, uint8_t val, int size)
     Addr paddr;
 
     //@todo Break up things larger than a page size
+    //Use the Stever breakup code
     pTable->page_check(addr, size);
 
     if (!pTable->translate(addr,paddr))
@@ -87,33 +88,38 @@ TranslatingPort::memsetBlobFunctional(Addr addr, uint8_t val, int size)
 Fault
 TranslatingPort::writeStringFunctional(Addr addr, const char *str)
 {
-    //@todo Break up things larger than a page size
-    //pTable->page_check(addr, size);
-    //Need to check string length???
+    Addr paddr,vaddr;
+    uint8_t c;
 
-    Addr paddr;
+    vaddr = addr;
 
-    if (!pTable->translate(addr,paddr))
-        return Machine_Check_Fault;
+    do {
+        c = *str++;
+        if (!pTable->translate(vaddr++,paddr))
+            return Machine_Check_Fault;
+
+        port->writeBlobFunctional(paddr, &c, 1);
+    } while (c);
 
-    port->writeStringFunctional(paddr, str);
     return No_Fault;
 }
 
 Fault
 TranslatingPort::readStringFunctional(std::string &str, Addr addr)
 {
-    //@todo Break up things larger than a page size
-    //pTable->page_check(addr, size);
-    //Need to check string length???
+    Addr paddr,vaddr;
+    uint8_t c;
 
-    Addr paddr;
+    vaddr = addr;
 
-    if (!pTable->translate(addr,paddr))
-        return Machine_Check_Fault;
+    do {
+        if (!pTable->translate(vaddr++,paddr))
+            return Machine_Check_Fault;
+
+        port->readBlobFunctional(paddr, &c, 1);
+        str += c;
+    } while (c);
 
-    //@todo Break this up into readBlobs
-    port->readStringFunctional(str, paddr);
     return No_Fault;
 }
 
-- 
cgit v1.2.3