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