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 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/50762 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Matthew Poremba <matthew.poremba@amd.com> Maintainer: Gabe Black <gabe.black@gmail.com>
This commit is contained in:
@@ -168,6 +168,20 @@ EmulationPageTable::translate(const RequestPtr &req)
|
||||
return NoFault;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
|
||||
@@ -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 @@ class EmulationPageTable : public Serializable
|
||||
* @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
|
||||
|
||||
Reference in New Issue
Block a user