pagetable_walker.cc (9579:2a13ddb8bd0d) | pagetable_walker.cc (9701:f02f3b6562d5) |
---|---|
1/* 2 * Copyright (c) 2012 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 125 unchanged lines hidden (view full) --- 134 if (walkerState == senderWalk) { 135 iter = currStates.erase(iter); 136 break; 137 } 138 } 139 delete senderWalk; 140 // Since we block requests when another is outstanding, we 141 // need to check if there is a waiting request to be serviced | 1/* 2 * Copyright (c) 2012 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 125 unchanged lines hidden (view full) --- 134 if (walkerState == senderWalk) { 135 iter = currStates.erase(iter); 136 break; 137 } 138 } 139 delete senderWalk; 140 // Since we block requests when another is outstanding, we 141 // need to check if there is a waiting request to be serviced |
142 if (currStates.size()) { 143 WalkerState * newState = currStates.front(); 144 if (!newState->wasStarted()) 145 newState->startWalk(); 146 } | 142 if (currStates.size()) 143 startWalkWrapper(); |
147 } 148 return true; 149} 150 151void 152Walker::WalkerPort::recvRetry() 153{ 154 walker->recvRetry(); --- 32 unchanged lines hidden (view full) --- 187{ 188 assert(state == Ready); 189 started = false; 190 tc = _tc; 191 mode = _mode; 192 timing = _isTiming; 193} 194 | 144 } 145 return true; 146} 147 148void 149Walker::WalkerPort::recvRetry() 150{ 151 walker->recvRetry(); --- 32 unchanged lines hidden (view full) --- 184{ 185 assert(state == Ready); 186 started = false; 187 tc = _tc; 188 mode = _mode; 189 timing = _isTiming; 190} 191 |
192void 193Walker::startWalkWrapper() 194{ 195 unsigned num_squashed = 0; 196 WalkerState *currState = currStates.front(); 197 while ((num_squashed < numSquashable) && currState && 198 currState->translation->squashed()) { 199 currStates.pop_front(); 200 num_squashed++; 201 202 DPRINTF(PageTableWalker, "Squashing table walk for address %#x\n", 203 currState->req->getVaddr()); 204 205 // finish the translation which will delete the translation object 206 currState->translation->finish(new UnimpFault("Squashed Inst"), 207 currState->req, currState->tc, currState->mode); 208 209 // delete the current request 210 delete currState; 211 212 // check the next translation request, if it exists 213 if (currStates.size()) 214 currState = currStates.front(); 215 else 216 currState = NULL; 217 } 218 if (currState && !currState->wasStarted()) 219 currState->startWalk(); 220} 221 |
|
195Fault 196Walker::WalkerState::startWalk() 197{ 198 Fault fault = NoFault; 199 assert(started == false); 200 started = true; 201 setupWalk(req->getVaddr()); 202 if (timing) { --- 493 unchanged lines hidden --- | 222Fault 223Walker::WalkerState::startWalk() 224{ 225 Fault fault = NoFault; 226 assert(started == false); 227 started = true; 228 setupWalk(req->getVaddr()); 229 if (timing) { --- 493 unchanged lines hidden --- |