Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/50762 )

Change subject: mem: Add a translation generator function to EmulationPageTable.
......................................................................

mem: Add a translation generator function to EmulationPageTable.

This lets the caller iterate over translated address ranges over the
requested total virtual address region.

Change-Id: I50bd59bdbb12c055fa9ace9b1d5ff972e382cb85
---
M src/mem/page_table.cc
M src/mem/page_table.hh
2 files changed, 41 insertions(+), 1 deletion(-)



diff --git a/src/mem/page_table.cc b/src/mem/page_table.cc
index 57707a5..d715e07 100644
--- a/src/mem/page_table.cc
+++ b/src/mem/page_table.cc
@@ -169,6 +169,20 @@
 }

 void
+EmulationPageTable::PageTableTranslationGen::translate(Range &range) const
+{
+    const Addr page_size = pt->pageSize();
+
+    Addr next = roundUp(range.vaddr, page_size);
+    if (next == range.vaddr)
+        next += page_size;
+    range.size = std::min(range.size, next - range.vaddr);
+
+    if (!pt->translate(range.vaddr, range.paddr))
+        range.fault = Fault(new GenericPageTableFault(range.vaddr));
+}
+
+void
 EmulationPageTable::serialize(CheckpointOut &cp) const
 {
     ScopedCheckpointSection sec(cp, "ptable");
diff --git a/src/mem/page_table.hh b/src/mem/page_table.hh
index c115a41..a17250c 100644
--- a/src/mem/page_table.hh
+++ b/src/mem/page_table.hh
@@ -42,6 +42,7 @@
 #include "base/intmath.hh"
 #include "base/types.hh"
 #include "mem/request.hh"
+#include "mem/translation_gen.hh"
 #include "sim/serialize.hh"

 namespace gem5
@@ -153,7 +154,32 @@
      * @param vaddr The virtual address.
      * @return True if translation exists
      */
- bool translate(Addr vaddr) { Addr dummy; return translate(vaddr, dummy); }
+    bool
+    translate(Addr vaddr)
+    {
+        Addr dummy;
+        return translate(vaddr, dummy);
+    }
+
+    class PageTableTranslationGen : public TranslationGen
+    {
+      private:
+        EmulationPageTable *pt;
+
+        void translate(Range &range) const override;
+
+      public:
+        PageTableTranslationGen(EmulationPageTable *_pt, Addr vaddr,
+                Addr size) : TranslationGen(vaddr, size), pt(_pt)
+        {}
+    };
+
+    TranslationGenPtr
+    translateRange(Addr vaddr, Addr size)
+    {
+        return TranslationGenPtr(
+                new PageTableTranslationGen(this, vaddr, size));
+    }

     /**
      * Perform a translation on the memory request, fills in paddr

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/50762
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I50bd59bdbb12c055fa9ace9b1d5ff972e382cb85
Gerrit-Change-Number: 50762
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to