36 #ifndef __MEM_MULTI_LEVEL_PAGE_TABLE_HH__ 37 #define __MEM_MULTI_LEVEL_PAGE_TABLE_HH__ 104 template <
class First,
class ...Rest>
110 p.
memsetBlob(addr, 0, First::tableSize() * pageSize);
114 template <
class ...Types>
117 template <
class First,
class Second,
class ...Rest>
118 struct LastType<First, Second, Rest...>
120 typedef typename LastType<Second, Rest...>
::type type;
123 template <
class Only>
124 struct LastType<Only>
130 template <
class ...Types>
133 template <
class Final,
class Only>
134 struct WalkWrapper<Final, Only>
138 bool allocate, Final *entry)
140 entry->read(system->
physProxy, table, vaddr);
144 template <
class Final,
class First,
class Second,
class ...Rest>
145 struct WalkWrapper<Final, First, Second, Rest...>
149 bool allocate, Final *entry)
152 first.read(system->
physProxy, table, vaddr);
155 if (!first.present()) {
157 "Page fault while walking the page table.");
158 next = prepTopTable<Second>(
system, pageSize);
160 first.write(system->physProxy);
162 next = first.paddr();
164 WalkWrapper<Final, Second, Rest...>::walk(
165 system, pageSize, next, vaddr, allocate, entry);
169 template <
class ...EntryTypes>
174 WalkWrapper<
typename LastType<EntryTypes...>
::type, EntryTypes...>::walk(
175 system, pageSize, table, vaddr, allocate, entry);
181 template <
class ...EntryTypes>
210 _basePtr = prepTopTable<EntryTypes...>(
system, pageSize);
216 map(
Addr vaddr,
Addr paddr, int64_t size, uint64_t flags = 0)
override 223 walk<EntryTypes...>(
system, pageSize, _basePtr,
224 vaddr +
offset,
true, &entry);
226 entry.reset(paddr + offset,
true, flags & Uncacheable,
230 DPRINTF(MMU,
"New mapping: %#x-%#x\n",
231 vaddr + offset, paddr + offset);
240 Final old_entry, new_entry;
244 walk<EntryTypes...>(
system, pageSize, _basePtr, vaddr +
offset,
246 old_entry.present(
false);
250 walk<EntryTypes...>(
system, pageSize, _basePtr, new_vaddr +
offset,
252 new_entry.reset(old_entry.paddr(),
true, old_entry.uncacheable(),
253 old_entry.readonly());
266 walk<EntryTypes...>(
system, pageSize, _basePtr,
267 vaddr +
offset,
false, &entry);
269 "PageTable::unmap: Address %#x not mapped.",
vaddr);
270 entry.present(
false);
272 DPRINTF(MMU,
"Unmapping: %#x\n", vaddr);
284 paramOut(cp,
"ptable.pointer", _basePtr);
291 paramIn(cp,
"ptable.pointer", _basePtr);
294 #endif // __MEM_MULTI_LEVEL_PAGE_TABLE_HH__
virtual void remap(Addr vaddr, int64_t size, Addr new_vaddr)
virtual void map(Addr vaddr, Addr paddr, int64_t size, uint64_t flags=0)
Maps a virtual memory region to a physical memory region.
MultiLevelPageTable(const std::string &__name, uint64_t _pid, System *_sys, Addr pageSize)
void unserialize(CheckpointIn &cp) override
Unserialize an object.
void remap(Addr vaddr, int64_t size, Addr new_vaddr) override
void unmap(Addr vaddr, int64_t size) override
Addr allocPhysPages(int npages)
Allocate npages contiguous unused physical pages.
LastType< EntryTypes... >::type Final
PortProxy physProxy
Port to physical memory used for writing object files into ram at boot.
Addr _basePtr
Physical address to the last level of the page table.
void memsetBlob(Addr addr, uint8_t v, int size) const
Same as tryMemsetBlob, but insists on success.
void paramOut(CheckpointOut &cp, const string &name, ExtMachInst const &machInst)
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
void map(Addr vaddr, Addr paddr, int64_t size, uint64_t flags=0) override
Maps a virtual memory region to a physical memory region.
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,16,32,64}_t.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void initState() override
This object is a proxy for a port or other object which implements the functional response protocol...
Declarations of a non-full system Page Table.
void serialize(CheckpointOut &cp) const override
Serialize an object.
std::ostream CheckpointOut
System * system
Pointer to System object.
void paramIn(CheckpointIn &cp, const string &name, ExtMachInst &machInst)
virtual void unmap(Addr vaddr, int64_t size)
void serialize(CheckpointOut &cp) const override
Serialize an object.
void unserialize(CheckpointIn &cp) override
Unserialize an object.