tport.cc (3284:917750443a75) | tport.cc (3296:58498b71afd8) |
---|---|
1/* 2 * Copyright (c) 2006 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; --- 22 unchanged lines hidden (view full) --- 31#include "mem/tport.hh" 32 33void 34SimpleTimingPort::recvFunctional(Packet *pkt) 35{ 36 //First check queued events 37 std::list<Packet *>::iterator i = transmitList.begin(); 38 std::list<Packet *>::iterator end = transmitList.end(); | 1/* 2 * Copyright (c) 2006 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; --- 22 unchanged lines hidden (view full) --- 31#include "mem/tport.hh" 32 33void 34SimpleTimingPort::recvFunctional(Packet *pkt) 35{ 36 //First check queued events 37 std::list<Packet *>::iterator i = transmitList.begin(); 38 std::list<Packet *>::iterator end = transmitList.end(); |
39 for (; i != end; ++i) { | 39 bool cont = true; 40 41 while (i != end && cont) { |
40 Packet * target = *i; 41 // If the target contains data, and it overlaps the 42 // probed request, need to update data | 42 Packet * target = *i; 43 // If the target contains data, and it overlaps the 44 // probed request, need to update data |
43 if (target->intersect(pkt)) { 44 uint8_t* pkt_data; 45 uint8_t* write_data; 46 int data_size; 47 if (target->getAddr() < pkt->getAddr()) { 48 int offset = pkt->getAddr() - target->getAddr(); 49 pkt_data = pkt->getPtr<uint8_t>(); 50 write_data = target->getPtr<uint8_t>() + offset; 51 data_size = target->getSize() - offset; 52 assert(data_size > 0); 53 if (data_size > pkt->getSize()) 54 data_size = pkt->getSize(); 55 } else { 56 int offset = target->getAddr() - pkt->getAddr(); 57 pkt_data = pkt->getPtr<uint8_t>() + offset; 58 write_data = target->getPtr<uint8_t>(); 59 data_size = pkt->getSize() - offset; 60 assert(data_size > pkt->getSize()); 61 if (data_size > target->getSize()) 62 data_size = target->getSize(); 63 } | 45 if (target->intersect(pkt)) 46 fixPacket(pkt, target); |
64 | 47 |
65 if (pkt->isWrite()) { 66 memcpy(pkt_data, write_data, data_size); 67 } else { 68 memcpy(write_data, pkt_data, data_size); 69 } 70 } | |
71 } 72 //Then just do an atomic access and throw away the returned latency | 48 } 49 //Then just do an atomic access and throw away the returned latency |
73 recvAtomic(pkt); | 50 if (cont) 51 recvAtomic(pkt); |
74} 75 76bool 77SimpleTimingPort::recvTiming(Packet *pkt) 78{ 79 // If the device is only a slave, it should only be sending 80 // responses, which should never get nacked. There used to be 81 // code to hanldle nacks here, but I'm pretty sure it didn't work --- 68 unchanged lines hidden --- | 52} 53 54bool 55SimpleTimingPort::recvTiming(Packet *pkt) 56{ 57 // If the device is only a slave, it should only be sending 58 // responses, which should never get nacked. There used to be 59 // code to hanldle nacks here, but I'm pretty sure it didn't work --- 68 unchanged lines hidden --- |