diff -r 48b145215ea6 -r b01e713cf4ef configs/common/FSConfig.py --- a/configs/common/FSConfig.py Sat Feb 16 11:35:23 2013 -0600 +++ b/configs/common/FSConfig.py Sat Feb 16 11:47:57 2013 -0600 @@ -554,8 +554,6 @@ self.testsys = testSystem self.drivesys = driveSystem self.etherlink = EtherLink() - self.etherlink.int0 = Parent.testsys.tsunami.ethernet.interface - self.etherlink.int1 = Parent.drivesys.tsunami.ethernet.interface if hasattr(testSystem, 'realview'): self.etherlink.int0 = Parent.testsys.realview.ethernet.interface @@ -563,6 +561,8 @@ elif hasattr(testSystem, 'tsunami'): self.etherlink.int0 = Parent.testsys.tsunami.ethernet.interface self.etherlink.int1 = Parent.drivesys.tsunami.ethernet.interface + self.etherlink.end0 = Parent.testsys.tsunami.ethernet + self.etherlink.end1 = Parent.drivesys.tsunami.ethernet else: fatal("Don't know how to connect these system together") diff -r 48b145215ea6 -r b01e713cf4ef src/dev/Ethernet.py --- a/src/dev/Ethernet.py Sat Feb 16 11:35:23 2013 -0600 +++ b/src/dev/Ethernet.py Sat Feb 16 11:47:57 2013 -0600 @@ -46,6 +46,11 @@ speed = Param.NetworkBandwidth('1Gbps', "link speed") dump = Param.EtherDump(NULL, "dump object") + # These are the sim objects that are connected by this link. For + # example, these could be the network interface objects. + end0 = Param.SimObject("sim object at end 0") + end1 = Param.SimObject("sim object at end 1") + class EtherBus(EtherObject): type = 'EtherBus' cxx_header = "dev/etherbus.hh" diff -r 48b145215ea6 -r b01e713cf4ef src/dev/etherlink.hh --- a/src/dev/etherlink.hh Sat Feb 16 11:35:23 2013 -0600 +++ b/src/dev/etherlink.hh Sat Feb 16 11:47:57 2013 -0600 @@ -63,6 +63,13 @@ std::string objName; EtherLink *parent; + + //! The following two sim objects are the objects that are connected + //! by this ethernet link. For example, these can be the network + //! interfaces from two different systems. + SimObject *sender; + SimObject *receiver; + int number; Interface *txint; @@ -88,6 +95,7 @@ public: Link(const std::string &name, EtherLink *p, int num, + SimObject *e0, SimObject *e1, double rate, Tick delay, Tick delay_var, EtherDump *dump); ~Link() {} @@ -137,7 +145,6 @@ virtual void serialize(std::ostream &os); virtual void unserialize(Checkpoint *cp, const std::string §ion); - }; #endif // __ETHERLINK_HH__ diff -r 48b145215ea6 -r b01e713cf4ef src/dev/etherlink.cc --- a/src/dev/etherlink.cc Sat Feb 16 11:35:23 2013 -0600 +++ b/src/dev/etherlink.cc Sat Feb 16 11:47:57 2013 -0600 @@ -56,9 +56,9 @@ EtherLink::EtherLink(const Params *p) : EtherObject(p) { - link[0] = new Link(name() + ".link0", this, 0, p->speed, + link[0] = new Link(name() + ".link0", this, 0, p->end0, p->end1, p->speed, p->delay, p->delay_var, p->dump); - link[1] = new Link(name() + ".link1", this, 1, p->speed, + link[1] = new Link(name() + ".link1", this, 1, p->end1, p->end0, p->speed, p->delay, p->delay_var, p->dump); interface[0] = new Interface(name() + ".int0", link[0], link[1]); @@ -100,10 +100,11 @@ } EtherLink::Link::Link(const string &name, EtherLink *p, int num, + SimObject *e0, SimObject *e1, double rate, Tick delay, Tick delay_var, EtherDump *d) - : objName(name), parent(p), number(num), txint(NULL), rxint(NULL), - ticksPerByte(rate), linkDelay(delay), delayVar(delay_var), dump(d), - doneEvent(this) + : objName(name), parent(p), sender(e0), receiver(e1), number(num), + txint(NULL), rxint(NULL), ticksPerByte(rate), linkDelay(delay), + delayVar(delay_var), dump(d), doneEvent(this) { } void @@ -157,7 +158,9 @@ if (linkDelay > 0) { DPRINTF(Ethernet, "packet delayed: delay=%d\n", linkDelay); Event *event = new LinkDelayEvent(this, packet); - parent->schedule(event, curTick() + linkDelay); + + // Schedule the event using the receiver end of the link. + receiver->schedule(event, curTick() + linkDelay); } else { txComplete(packet); } @@ -186,7 +189,9 @@ DPRINTF(Ethernet, "scheduling packet: delay=%d, (rate=%f)\n", delay, ticksPerByte); - parent->schedule(doneEvent, curTick() + delay); + + // Schedule the event using the sending end of the link. + sender->schedule(doneEvent, curTick() + delay); return true; } @@ -224,7 +229,7 @@ if (event_scheduled) { Tick event_time; paramIn(cp, section, base + ".event_time", event_time); - parent->schedule(doneEvent, event_time); + sender->schedule(doneEvent, event_time); } } diff -r 48b145215ea6 -r b01e713cf4ef src/dev/etherobject.hh --- a/src/dev/etherobject.hh Sat Feb 16 11:35:23 2013 -0600 +++ b/src/dev/etherobject.hh Sat Feb 16 11:47:57 2013 -0600 @@ -64,4 +64,4 @@ }; -#endif //__MEM_MEM_OBJECT_HH__ +#endif //__DEV_ETHEROBJECT_HH__ diff -r 48b145215ea6 -r b01e713cf4ef tests/configs/twosys-tsunami-simple-atomic.py --- a/tests/configs/twosys-tsunami-simple-atomic.py Sat Feb 16 11:35:23 2013 -0600 +++ b/tests/configs/twosys-tsunami-simple-atomic.py Sat Feb 16 11:47:57 2013 -0600 @@ -59,4 +59,11 @@ root = makeDualRoot(True, test_sys, drive_sys, "ethertrace") +# Assign separate event queues to the two systems. Note that +# by default each sim object is on eventq 0. +drive_sys.eventq_index = 0 +test_sys.eventq_index = 1 +root.etherlink.delay = '2us' +root.sim_quantum = 1000000 + maxtick = 199999999