Fix TranslatingPort access functions to:
authorSteve Reinhardt <stever@eecs.umich.edu>
Sun, 12 Mar 2006 05:40:29 +0000 (00:40 -0500)
committerSteve Reinhardt <stever@eecs.umich.edu>
Sun, 12 Mar 2006 05:40:29 +0000 (00:40 -0500)
- know nothing about Fault objects (as it should be)
- call fatal() by default on accesses to unmapped addrs
- provide "try" versions for callers that are prepared to handle failure

mem/translating_port.cc:
mem/translating_port.hh:
    Memory system objects should not return Fault objects, just errors.
    Half the time we don't check the return code anyway, so make
    default version of the access functions call fatal().
    Provide "try*" versions that return a bool for places where we
    really are going to check the return code.
sim/syscall_emul.cc:
sim/syscall_emul.hh:
    Need to use new "tryReadString" here since we actually check the return code.

--HG--
extra : convert_revision : 039737398ef183904dc382c05912ab96cd1d4a51

mem/translating_port.cc
mem/translating_port.hh
sim/syscall_emul.cc
sim/syscall_emul.hh

index 42101dad08fb9640fedf9de06afc1a01df8a23ed..a3bf1baa79ec5d10abfdef8911c4c15ebd87cd79 100644 (file)
@@ -27,7 +27,6 @@
  */
 
 #include <string>
-#include "arch/faults.hh"
 #include "base/chunk_generator.hh"
 #include "mem/port.hh"
 #include "mem/translating_port.hh"
@@ -42,8 +41,8 @@ TranslatingPort::TranslatingPort(Port *_port, PageTable *p_table)
 TranslatingPort::~TranslatingPort()
 { }
 
-Fault
-TranslatingPort::readBlobFunctional(Addr addr, uint8_t *p, int size)
+bool
+TranslatingPort::tryReadBlobFunctional(Addr addr, uint8_t *p, int size)
 {
     Addr paddr;
     int prevSize = 0;
@@ -51,19 +50,28 @@ TranslatingPort::readBlobFunctional(Addr addr, uint8_t *p, int size)
     for (ChunkGenerator gen(addr, size, VMPageSize); !gen.done(); gen.next()) {
 
         if (!pTable->translate(gen.addr(),paddr))
-            return genMachineCheckFault();
+            return false;
 
         port->readBlobFunctional(paddr, p + prevSize, gen.size());
         prevSize += gen.size();
     }
 
-    return NoFault;
+    return true;
 }
 
-Fault
-TranslatingPort::writeBlobFunctional(Addr addr, uint8_t *p, int size,
-                                     bool alloc)
+void
+TranslatingPort::readBlobFunctional(Addr addr, uint8_t *p, int size)
+{
+    if (!tryReadBlobFunctional(addr, p, size))
+        fatal("readBlobFunctional(0x%x, ...) failed", addr);
+}
+
+
+bool
+TranslatingPort::tryWriteBlobFunctional(Addr addr, uint8_t *p, int size,
+                                        bool alloc)
 {
+
     Addr paddr;
     int prevSize = 0;
 
@@ -75,7 +83,7 @@ TranslatingPort::writeBlobFunctional(Addr addr, uint8_t *p, int size,
                                  VMPageSize);
                 pTable->translate(gen.addr(), paddr);
             } else {
-                return genMachineCheckFault();
+                return false;
             }
         }
 
@@ -83,13 +91,21 @@ TranslatingPort::writeBlobFunctional(Addr addr, uint8_t *p, int size,
         prevSize += gen.size();
     }
 
-    return NoFault;
+    return true;
 }
 
 
-Fault
-TranslatingPort::memsetBlobFunctional(Addr addr, uint8_t val, int size,
-                                      bool alloc)
+void
+TranslatingPort::writeBlobFunctional(Addr addr, uint8_t *p, int size,
+                                     bool alloc)
+{
+    if (!tryWriteBlobFunctional(addr, p, size, alloc))
+        fatal("writeBlobFunctional(0x%x, ...) failed", addr);
+}
+
+bool
+TranslatingPort::tryMemsetBlobFunctional(Addr addr, uint8_t val, int size,
+                                         bool alloc)
 {
     Addr paddr;
 
@@ -101,19 +117,27 @@ TranslatingPort::memsetBlobFunctional(Addr addr, uint8_t val, int size,
                                  VMPageSize);
                 pTable->translate(gen.addr(), paddr);
             } else {
-                return genMachineCheckFault();
+                return false;
             }
         }
 
         port->memsetBlobFunctional(paddr, val, gen.size());
     }
 
-    return NoFault;
+    return true;
 }
 
+void
+TranslatingPort::memsetBlobFunctional(Addr addr, uint8_t val, int size,
+                                      bool alloc)
+{
+    if (!tryMemsetBlobFunctional(addr, val, size, alloc))
+        fatal("memsetBlobFunctional(0x%x, ...) failed", addr);
+}
 
-Fault
-TranslatingPort::writeStringFunctional(Addr addr, const char *str)
+
+bool
+TranslatingPort::tryWriteStringFunctional(Addr addr, const char *str)
 {
     Addr paddr,vaddr;
     uint8_t c;
@@ -123,16 +147,23 @@ TranslatingPort::writeStringFunctional(Addr addr, const char *str)
     do {
         c = *str++;
         if (!pTable->translate(vaddr++,paddr))
-            return genMachineCheckFault();
+            return false;
 
         port->writeBlobFunctional(paddr, &c, 1);
     } while (c);
 
-    return NoFault;
+    return true;
 }
 
-Fault
-TranslatingPort::readStringFunctional(std::string &str, Addr addr)
+void
+TranslatingPort::writeStringFunctional(Addr addr, const char *str)
+{
+    if (!tryWriteStringFunctional(addr, str))
+        fatal("writeStringFunctional(0x%x, ...) failed", addr);
+}
+
+bool
+TranslatingPort::tryReadStringFunctional(std::string &str, Addr addr)
 {
     Addr paddr,vaddr;
     uint8_t c;
@@ -141,12 +172,19 @@ TranslatingPort::readStringFunctional(std::string &str, Addr addr)
 
     do {
         if (!pTable->translate(vaddr++,paddr))
-            return genMachineCheckFault();
+            return false;
 
         port->readBlobFunctional(paddr, &c, 1);
         str += c;
     } while (c);
 
-    return NoFault;
+    return true;
+}
+
+void
+TranslatingPort::readStringFunctional(std::string &str, Addr addr)
+{
+    if (!tryReadStringFunctional(str, addr))
+        fatal("readStringFunctional(0x%x, ...) failed", addr);
 }
 
index 1a334c103991a4535abc6cebdc3e40d45903e20a..eaecff35a45fc8e39c95ae0cf1b52fc305af0c94 100644 (file)
@@ -48,14 +48,21 @@ class TranslatingPort
     virtual ~TranslatingPort();
 
   public:
-    Fault readBlobFunctional(Addr addr, uint8_t *p, int size);
-    Fault writeBlobFunctional(Addr addr, uint8_t *p, int size,
-                              bool alloc = false);
-    Fault memsetBlobFunctional(Addr addr, uint8_t val, int size,
-                               bool alloc = false);
-    Fault writeStringFunctional(Addr addr, const char *str);
-    Fault readStringFunctional(std::string &str, Addr addr);
+    bool tryReadBlobFunctional(Addr addr, uint8_t *p, int size);
+    bool tryWriteBlobFunctional(Addr addr, uint8_t *p, int size,
+                                bool alloc = false);
+    bool tryMemsetBlobFunctional(Addr addr, uint8_t val, int size,
+                                 bool alloc = false);
+    bool tryWriteStringFunctional(Addr addr, const char *str);
+    bool tryReadStringFunctional(std::string &str, Addr addr);
 
+    void readBlobFunctional(Addr addr, uint8_t *p, int size);
+    void writeBlobFunctional(Addr addr, uint8_t *p, int size,
+                             bool alloc = false);
+    void memsetBlobFunctional(Addr addr, uint8_t val, int size,
+                              bool alloc = false);
+    void writeStringFunctional(Addr addr, const char *str);
+    void readStringFunctional(std::string &str, Addr addr);
 };
 
 #endif
index 8fc8dc0b9b36e2658e8ca0ca2b51ad8dbf6a4b76..6c24b6dc5c2eb37cc82c198e348c20658ec18a2e 100644 (file)
@@ -193,7 +193,7 @@ unlinkFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
         return (TheISA::IntReg)-EFAULT;
 
     int result = unlink(path.c_str());
@@ -205,12 +205,12 @@ renameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string old_name;
 
-    if (xc->getMemPort()->readStringFunctional(old_name, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(old_name, xc->getSyscallArg(0)))
         return -EFAULT;
 
     string new_name;
 
-    if (xc->getMemPort()->readStringFunctional(new_name, xc->getSyscallArg(1)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(new_name, xc->getSyscallArg(1)))
         return -EFAULT;
 
     int64_t result = rename(old_name.c_str(), new_name.c_str());
@@ -222,7 +222,7 @@ truncateFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
         return -EFAULT;
 
     off_t length = xc->getSyscallArg(1);
@@ -250,7 +250,7 @@ chownFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
         return -EFAULT;
 
     /* XXX endianess */
index 8eacf9200451cb4b97623b5e0c4d75edc37eb0a1..60e06b294ac6f0b68f23ad7ee5cd2db450922ed4 100644 (file)
@@ -370,7 +370,7 @@ openFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
         return -EFAULT;
 
     if (path == "/dev/sysdev0") {
@@ -417,7 +417,7 @@ chmodFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
         return -EFAULT;
 
     uint32_t mode = xc->getSyscallArg(1);
@@ -470,7 +470,7 @@ statFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
     return -EFAULT;
 
     struct stat hostBuf;
@@ -522,7 +522,7 @@ lstatFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
       return -EFAULT;
 
     struct stat hostBuf;
@@ -544,7 +544,7 @@ lstat64Func(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
       return -EFAULT;
 
 #if BSD_HOST
@@ -596,7 +596,7 @@ statfsFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
       return -EFAULT;
 
     struct statfs hostBuf;
@@ -770,7 +770,7 @@ utimesFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-    if (xc->getMemPort()->readStringFunctional(path, xc->getSyscallArg(0)) != NoFault)
+    if (!xc->getMemPort()->tryReadStringFunctional(path, xc->getSyscallArg(0)))
       return -EFAULT;
 
     TypedBufferArg<typename OS::timeval [2]> tp(xc->getSyscallArg(1));