On Thu, 30 Jan 2014, Nilay Vaish wrote:

On Tue, 21 Jan 2014, Andreas Hansson wrote:



>  On Jan. 20, 2014, 9:02 p.m., Nilay Vaish wrote:
> >  src/mem/ruby/system/RubyPort.cc, line 164
> >  <http://reviews.gem5.org/r/2039/diff/1/?file=37873#file37873line164>
> > > > How do you know that the destination value is what it should be? > > Should not
> >      the packet be routed using the address in the packet?

 Responses should be routed on the dest field in the classic memory system.
 Any multiplexing component is responsible for setting the source when the
 request passes through. Only requests are routed based on address.

 Moreover, any component that changes the src has to store the old value in
 a sender state and restore it later.

Yes, and I don't think noncoherent_bus.cc is doing what you wrote. It simply overwrites the source that was stored in the packet through the aforementioned line in RubyPort.cc. It seems the patch is working only because each ruby port has only one master port connected to the piobus.


Andreas, test the long ruby fs regression with rb2039 and the following patch applied. It should fail (it did when I tested) as the noncoherent bus does not store the source port id.

--
Nilay

diff -r 219dd4519afc -r 34547a0b92c4 tests/configs/pc-simple-timing-ruby.py --- a/tests/configs/pc-simple-timing-ruby.py Wed Jan 29 23:33:08 2014 -0600 +++ b/tests/configs/pc-simple-timing-ruby.py Thu Jan 30 12:20:06 2014 -0600
@@ -68,6 +68,13 @@
system.cpu = [TimingSimpleCPU(cpu_id=i, clk_domain = system.cpu_clk_domain)
               for i in xrange(options.num_cpus)]

+for (i, cpu) in enumerate(system.cpu):
+    # create the interrupt controller
+    cpu.createInterruptController()
+    cpu.interrupts.pio = system.piobus.master
+    cpu.interrupts.int_master = system.piobus.slave
+    cpu.interrupts.int_slave = system.piobus.master
+
 Ruby.create_system(options, system, system.piobus, system._dma_ports)

 # Create a seperate clock domain for Ruby
@@ -75,16 +82,11 @@
voltage_domain = system.voltage_domain)

 for (i, cpu) in enumerate(system.cpu):
-    # create the interrupt controller
-    cpu.createInterruptController()
     # Tie the cpu ports to the correct ruby system ports
     cpu.icache_port = system.ruby._cpu_ruby_ports[i].slave
     cpu.dcache_port = system.ruby._cpu_ruby_ports[i].slave
     cpu.itb.walker.port = system.ruby._cpu_ruby_ports[i].slave
     cpu.dtb.walker.port = system.ruby._cpu_ruby_ports[i].slave
-    cpu.interrupts.pio = system.piobus.master
-    cpu.interrupts.int_master = system.piobus.slave
-    cpu.interrupts.int_slave = system.piobus.master

     # Set access_phys_mem to True for ruby port
     system.ruby._cpu_ruby_ports[i].access_phys_mem = True
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to