arch: Add support for invalidating TLBs when draining
authorAndreas Sandberg <Andreas.Sandberg@arm.com>
Mon, 7 Jan 2013 18:05:40 +0000 (13:05 -0500)
committerAndreas Sandberg <Andreas.Sandberg@arm.com>
Mon, 7 Jan 2013 18:05:40 +0000 (13:05 -0500)
This patch adds support for the memInvalidate() drain method.  TLB
flushing is requested by calling the virtual flushAll() method on the
TLB.

Note: This patch renames invalidateAll() to flushAll() on x86 and
SPARC to make the interface consistent across all supported
architectures.

src/arch/sparc/tlb.cc
src/arch/sparc/tlb.hh
src/arch/x86/isa.cc
src/arch/x86/tlb.cc
src/arch/x86/tlb.hh
src/arch/x86/utility.cc
src/sim/tlb.hh

index 9faf297d6b07ec358dde7b5c55f44e818277963a..5d6dfe2c3886d8f3279450b5a603ec9e19d28e29 100644 (file)
@@ -323,7 +323,7 @@ TLB::demapAll(int partition_id)
 }
 
 void
-TLB::invalidateAll()
+TLB::flushAll()
 {
     cacheValid = false;
     lookupTable.clear();
index abbe2df3c322d46054bf0e62fd6abb8d4bfcb6ed..8ed10ff0e66dcfe7cf9a4a668c5279d48b130cca 100644 (file)
@@ -123,7 +123,7 @@ class TLB : public BaseTLB
     uint64_t TagRead(int entry);
 
     /** Remove all entries from the TLB */
-    void invalidateAll();
+    void flushAll();
 
     /** Remove all non-locked entries from the tlb that match partition id. */
     void demapAll(int partition_id);
index 9dbab8c7eb1032be37ebef09b43684cecedf3422..852ce6bc8120f87099cd25264751855d67301978 100644 (file)
@@ -191,8 +191,8 @@ ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc)
                 }
             }
             if (toggled.pg) {
-                tc->getITBPtr()->invalidateAll();
-                tc->getDTBPtr()->invalidateAll();
+                tc->getITBPtr()->flushAll();
+                tc->getDTBPtr()->flushAll();
             }
             //This must always be 1.
             newCR0.et = 1;
@@ -208,15 +208,15 @@ ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc)
       case MISCREG_CR2:
         break;
       case MISCREG_CR3:
-        tc->getITBPtr()->invalidateNonGlobal();
-        tc->getDTBPtr()->invalidateNonGlobal();
+        tc->getITBPtr()->flushNonGlobal();
+        tc->getDTBPtr()->flushNonGlobal();
         break;
       case MISCREG_CR4:
         {
             CR4 toggled = regVal[miscReg] ^ val;
             if (toggled.pae || toggled.pse || toggled.pge) {
-                tc->getITBPtr()->invalidateAll();
-                tc->getDTBPtr()->invalidateAll();
+                tc->getITBPtr()->flushAll();
+                tc->getDTBPtr()->flushAll();
             }
         }
         break;
index fb7dac02e1a4a5a879b508cb8083c63abe840f5a..33de0129ae4339d670909ee14adc7b0d700a052d 100644 (file)
@@ -129,7 +129,7 @@ TLB::lookup(Addr va, bool update_lru)
 }
 
 void
-TLB::invalidateAll()
+TLB::flushAll()
 {
     DPRINTF(TLB, "Invalidating all entries.\n");
     for (unsigned i = 0; i < size; i++) {
@@ -148,7 +148,7 @@ TLB::setConfigAddress(uint32_t addr)
 }
 
 void
-TLB::invalidateNonGlobal()
+TLB::flushNonGlobal()
 {
     DPRINTF(TLB, "Invalidating all non global entries.\n");
     for (unsigned i = 0; i < size; i++) {
index 85bcead572b317d1a26cf66f81061d9491680f6b..39ae240af62e0435ab590ba687e281367d39764d 100644 (file)
@@ -75,8 +75,6 @@ namespace X86ISA
         typedef X86TLBParams Params;
         TLB(const Params *p);
 
-        void dumpAll();
-
         TlbEntry *lookup(Addr va, bool update_lru = true);
 
         void setConfigAddress(uint32_t addr);
@@ -90,9 +88,9 @@ namespace X86ISA
       public:
         Walker *getWalker();
 
-        void invalidateAll();
+        void flushAll();
 
-        void invalidateNonGlobal();
+        void flushNonGlobal();
 
         void demapPage(Addr va, uint64_t asn);
 
index 65c1a9d32a3cebef83d295b8fd6f27ef31232f06..e56e96b998b72611ddcdccecb8a6673388ab9e68 100644 (file)
@@ -213,8 +213,8 @@ copyMiscRegs(ThreadContext *src, ThreadContext *dest)
         dest->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i));
     }
 
-    dest->getITBPtr()->invalidateAll();
-    dest->getDTBPtr()->invalidateAll();
+    dest->getITBPtr()->flushAll();
+    dest->getDTBPtr()->flushAll();
 }
 
 void
index aadf047bf76b47b55a115fc3397eddcdf28d3709..95a252e16fb2355cb728e210e3a06899a180e010 100644 (file)
@@ -64,6 +64,11 @@ class BaseTLB : public SimObject
   public:
     virtual void demapPage(Addr vaddr, uint64_t asn) = 0;
 
+    /**
+     * Remove all entries from the TLB
+     */
+    virtual void flushAll() = 0;
+
     /**
      * Get the table walker master port if present. This is used for
      * migrating port connections during a CPU takeOverFrom()
@@ -75,6 +80,8 @@ class BaseTLB : public SimObject
      */
     virtual BaseMasterPort* getMasterPort() { return NULL; }
 
+    void memInvalidate() { flushAll(); }
+
     class Translation
     {
       public: