1/* 2 * Copyright (c) 2003 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 38 unchanged lines hidden (view full) --- 47#include "sim/faults.hh" 48#include "sim/process.hh" 49#include "sim/sim_object.hh" 50#include "sim/system.hh" 51 52using namespace std; 53using namespace TheISA; 54 |
55PageTable::PageTable(Process *_process, Addr _pageSize) 56 : pageSize(_pageSize), offsetMask(mask(floorLog2(_pageSize))), 57 process(_process) |
58{ 59 assert(isPowerOf2(pageSize)); 60 pTableCache[0].vaddr = 0; 61 pTableCache[1].vaddr = 0; 62 pTableCache[2].vaddr = 0; 63} 64 65PageTable::~PageTable() --- 12 unchanged lines hidden (view full) --- 78 PTableItr iter = pTable.find(vaddr); 79 80 if (iter != pTable.end()) { 81 // already mapped 82 fatal("PageTable::allocate: address 0x%x already mapped", 83 vaddr); 84 } 85 |
86 pTable[vaddr] = TheISA::TlbEntry(process->M5_pid, vaddr, 87 process->system->new_page()); 88 updateCache(vaddr, pTable[vaddr]); |
89 } 90} 91 92void 93PageTable::remap(Addr vaddr, int64_t size, Addr new_vaddr) 94{ 95 assert(pageOffset(vaddr) == 0); 96 assert(pageOffset(new_vaddr) == 0); --- 94 unchanged lines hidden (view full) --- 191{ 192 paramOut(os, "ptable.size", pTable.size()); 193 194 PTable::size_type count = 0; 195 196 PTableItr iter = pTable.begin(); 197 PTableItr end = pTable.end(); 198 while (iter != end) { |
199 os << "\n[" << csprintf("%s.Entry%d", process->name(), count) << "]\n"; |
200 201 paramOut(os, "vaddr", iter->first); 202 iter->second.serialize(os); 203 204 ++iter; 205 ++count; 206 } 207 assert(count == pTable.size()); 208} 209 210void 211PageTable::unserialize(Checkpoint *cp, const std::string §ion) 212{ 213 int i = 0, count; 214 paramIn(cp, section, "ptable.size", count); 215 216 pTable.clear(); 217 218 while (i < count) { |
219 TheISA::TlbEntry *entry; 220 Addr vaddr; 221 222 paramIn(cp, csprintf("%s.Entry%d", process->name(), i), "vaddr", vaddr); 223 entry = new TheISA::TlbEntry(); 224 entry->unserialize(cp, csprintf("%s.Entry%d", process->name(), i)); 225 pTable[vaddr] = *entry; 226 ++i; |
227 } 228} 229 |