page_table.cc (8232:b28d06a175be) | page_table.cc (8600:b0d7c64ada19) |
---|---|
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; --- 53 unchanged lines hidden (view full) --- 62 pTableCache[2].vaddr = 0; 63} 64 65PageTable::~PageTable() 66{ 67} 68 69void | 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; --- 53 unchanged lines hidden (view full) --- 62 pTableCache[2].vaddr = 0; 63} 64 65PageTable::~PageTable() 66{ 67} 68 69void |
70PageTable::allocate(Addr vaddr, int64_t size) | 70PageTable::allocate(Addr vaddr, int64_t size, bool clobber) |
71{ 72 // starting address must be page aligned 73 assert(pageOffset(vaddr) == 0); 74 75 DPRINTF(MMU, "Allocating Page: %#x-%#x\n", vaddr, vaddr+ size); 76 77 for (; size > 0; size -= pageSize, vaddr += pageSize) { | 71{ 72 // starting address must be page aligned 73 assert(pageOffset(vaddr) == 0); 74 75 DPRINTF(MMU, "Allocating Page: %#x-%#x\n", vaddr, vaddr+ size); 76 77 for (; size > 0; size -= pageSize, vaddr += pageSize) { |
78 PTableItr iter = pTable.find(vaddr); 79 80 if (iter != pTable.end()) { | 78 if (!clobber && (pTable.find(vaddr) != pTable.end())) { |
81 // already mapped | 79 // already mapped |
82 fatal("PageTable::allocate: address 0x%x already mapped", 83 vaddr); | 80 fatal("PageTable::allocate: address 0x%x already mapped", vaddr); |
84 } 85 86 pTable[vaddr] = TheISA::TlbEntry(process->M5_pid, vaddr, | 81 } 82 83 pTable[vaddr] = TheISA::TlbEntry(process->M5_pid, vaddr, |
87 process->system->new_page()); | 84 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); --- 27 unchanged lines hidden (view full) --- 123 assert(iter != pTable.end()); 124 125 pTable.erase(vaddr); 126 } 127 128} 129 130bool | 85 updateCache(vaddr, pTable[vaddr]); 86 } 87} 88 89void 90PageTable::remap(Addr vaddr, int64_t size, Addr new_vaddr) 91{ 92 assert(pageOffset(vaddr) == 0); --- 27 unchanged lines hidden (view full) --- 120 assert(iter != pTable.end()); 121 122 pTable.erase(vaddr); 123 } 124 125} 126 127bool |
128PageTable::isUnmapped(Addr vaddr, int64_t size) 129{ 130 // starting address must be page aligned 131 assert(pageOffset(vaddr) == 0); 132 133 for (; size > 0; size -= pageSize, vaddr += pageSize) { 134 if (pTable.find(vaddr) != pTable.end()) { 135 return false; 136 } 137 } 138 139 return true; 140} 141 142bool |
|
131PageTable::lookup(Addr vaddr, TheISA::TlbEntry &entry) 132{ 133 Addr page_addr = pageAlign(vaddr); 134 135 if (pTableCache[0].vaddr == page_addr) { 136 entry = pTableCache[0].entry; 137 return true; 138 } --- 90 unchanged lines hidden --- | 143PageTable::lookup(Addr vaddr, TheISA::TlbEntry &entry) 144{ 145 Addr page_addr = pageAlign(vaddr); 146 147 if (pTableCache[0].vaddr == page_addr) { 148 entry = pTableCache[0].entry; 149 return true; 150 } --- 90 unchanged lines hidden --- |