Deleted Added
sdiff udiff text old ( 8922:17f037ad8918 ) new ( 8948:e95ee70f876c )
full compact
1/*
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{
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 }
128 }
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 }
138 } else {
139 DPRINTF(PageTableWalker, "Received strange packet\n");
140 }
141 return true;
142}
143
144Tick
145Walker::WalkerPort::recvAtomic(PacketPtr pkt)
146{
147 return 0;
148}
149
150void
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{
575 if (pkt->isResponse() && !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 }
618 } else if (pkt->wasNacked()) {
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 ---