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 ---