Power ISA: Add an alignment fault to Power ISA and check alignment in TLB.
authorTimothy M. Jones <tjones1@inf.ed.ac.uk>
Fri, 12 Feb 2010 19:53:19 +0000 (19:53 +0000)
committerTimothy M. Jones <tjones1@inf.ed.ac.uk>
Fri, 12 Feb 2010 19:53:19 +0000 (19:53 +0000)
src/arch/power/faults.hh
src/arch/power/tlb.cc
src/arch/power/tlb.hh

index eadcb79006ac5cef3e4c0b7ba5a421f6a757bcc1..0f49cc85d3bf2023ba2212e996037770212875bf 100644 (file)
@@ -76,6 +76,22 @@ class MachineCheckFault : public PowerFault
 };
 
 
+class AlignmentFault : public PowerFault
+{
+  public:
+    AlignmentFault()
+        : PowerFault("Alignment")
+    {
+    }
+
+    bool
+    isAlignmentFault() const
+    {
+        return true;
+    }
+};
+
+
 static inline Fault
 genMachineCheckFault()
 {
index 125c92a1a85fe5ef3294ca7b8837d3167378c708..292f13078697349f790e466f7ff462d26612230d 100644 (file)
@@ -281,9 +281,27 @@ TLB::regStats()
 }
 
 Fault
-TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode)
+TLB::translateInst(RequestPtr req, ThreadContext *tc)
+{
+    // Instruction accesses must be word-aligned
+    if (req->getVaddr() & 0x3) {
+        DPRINTF(TLB, "Alignment Fault on %#x, size = %d\n", req->getVaddr(),
+                req->getSize());
+        return new AlignmentFault();
+    }
+
+     Process * p = tc->getProcessPtr();
+
+     Fault fault = p->pTable->translate(req);
+    if (fault != NoFault)
+        return fault;
+
+    return NoFault;
+}
+
+Fault
+TLB::translateData(RequestPtr req, ThreadContext *tc, bool write)
 {
-#if !FULL_SYSTEM
     Process * p = tc->getProcessPtr();
 
     Fault fault = p->pTable->translate(req);
@@ -291,6 +309,16 @@ TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode)
         return fault;
 
     return NoFault;
+}
+
+Fault
+TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode)
+{
+#if !FULL_SYSTEM
+    if (mode == Execute)
+        return translateInst(req, tc);
+    else
+        return translateData(req, tc, mode == Write);
 #else
   fatal("translate atomic not yet implemented\n");
 #endif
index 8b6c7233da58b6e881b13ee270d585ee570e33cf..1794de62642b2b24c5c46559304d1c550ec82d30 100644 (file)
@@ -156,6 +156,8 @@ class TLB : public BaseTLB
     // static helper functions... really
     static bool validVirtualAddress(Addr vaddr);
     static Fault checkCacheability(RequestPtr &req);
+    Fault translateInst(RequestPtr req, ThreadContext *tc);
+    Fault translateData(RequestPtr req, ThreadContext *tc, bool write);
     Fault translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode);
     void translateTiming(RequestPtr req, ThreadContext *tc,
                          Translation *translation, Mode mode);