X86: Fix how the TLB handles the storecheck flag.
authorGabe Black <gblack@eecs.umich.edu>
Sun, 19 Apr 2009 11:57:51 +0000 (04:57 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Sun, 19 Apr 2009 11:57:51 +0000 (04:57 -0700)
src/arch/x86/tlb.cc

index 330a8682b4a29c33d00361c66d7e1d2ec5eb2c9f..9b4a397ee9eed17b516382f184e342e704f5ce68 100644 (file)
@@ -197,9 +197,6 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,
 
     int seg = flags & SegmentFlagMask;
 
-    //XXX Junk code to surpress the warning
-    if (storeCheck);
-
     // If this is true, we're dealing with a request to read an internal
     // value.
     if (seg == SEGMENT_REG_MS) {
@@ -579,7 +576,7 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,
             bool expandDown = false;
             SegAttr attr = tc->readMiscRegNoEffect(MISCREG_SEG_ATTR(seg));
             if (seg >= SEGMENT_REG_ES && seg <= SEGMENT_REG_HS) {
-                if (!attr.writable && mode == Write)
+                if (!attr.writable && (mode == Write || storeCheck))
                     return new GeneralProtection(0);
                 if (!attr.readable && mode == Read)
                     return new GeneralProtection(0);
@@ -655,6 +652,11 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,
                 // fine even though we're not checking them.
                 return new PageFault(vaddr, true, mode, inUser, false);
             }
+            if (storeCheck && !entry->writable) {
+                // This would fault if this were a write, so return a page
+                // fault that reflects that happening.
+                return new PageFault(vaddr, true, Write, inUser, false);
+            }
 
 
             DPRINTF(TLB, "Entry found with paddr %#x, "