changeset c7e14f52c682 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=c7e14f52c682
description:
MEM: Separate queries for snooping and address ranges
This patch simplifies the address-range determination mechanism and
also unifies the naming across ports and devices. It further splits
the queries for determining if a port is snooping and what address
ranges it responds to (aiming towards a separation of
cache-maintenance ports and pure memory-mapped ports). Default
behaviours are such that most ports do not have to define isSnooping,
and master ports need not implement getAddrRanges.
diffstat:
src/arch/x86/interrupts.cc | 22 ++++---
src/arch/x86/interrupts.hh | 4 +-
src/arch/x86/pagetable_walker.cc | 11 +---
src/arch/x86/pagetable_walker.hh | 14 +----
src/cpu/base.cc | 19 +------
src/cpu/base.hh | 19 +------
src/cpu/inorder/resources/cache_unit.cc | 11 +---
src/cpu/inorder/resources/cache_unit.hh | 13 +---
src/cpu/o3/cpu.hh | 8 +-
src/cpu/ozone/front_end.hh | 9 +--
src/cpu/ozone/front_end_impl.hh | 6 +-
src/cpu/ozone/lw_lsq.hh | 10 ++-
src/cpu/ozone/lw_lsq_impl.hh | 6 +-
src/cpu/simple/atomic.cc | 4 +-
src/cpu/testers/memtest/memtest.cc | 14 +----
src/cpu/testers/memtest/memtest.hh | 10 +---
src/cpu/testers/networktest/networktest.cc | 13 +----
src/cpu/testers/networktest/networktest.hh | 10 +---
src/dev/arm/gic.cc | 11 ++-
src/dev/arm/gic.hh | 2 +-
src/dev/arm/pl111.cc | 9 +-
src/dev/arm/pl111.hh | 8 +-
src/dev/copy_engine.hh | 1 -
src/dev/io_device.cc | 22 +++----
src/dev/io_device.hh | 45 +++++++---------
src/dev/pciconfigall.cc | 9 +-
src/dev/pciconfigall.hh | 2 +-
src/dev/pcidev.cc | 25 ++++----
src/dev/pcidev.hh | 11 ++-
src/dev/sinic.cc | 2 +-
src/dev/sparc/iob.cc | 11 ++-
src/dev/sparc/iob.hh | 2 +-
src/dev/uart8250.cc | 12 +--
src/dev/uart8250.hh | 2 +-
src/dev/x86/i8042.cc | 11 ++-
src/dev/x86/i8042.hh | 2 +-
src/dev/x86/i82094aa.hh | 20 ++++---
src/dev/x86/intdev.cc | 2 +-
src/dev/x86/intdev.hh | 9 +-
src/kern/tru64/tru64_events.cc | 4 +-
src/mem/bridge.cc | 18 ++---
src/mem/bridge.hh | 10 +-
src/mem/bus.cc | 82 ++++++++++++++++-------------
src/mem/bus.hh | 59 ++++++++++++++++-----
src/mem/cache/base.cc | 8 +-
src/mem/cache/base.hh | 2 +-
src/mem/cache/cache.hh | 6 +-
src/mem/cache/cache_impl.hh | 16 ++--
src/mem/physical.cc | 30 ++++------
src/mem/physical.hh | 8 +-
src/mem/port.hh | 73 +++++++++++++++----------
src/mem/ruby/system/RubyPort.cc | 5 +-
src/mem/tport.hh | 11 ++-
src/sim/system.hh | 8 ++-
54 files changed, 345 insertions(+), 416 deletions(-)
diffs (truncated from 1753 to 300 lines):
diff -r aab813d6a162 -r c7e14f52c682 src/arch/x86/interrupts.cc
--- a/src/arch/x86/interrupts.cc Tue Jan 17 12:55:09 2012 -0600
+++ b/src/arch/x86/interrupts.cc Tue Jan 17 12:55:09 2012 -0600
@@ -353,25 +353,27 @@
}
-void
-X86ISA::Interrupts::addressRanges(AddrRangeList &range_list)
+AddrRangeList
+X86ISA::Interrupts::getAddrRanges()
{
- range_list.clear();
+ AddrRangeList ranges;
Range<Addr> range = RangeEx(x86LocalAPICAddress(initialApicId, 0),
x86LocalAPICAddress(initialApicId, 0) +
PageBytes);
- range_list.push_back(range);
+ ranges.push_back(range);
pioAddr = range.start;
+ return ranges;
}
-void
-X86ISA::Interrupts::getIntAddrRange(AddrRangeList &range_list)
+AddrRangeList
+X86ISA::Interrupts::getIntAddrRange()
{
- range_list.clear();
- range_list.push_back(RangeEx(x86InterruptAddress(initialApicId, 0),
- x86InterruptAddress(initialApicId, 0) +
- PhysAddrAPICRangeSize));
+ AddrRangeList ranges;
+ ranges.push_back(RangeEx(x86InterruptAddress(initialApicId, 0),
+ x86InterruptAddress(initialApicId, 0) +
+ PhysAddrAPICRangeSize));
+ return ranges;
}
diff -r aab813d6a162 -r c7e14f52c682 src/arch/x86/interrupts.hh
--- a/src/arch/x86/interrupts.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/arch/x86/interrupts.hh Tue Jan 17 12:55:09 2012 -0600
@@ -217,8 +217,8 @@
return entry.periodic;
}
- void addressRanges(AddrRangeList &range_list);
- void getIntAddrRange(AddrRangeList &range_list);
+ AddrRangeList getAddrRanges();
+ AddrRangeList getIntAddrRange();
Port *getPort(const std::string &if_name, int idx = -1)
{
diff -r aab813d6a162 -r c7e14f52c682 src/arch/x86/pagetable_walker.cc
--- a/src/arch/x86/pagetable_walker.cc Tue Jan 17 12:55:09 2012 -0600
+++ b/src/arch/x86/pagetable_walker.cc Tue Jan 17 12:55:09 2012 -0600
@@ -154,17 +154,8 @@
}
void
-Walker::WalkerPort::recvStatusChange(Status status)
+Walker::WalkerPort::recvRangeChange()
{
- if (status == RangeChange) {
- if (!snoopRangeSent) {
- snoopRangeSent = true;
- sendStatusChange(Port::RangeChange);
- }
- return;
- }
-
- panic("Unexpected recvStatusChange.\n");
}
void
diff -r aab813d6a162 -r c7e14f52c682 src/arch/x86/pagetable_walker.hh
--- a/src/arch/x86/pagetable_walker.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/arch/x86/pagetable_walker.hh Tue Jan 17 12:55:09 2012 -0600
@@ -63,26 +63,18 @@
{
public:
WalkerPort(const std::string &_name, Walker * _walker) :
- Port(_name, _walker), walker(_walker),
- snoopRangeSent(false)
+ Port(_name, _walker), walker(_walker)
{}
protected:
Walker * walker;
- bool snoopRangeSent;
-
bool recvTiming(PacketPtr pkt);
Tick recvAtomic(PacketPtr pkt);
void recvFunctional(PacketPtr pkt);
- void recvStatusChange(Status status);
+ void recvRangeChange();
void recvRetry();
- void getDeviceAddressRanges(AddrRangeList &resp,
- bool &snoop)
- {
- resp.clear();
- snoop = true;
- }
+ bool isSnooping() { return true; }
};
friend class WalkerPort;
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/base.cc
--- a/src/cpu/base.cc Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/base.cc Tue Jan 17 12:55:09 2012 -0600
@@ -527,23 +527,6 @@
}
void
-BaseCPU::CpuPort::recvStatusChange(Status status)
+BaseCPU::CpuPort::recvRangeChange()
{
- if (status == RangeChange) {
- if (!snoopRangeSent) {
- snoopRangeSent = true;
- sendStatusChange(Port::RangeChange);
- }
- return;
- }
-
- panic("BaseCPU doesn't expect recvStatusChange callback!");
}
-
-void
-BaseCPU::CpuPort::getDeviceAddressRanges(AddrRangeList& resp,
- bool& snoop)
-{
- resp.clear();
- snoop = false;
-}
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/base.hh
--- a/src/cpu/base.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/base.hh Tue Jan 17 12:55:09 2012 -0600
@@ -126,7 +126,7 @@
* @param _name structural owner of this port
*/
CpuPort(const std::string& _name, MemObject* _owner) :
- Port(_name, _owner), snoopRangeSent(false)
+ Port(_name, _owner)
{ }
protected:
@@ -139,22 +139,7 @@
void recvFunctional(PacketPtr pkt);
- void recvStatusChange(Status status);
-
- /**
- * Add CPU ports are master ports and do not respond to any
- * address ranges. Note that the LSQ snoops for specific ISAs
- * and thus has to override this method.
- *
- * @param resp list of ranges this port responds to
- * @param snoop indicating if the port snoops or not
- */
- virtual void getDeviceAddressRanges(AddrRangeList& resp,
- bool& snoop);
-
- private:
-
- bool snoopRangeSent;
+ void recvRangeChange();
};
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/inorder/resources/cache_unit.cc
--- a/src/cpu/inorder/resources/cache_unit.cc Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/inorder/resources/cache_unit.cc Tue Jan 17 12:55:09 2012 -0600
@@ -82,17 +82,8 @@
}
void
-CacheUnit::CachePort::recvStatusChange(Status status)
+CacheUnit::CachePort::recvRangeChange()
{
- if (status == RangeChange) {
- if (!snoopRangeSent) {
- snoopRangeSent = true;
- sendStatusChange(Port::RangeChange);
- }
- return;
- }
-
- panic("CacheUnit::CachePort doesn't expect recvStatusChange callback!");
}
bool
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/inorder/resources/cache_unit.hh
--- a/src/cpu/inorder/resources/cache_unit.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/inorder/resources/cache_unit.hh Tue Jan 17 12:55:09 2012 -0600
@@ -90,11 +90,9 @@
CachePort(CacheUnit *_cachePortUnit)
: Port(_cachePortUnit->name() + "-cache-port",
(MemObject*)_cachePortUnit->cpu),
- cachePortUnit(_cachePortUnit), snoopRangeSent(false)
+ cachePortUnit(_cachePortUnit)
{ }
- bool snoopRangeSent;
-
protected:
/** Atomic version of receive. Panics. */
Tick recvAtomic(PacketPtr pkt);
@@ -102,13 +100,8 @@
/** Functional version of receive.*/
void recvFunctional(PacketPtr pkt);
- /** Receives status change. Other than range changing, panics. */
- void recvStatusChange(Status status);
-
- /** Returns the address ranges of this device. */
- void getDeviceAddressRanges(AddrRangeList &resp,
- bool &snoop)
- { resp.clear(); snoop = true; }
+ /** Receives range changes. */
+ void recvRangeChange();
/** Timing version of receive */
bool recvTiming(PacketPtr pkt);
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/o3/cpu.hh
--- a/src/cpu/o3/cpu.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/o3/cpu.hh Tue Jan 17 12:55:09 2012 -0600
@@ -186,12 +186,10 @@
* As this CPU requires snooping to maintain the load store queue
* change the behaviour from the base CPU port.
*
- * @param resp list of ranges this port responds to
- * @param snoop indicating if the port snoops or not
+ * @return true since we have to snoop
*/
- virtual void getDeviceAddressRanges(AddrRangeList& resp,
- bool& snoop)
- { resp.clear(); snoop = true; }
+ virtual bool isSnooping()
+ { return true; }
};
class TickEvent : public Event
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/ozone/front_end.hh
--- a/src/cpu/ozone/front_end.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/ozone/front_end.hh Tue Jan 17 12:55:09 2012 -0600
@@ -87,13 +87,8 @@
/** Functional version of receive. Panics. */
virtual void recvFunctional(PacketPtr pkt);
- /** Receives status change. Other than range changing, panics. */
- virtual void recvStatusChange(Status status);
-
- /** Returns the address ranges of this device. */
- virtual void getDeviceAddressRanges(AddrRangeList &resp,
- bool &snoop)
- { resp.clear(); snoop = true; }
+ /** Receives range change. */
+ virtual void recvRangeChange();
/** Timing version of receive. Handles setting fetch to the
* proper status to start fetching. */
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/ozone/front_end_impl.hh
--- a/src/cpu/ozone/front_end_impl.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/ozone/front_end_impl.hh Tue Jan 17 12:55:09 2012 -0600
@@ -64,12 +64,8 @@
template<class Impl>
void
-FrontEnd<Impl>::IcachePort::recvStatusChange(Status status)
+FrontEnd<Impl>::IcachePort::recvRangeChange()
{
- if (status == RangeChange)
- return;
-
- panic("FrontEnd doesn't expect recvStatusChange callback!");
}
template<class Impl>
diff -r aab813d6a162 -r c7e14f52c682 src/cpu/ozone/lw_lsq.hh
--- a/src/cpu/ozone/lw_lsq.hh Tue Jan 17 12:55:09 2012 -0600
+++ b/src/cpu/ozone/lw_lsq.hh Tue Jan 17 12:55:09 2012 -0600
@@ -256,11 +256,13 @@
virtual void recvFunctional(PacketPtr pkt);
- virtual void recvStatusChange(Status status);
+ virtual void recvRangeChange();
- virtual void getDeviceAddressRanges(AddrRangeList &resp,
- bool &snoop)
- { resp.clear(); snoop = true; }
+ /**
+ * Is a snooper due to LSQ maintenance
+ */
+ virtual bool isSnooping()
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev