pagetable_walker.cc (8922:17f037ad8918) pagetable_walker.cc (8948:e95ee70f876c)
1/*
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
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
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
9 * licensed hereunder. You may use the software subject to the license

--- 95 unchanged lines hidden (view full) ---

105Walker::WalkerPort::recvTiming(PacketPtr pkt)
106{
107 return walker->recvTiming(pkt);
108}
109
110bool
111Walker::recvTiming(PacketPtr pkt)
112{
14 * Copyright (c) 2007 The Hewlett-Packard Development Company
15 * All rights reserved.
16 *
17 * The license below extends only to copyright in the software and shall
18 * not be construed as granting a license to any other intellectual
19 * property including but not limited to intellectual property relating
20 * to a hardware implementation of the functionality of the software
21 * licensed hereunder. You may use the software subject to the license

--- 95 unchanged lines hidden (view full) ---

117Walker::WalkerPort::recvTiming(PacketPtr pkt)
118{
119 return walker->recvTiming(pkt);
120}
121
122bool
123Walker::recvTiming(PacketPtr pkt)
124{
113 if (pkt->isResponse() || pkt->wasNacked()) {
114 WalkerSenderState * senderState =
115 dynamic_cast<WalkerSenderState *>(pkt->senderState);
116 pkt->senderState = senderState->saved;
117 WalkerState * senderWalk = senderState->senderWalk;
118 bool walkComplete = senderWalk->recvPacket(pkt);
119 delete senderState;
120 if (walkComplete) {
121 std::list<WalkerState *>::iterator iter;
122 for (iter = currStates.begin(); iter != currStates.end(); iter++) {
123 WalkerState * walkerState = *(iter);
124 if (walkerState == senderWalk) {
125 iter = currStates.erase(iter);
126 break;
127 }
125 assert(pkt->isResponse());
126 WalkerSenderState * senderState =
127 dynamic_cast(pkt->senderState);
128 pkt->senderState = senderState->saved;
129 WalkerState * senderWalk = senderState->senderWalk;
130 bool walkComplete = senderWalk->recvPacket(pkt);
131 delete senderState;
132 if (walkComplete) {
133 std::list::iterator iter;
134 for (iter = currStates.begin(); iter != currStates.end(); iter++) {
135 WalkerState * walkerState = *(iter);
136 if (walkerState == senderWalk) {
137 iter = currStates.erase(iter);
138 break;
128 }
139 }
129 delete senderWalk;
130 // Since we block requests when another is outstanding, we
131 // need to check if there is a waiting request to be serviced
132 if (currStates.size()) {
133 WalkerState * newState = currStates.front();
134 if (!newState->wasStarted())
135 newState->startWalk();
136 }
137 }
140 }
138 } else {
139 DPRINTF(PageTableWalker, "Received strange packet\n");
141 delete senderWalk;
142 // Since we block requests when another is outstanding, we
143 // need to check if there is a waiting request to be serviced
144 if (currStates.size()) {
145 WalkerState * newState = currStates.front();
146 if (!newState->wasStarted())
147 newState->startWalk();
148 }
140 }
141 return true;
142}
143
149 }
150 return true;
151}
152
144Tick
145Walker::WalkerPort::recvAtomic(PacketPtr pkt)
146{
147 return 0;
148}
149
150void
153void
151Walker::WalkerPort::recvFunctional(PacketPtr pkt)
152{
153 return;
154}
155
156void
157Walker::WalkerPort::recvRetry()
158{
159 walker->recvRetry();
160}
161
162void
163Walker::recvRetry()
164{

--- 402 unchanged lines hidden (view full) ---

567 RequestPtr request = new Request(topAddr, dataSize, flags, walker->masterId);
568 read = new Packet(request, MemCmd::ReadReq, Packet::Broadcast);
569 read->allocate();
570}
571
572bool
573Walker::WalkerState::recvPacket(PacketPtr pkt)
574{
154Walker::WalkerPort::recvRetry()
155{
156 walker->recvRetry();
157}
158
159void
160Walker::recvRetry()
161{

--- 402 unchanged lines hidden (view full) ---

564 RequestPtr request = new Request(topAddr, dataSize, flags, walker->masterId);
565 read = new Packet(request, MemCmd::ReadReq, Packet::Broadcast);
566 read->allocate();
567}
568
569bool
570Walker::WalkerState::recvPacket(PacketPtr pkt)
571{
575 if (pkt->isResponse() && !pkt->wasNacked()) {
572 assert(pkt->isResponse());
573 if (!pkt->wasNacked()) {
576 assert(inflight);
577 assert(state == Waiting);
578 assert(!read);
579 inflight--;
580 if (pkt->isRead()) {
581 state = nextState;
582 nextState = Ready;
583 PacketPtr write = NULL;

--- 26 unchanged lines hidden (view full) ---

610 // Let the CPU continue.
611 translation->finish(fault, req, tc, mode);
612 } else {
613 // There was a fault during the walk. Let the CPU know.
614 translation->finish(timingFault, req, tc, mode);
615 }
616 return true;
617 }
574 assert(inflight);
575 assert(state == Waiting);
576 assert(!read);
577 inflight--;
578 if (pkt->isRead()) {
579 state = nextState;
580 nextState = Ready;
581 PacketPtr write = NULL;

--- 26 unchanged lines hidden (view full) ---

608 // Let the CPU continue.
609 translation->finish(fault, req, tc, mode);
610 } else {
611 // There was a fault during the walk. Let the CPU know.
612 translation->finish(timingFault, req, tc, mode);
613 }
614 return true;
615 }
618 } else if (pkt->wasNacked()) {
616 } else {
619 DPRINTF(PageTableWalker, "Request was nacked. Entering retry state\n");
620 pkt->reinitNacked();
621 if (!walker->sendTiming(this, pkt)) {
622 inflight--;
623 retrying = true;
624 if (pkt->isWrite()) {
625 writes.push_back(pkt);
626 } else {

--- 83 unchanged lines hidden ---
617 DPRINTF(PageTableWalker, "Request was nacked. Entering retry state\n");
618 pkt->reinitNacked();
619 if (!walker->sendTiming(this, pkt)) {
620 inflight--;
621 retrying = true;
622 if (pkt->isWrite()) {
623 writes.push_back(pkt);
624 } else {

--- 83 unchanged lines hidden ---