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