summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/common/FSConfig.py2
-rw-r--r--src/arch/alpha/tlb.cc8
-rw-r--r--src/dev/uart8250.cc7
-rw-r--r--src/kern/linux/events.cc11
-rw-r--r--src/kern/linux/events.hh8
-rw-r--r--src/kern/linux/printk.cc13
-rw-r--r--src/kern/linux/printk.hh4
-rw-r--r--src/mem/bridge.cc45
-rw-r--r--src/mem/bridge.hh51
-rw-r--r--src/mem/bus.cc73
-rw-r--r--src/mem/bus.hh22
-rw-r--r--src/mem/packet.cc2
-rw-r--r--src/mem/port.hh6
-rw-r--r--src/python/m5/objects/Bridge.py2
-rw-r--r--src/python/m5/objects/Bus.py1
-rw-r--r--tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing-dual/m5stats.txt256
-rw-r--r--tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing/m5stats.txt112
-rw-r--r--tests/quick/80.netperf-stream/ref/alpha/linux/twosys-tsunami-simple-atomic/m5stats.txt18
18 files changed, 377 insertions, 264 deletions
diff --git a/configs/common/FSConfig.py b/configs/common/FSConfig.py
index be3f5ff79..289a7a5f4 100644
--- a/configs/common/FSConfig.py
+++ b/configs/common/FSConfig.py
@@ -61,7 +61,7 @@ def makeLinuxAlphaSystem(mem_mode, mdesc = None):
self.readfile = mdesc.script()
self.iobus = Bus(bus_id=0)
self.membus = Bus(bus_id=1)
- self.bridge = Bridge()
+ self.bridge = Bridge(fix_partial_write_b=True)
self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
self.bridge.side_a = self.iobus.port
self.bridge.side_b = self.membus.port
diff --git a/src/arch/alpha/tlb.cc b/src/arch/alpha/tlb.cc
index 3ab65e664..2dfff8c5f 100644
--- a/src/arch/alpha/tlb.cc
+++ b/src/arch/alpha/tlb.cc
@@ -213,7 +213,7 @@ TLB::flushAddr(Addr addr, uint8_t asn)
if (i == lookupTable.end())
return;
- while (i->first == vaddr.vpn()) {
+ while (i != lookupTable.end() && i->first == vaddr.vpn()) {
int index = i->second;
PTE *pte = &table[index];
assert(pte->valid);
@@ -225,10 +225,10 @@ TLB::flushAddr(Addr addr, uint8_t asn)
// invalidate this entry
pte->valid = false;
- lookupTable.erase(i);
+ lookupTable.erase(i++);
+ } else {
+ ++i;
}
-
- ++i;
}
}
diff --git a/src/dev/uart8250.cc b/src/dev/uart8250.cc
index d178bd1af..50307aad4 100644
--- a/src/dev/uart8250.cc
+++ b/src/dev/uart8250.cc
@@ -101,14 +101,11 @@ Uart8250::IntrEvent::scheduleIntr()
Uart8250::Uart8250(Params *p)
- : Uart(p), txIntrEvent(this, TX_INT), rxIntrEvent(this, RX_INT)
+ : Uart(p), IER(0), DLAB(0), LCR(0), MCR(0), lastTxInt(0),
+ txIntrEvent(this, TX_INT), rxIntrEvent(this, RX_INT)
{
pioSize = 8;
- IER = 0;
- DLAB = 0;
- LCR = 0;
- MCR = 0;
}
Tick
diff --git a/src/kern/linux/events.cc b/src/kern/linux/events.cc
index 4a3fd9f47..42fa63a27 100644
--- a/src/kern/linux/events.cc
+++ b/src/kern/linux/events.cc
@@ -37,6 +37,7 @@
#include "kern/system_events.hh"
#include "sim/system.hh"
+#include <sstream>
namespace Linux {
@@ -44,13 +45,11 @@ void
DebugPrintkEvent::process(ThreadContext *tc)
{
if (DTRACE(DebugPrintf)) {
- if (!raw) {
- StringWrap name(tc->getSystemPtr()->name() + ".dprintk");
- DPRINTFN("");
- }
-
+ std::stringstream ss;
TheISA::Arguments args(tc);
- Printk(args);
+ Printk(ss, args);
+ StringWrap name(tc->getSystemPtr()->name() + ".dprintk");
+ DPRINTFN("%s", ss.str());
}
SkipFuncEvent::process(tc);
}
diff --git a/src/kern/linux/events.hh b/src/kern/linux/events.hh
index b0510c18f..e36a72dde 100644
--- a/src/kern/linux/events.hh
+++ b/src/kern/linux/events.hh
@@ -38,13 +38,9 @@ namespace Linux {
class DebugPrintkEvent : public SkipFuncEvent
{
- private:
- bool raw;
-
public:
- DebugPrintkEvent(PCEventQueue *q, const std::string &desc, Addr addr,
- bool r = false)
- : SkipFuncEvent(q, desc, addr), raw(r) {}
+ DebugPrintkEvent(PCEventQueue *q, const std::string &desc, Addr addr)
+ : SkipFuncEvent(q, desc, addr) {}
virtual void process(ThreadContext *xc);
};
diff --git a/src/kern/linux/printk.cc b/src/kern/linux/printk.cc
index 0e9fd6620..866353e31 100644
--- a/src/kern/linux/printk.cc
+++ b/src/kern/linux/printk.cc
@@ -32,22 +32,18 @@
#include <sys/types.h>
#include <algorithm>
-#include "base/trace.hh"
#include "arch/arguments.hh"
+#include "base/trace.hh"
+#include "kern/linux/printk.hh"
using namespace std;
void
-Printk(TheISA::Arguments args)
+Printk(stringstream &out, TheISA::Arguments args)
{
- std::ostream &out = Trace::output();
char *p = (char *)args++;
- ios::fmtflags saved_flags = out.flags();
- char old_fill = out.fill();
- int old_precision = out.precision();
-
while (*p) {
switch (*p) {
case '%': {
@@ -258,8 +254,5 @@ Printk(TheISA::Arguments args)
}
}
- out.flags(saved_flags);
- out.fill(old_fill);
- out.precision(old_precision);
}
diff --git a/src/kern/linux/printk.hh b/src/kern/linux/printk.hh
index 17d59b765..20dfb430f 100644
--- a/src/kern/linux/printk.hh
+++ b/src/kern/linux/printk.hh
@@ -34,8 +34,10 @@
#include "arch/isa_specific.hh"
+#include <sstream>
+
class TheISA::Arguments;
-void Printk(TheISA::Arguments args);
+void Printk(std::stringstream &out, TheISA::Arguments args);
#endif // __PRINTK_HH__
diff --git a/src/mem/bridge.cc b/src/mem/bridge.cc
index b787f79ca..b25d135e2 100644
--- a/src/mem/bridge.cc
+++ b/src/mem/bridge.cc
@@ -43,20 +43,24 @@
Bridge::BridgePort::BridgePort(const std::string &_name,
Bridge *_bridge, BridgePort *_otherPort,
- int _delay, int _queueLimit)
+ int _delay, int _queueLimit,
+ bool fix_partial_write)
: Port(_name), bridge(_bridge), otherPort(_otherPort),
- delay(_delay), outstandingResponses(0),
- queueLimit(_queueLimit), sendEvent(this)
+ delay(_delay), fixPartialWrite(fix_partial_write),
+ outstandingResponses(0), queueLimit(_queueLimit), sendEvent(this)
{
}
Bridge::Bridge(const std::string &n, int qsa, int qsb,
- Tick _delay, int write_ack)
+ Tick _delay, int write_ack, bool fix_partial_write_a,
+ bool fix_partial_write_b)
: MemObject(n),
- portA(n + "-portA", this, &portB, _delay, qsa),
- portB(n + "-portB", this, &portA, _delay, qsa),
+ portA(n + "-portA", this, &portB, _delay, qsa, fix_partial_write_a),
+ portB(n + "-portB", this, &portA, _delay, qsa, fix_partial_write_b),
ackWrites(write_ack)
{
+ if (ackWrites)
+ panic("No support for acknowledging writes\n");
}
Port *
@@ -82,7 +86,10 @@ Bridge::init()
{
// Make sure that both sides are connected to.
if (portA.getPeer() == NULL || portB.getPeer() == NULL)
- panic("Both ports of bus bridge are not connected to a bus.\n");
+ fatal("Both ports of bus bridge are not connected to a bus.\n");
+
+ if (portA.peerBlockSize() != portB.peerBlockSize())
+ fatal("Busses don't have the same block size... Not supported.\n");
}
@@ -107,8 +114,10 @@ Bridge::BridgePort::recvTiming(PacketPtr pkt)
bool
Bridge::BridgePort::queueForSendTiming(PacketPtr pkt)
{
- if (queueFull())
+ if (queueFull()) {
+ DPRINTF(BusBridge, "Queue full, returning false\n");
return false;
+ }
if (pkt->isResponse()) {
// This is a response for a request we forwarded earlier. The
@@ -149,6 +158,7 @@ Bridge::BridgePort::trySend()
assert(!sendQueue.empty());
bool was_full = queueFull();
+ int pbs = peerBlockSize();
PacketBuffer *buf = sendQueue.front();
@@ -156,10 +166,18 @@ Bridge::BridgePort::trySend()
PacketPtr pkt = buf->pkt;
+ pkt->flags &= ~SNOOP_COMMIT; //CLear it if it was set
+
+ if (pkt->cmd == MemCmd::WriteInvalidateReq && fixPartialWrite &&
+ pkt->getOffset(pbs) && pkt->getSize() != pbs) {
+ buf->partialWriteFix(this);
+ pkt = buf->pkt;
+ }
+
DPRINTF(BusBridge, "trySend: origSrc %d dest %d addr 0x%x\n",
buf->origSrc, pkt->getDest(), pkt->getAddr());
- pkt->flags &= ~SNOOP_COMMIT; //CLear it if it was set
+
if (sendTiming(pkt)) {
// send successful
sendQueue.pop_front();
@@ -191,6 +209,7 @@ Bridge::BridgePort::trySend()
} else {
DPRINTF(BusBridge, " unsuccessful\n");
+ buf->undoPartialWriteFix();
}
}
@@ -248,6 +267,8 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(Bridge)
Param<int> queue_size_b;
Param<Tick> delay;
Param<bool> write_ack;
+ Param<bool> fix_partial_write_a;
+ Param<bool> fix_partial_write_b;
END_DECLARE_SIM_OBJECT_PARAMS(Bridge)
@@ -256,14 +277,16 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(Bridge)
INIT_PARAM(queue_size_a, "The size of the queue for data coming into side a"),
INIT_PARAM(queue_size_b, "The size of the queue for data coming into side b"),
INIT_PARAM(delay, "The miminum delay to cross this bridge"),
- INIT_PARAM(write_ack, "Acknowledge any writes that are received.")
+ INIT_PARAM(write_ack, "Acknowledge any writes that are received."),
+ INIT_PARAM(fix_partial_write_a, "Fixup any partial block writes that are received"),
+ INIT_PARAM(fix_partial_write_b, "Fixup any partial block writes that are received")
END_INIT_SIM_OBJECT_PARAMS(Bridge)
CREATE_SIM_OBJECT(Bridge)
{
return new Bridge(getInstanceName(), queue_size_a, queue_size_b, delay,
- write_ack);
+ write_ack, fix_partial_write_a, fix_partial_write_b);
}
REGISTER_SIM_OBJECT("Bridge", Bridge)
diff --git a/src/mem/bridge.hh b/src/mem/bridge.hh
index f7d0d12d0..d1154eda0 100644
--- a/src/mem/bridge.hh
+++ b/src/mem/bridge.hh
@@ -66,6 +66,8 @@ class Bridge : public MemObject
/** Minimum delay though this bridge. */
Tick delay;
+ bool fixPartialWrite;
+
class PacketBuffer : public Packet::SenderState {
public:
@@ -75,10 +77,13 @@ class Bridge : public MemObject
short origSrc;
bool expectResponse;
+ bool partialWriteFixed;
+ PacketPtr oldPkt;
+
PacketBuffer(PacketPtr _pkt, Tick t)
: ready(t), pkt(_pkt),
origSenderState(_pkt->senderState), origSrc(_pkt->getSrc()),
- expectResponse(_pkt->needsResponse())
+ expectResponse(_pkt->needsResponse()), partialWriteFixed(false)
{
if (!pkt->isResponse())
pkt->senderState = this;
@@ -89,7 +94,46 @@ class Bridge : public MemObject
assert(pkt->senderState == this);
pkt->setDest(origSrc);
pkt->senderState = origSenderState;
+ if (partialWriteFixed)
+ delete oldPkt;
+ }
+
+ void partialWriteFix(Port *port)
+ {
+ assert(!partialWriteFixed);
+ assert(expectResponse);
+
+ int pbs = port->peerBlockSize();
+ partialWriteFixed = true;
+ PacketDataPtr data;
+
+ data = new uint8_t[pbs];
+ PacketPtr funcPkt = new Packet(pkt->req, MemCmd::ReadReq,
+ Packet::Broadcast, pbs);
+
+ funcPkt->dataStatic(data);
+ port->sendFunctional(funcPkt);
+ assert(funcPkt->result == Packet::Success);
+ delete funcPkt;
+
+ oldPkt = pkt;
+ memcpy(data + oldPkt->getOffset(pbs), pkt->getPtr<uint8_t>(),
+ pkt->getSize());
+ pkt = new Packet(oldPkt->req, MemCmd::WriteInvalidateReq,
+ Packet::Broadcast, pbs);
+ pkt->dataDynamicArray(data);
+ pkt->senderState = oldPkt->senderState;
}
+
+ void undoPartialWriteFix()
+ {
+ if (!partialWriteFixed)
+ return;
+ delete pkt;
+ pkt = oldPkt;
+ partialWriteFixed = false;
+ }
+
};
/**
@@ -140,7 +184,7 @@ class Bridge : public MemObject
/** Constructor for the BusPort.*/
BridgePort(const std::string &_name,
Bridge *_bridge, BridgePort *_otherPort,
- int _delay, int _queueLimit);
+ int _delay, int _queueLimit, bool fix_partial_write);
protected:
@@ -182,7 +226,8 @@ class Bridge : public MemObject
virtual void init();
- Bridge(const std::string &n, int qsa, int qsb, Tick _delay, int write_ack);
+ Bridge(const std::string &n, int qsa, int qsb, Tick _delay, int write_ack,
+ bool fix_partial_write_a, bool fix_partial_write_b);
};
#endif //__MEM_BUS_HH__
diff --git a/src/mem/bus.cc b/src/mem/bus.cc
index b0636ecc2..6682ade55 100644
--- a/src/mem/bus.cc
+++ b/src/mem/bus.cc
@@ -48,6 +48,7 @@ Bus::getPort(const std::string &if_name, int idx)
if (defaultPort == NULL) {
defaultPort = new BusPort(csprintf("%s-default",name()), this,
defaultId);
+ cachedBlockSizeValid = false;
return defaultPort;
} else
fatal("Default port already set\n");
@@ -68,6 +69,7 @@ Bus::getPort(const std::string &if_name, int idx)
assert(maxId < std::numeric_limits<typeof(maxId)>::max());
BusPort *bp = new BusPort(csprintf("%s-p%d", name(), id), this, id);
interfaces[id] = bp;
+ cachedBlockSizeValid = false;
return bp;
}
@@ -182,6 +184,7 @@ Bus::recvTiming(PacketPtr pkt)
if (tickNextIdle > curTick ||
(retryList.size() && (!inRetry || pktPort != retryList.front()))) {
addToRetryList(pktPort);
+ DPRINTF(Bus, "recvTiming: Bus is busy, returning false\n");
return false;
}
@@ -207,11 +210,12 @@ Bus::recvTiming(PacketPtr pkt)
inRetry = false;
}
occupyBus(pkt);
+ DPRINTF(Bus, "recvTiming: Packet sucessfully sent\n");
return true;
}
} else {
//Snoop didn't succeed
- DPRINTF(Bus, "Adding a retry to RETRY list %d\n",
+ DPRINTF(Bus, "Adding1 a retry to RETRY list %d\n",
pktPort->getId());
addToRetryList(pktPort);
return false;
@@ -239,13 +243,14 @@ Bus::recvTiming(PacketPtr pkt)
}
// Packet not successfully sent. Leave or put it on the retry list.
- DPRINTF(Bus, "Adding a retry to RETRY list %d\n",
+ DPRINTF(Bus, "Adding2 a retry to RETRY list %d\n",
pktPort->getId());
addToRetryList(pktPort);
return false;
}
else {
//Forwarding up from responder, just return true;
+ DPRINTF(Bus, "recvTiming: can we be here?\n");
return true;
}
}
@@ -253,12 +258,12 @@ Bus::recvTiming(PacketPtr pkt)
void
Bus::recvRetry(int id)
{
- DPRINTF(Bus, "Received a retry\n");
+ DPRINTF(Bus, "Received a retry from %s\n", id == -1 ? "self" : interfaces[id]->getPeer()->name());
// If there's anything waiting, and the bus isn't busy...
if (retryList.size() && curTick >= tickNextIdle) {
//retryingPort = retryList.front();
inRetry = true;
- DPRINTF(Bus, "Sending a retry\n");
+ DPRINTF(Bus, "Sending a retry to %s\n", retryList.front()->getPeer()->name());
retryList.front()->sendRetry();
// If inRetry is still true, sendTiming wasn't called
if (inRetry)
@@ -267,18 +272,20 @@ Bus::recvRetry(int id)
retryList.pop_front();
inRetry = false;
- //Bring tickNextIdle up to the present
- while (tickNextIdle < curTick)
- tickNextIdle += clock;
+ if (id != -1) {
+ //Bring tickNextIdle up to the present
+ while (tickNextIdle < curTick)
+ tickNextIdle += clock;
- //Burn a cycle for the missed grant.
- tickNextIdle += clock;
+ //Burn a cycle for the missed grant.
+ tickNextIdle += clock;
- if (!busIdle.scheduled()) {
- busIdle.schedule(tickNextIdle);
- } else {
- busIdle.reschedule(tickNextIdle);
- }
+ if (!busIdle.scheduled()) {
+ busIdle.schedule(tickNextIdle);
+ } else {
+ busIdle.reschedule(tickNextIdle);
+ }
+ } // id != -1
}
}
//If we weren't able to drain before, we might be able to now.
@@ -598,6 +605,37 @@ Bus::addressRanges(AddrRangeList &resp, AddrRangeList &snoop, int id)
}
}
+int
+Bus::findBlockSize(int id)
+{
+ if (cachedBlockSizeValid)
+ return cachedBlockSize;
+
+ int max_bs = -1, tmp_bs;
+ range_map<Addr,int>::iterator portIter;
+ std::vector<DevMap>::iterator snoopIter;
+ for (portIter = portMap.begin(); portIter != portMap.end(); portIter++) {
+ tmp_bs = interfaces[portIter->second]->peerBlockSize();
+ if (tmp_bs > max_bs)
+ max_bs = tmp_bs;
+ }
+ for (snoopIter = portSnoopList.begin();
+ snoopIter != portSnoopList.end(); snoopIter++) {
+ tmp_bs = interfaces[snoopIter->portId]->peerBlockSize();
+ if (tmp_bs > max_bs)
+ max_bs = tmp_bs;
+ }
+ if (max_bs <= 0)
+ max_bs = defaultBlockSize;
+
+ if (max_bs != 64)
+ warn_once("Blocksize found to not be 64... hmm... probably not.\n");
+ cachedBlockSize = max_bs;
+ cachedBlockSizeValid = true;
+ return max_bs;
+}
+
+
unsigned int
Bus::drain(Event * de)
{
@@ -618,6 +656,7 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(Bus)
Param<int> clock;
Param<int> width;
Param<bool> responder_set;
+ Param<int> block_size;
END_DECLARE_SIM_OBJECT_PARAMS(Bus)
@@ -625,12 +664,14 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(Bus)
INIT_PARAM(bus_id, "a globally unique bus id"),
INIT_PARAM(clock, "bus clock speed"),
INIT_PARAM(width, "width of the bus (bits)"),
- INIT_PARAM(responder_set, "Is a default responder set by the user")
+ INIT_PARAM(responder_set, "Is a default responder set by the user"),
+ INIT_PARAM(block_size, "Default blocksize if no device has one")
END_INIT_SIM_OBJECT_PARAMS(Bus)
CREATE_SIM_OBJECT(Bus)
{
- return new Bus(getInstanceName(), bus_id, clock, width, responder_set);
+ return new Bus(getInstanceName(), bus_id, clock, width, responder_set,
+ block_size);
}
REGISTER_SIM_OBJECT("Bus", Bus)
diff --git a/src/mem/bus.hh b/src/mem/bus.hh
index 0dd7547c5..f0dc67b12 100644
--- a/src/mem/bus.hh
+++ b/src/mem/bus.hh
@@ -133,6 +133,12 @@ class Bus : public MemObject
/** Occupy the bus with transmitting the packet pkt */
void occupyBus(PacketPtr pkt);
+ /** Ask everyone on the bus what their size is
+ * @param id id of the busport that made the request
+ * @return the max of all the sizes
+ */
+ int findBlockSize(int id);
+
/** Declaration of the buses port type, one will be instantiated for each
of the interfaces connecting to the bus. */
class BusPort : public Port
@@ -195,8 +201,11 @@ class Bus : public MemObject
AddrRangeList &snoop)
{ bus->addressRanges(resp, snoop, id); }
- // Hack to make translating port work without changes
- virtual int deviceBlockSize() { return 32; }
+ // Ask the bus to ask everyone on the bus what their block size is and
+ // take the max of it. This might need to be changed a bit if we ever
+ // support multiple block sizes.
+ virtual int deviceBlockSize()
+ { return bus->findBlockSize(id); }
};
@@ -256,6 +265,10 @@ class Bus : public MemObject
/** Has the user specified their own default responder? */
bool responderSet;
+ int defaultBlockSize;
+ int cachedBlockSize;
+ bool cachedBlockSizeValid;
+
public:
/** A function used to return the port associated with this bus object. */
@@ -267,11 +280,12 @@ class Bus : public MemObject
unsigned int drain(Event *de);
Bus(const std::string &n, int bus_id, int _clock, int _width,
- bool responder_set)
+ bool responder_set, int dflt_blk_size)
: MemObject(n), busId(bus_id), clock(_clock), width(_width),
tickNextIdle(0), drainEvent(NULL), busIdle(this), inRetry(false),
maxId(0), defaultPort(NULL), funcPort(NULL), funcPortId(-4),
- responderSet(responder_set)
+ responderSet(responder_set), defaultBlockSize(dflt_blk_size),
+ cachedBlockSize(0), cachedBlockSizeValid(false)
{
//Both the width and clock period must be positive
if (width <= 0)
diff --git a/src/mem/packet.cc b/src/mem/packet.cc
index 14d08db1b..2463a19ba 100644
--- a/src/mem/packet.cc
+++ b/src/mem/packet.cc
@@ -85,7 +85,7 @@ MemCmd::commandInfo[] =
{ SET5(IsWrite, IsInvalidate, IsRequest, HasData, NeedsResponse),
WriteInvalidateResp, "WriteInvalidateReq" },
/* WriteInvalidateResp */
- { SET5(IsWrite, IsInvalidate, IsRequest, NeedsResponse, IsResponse),
+ { SET3(IsWrite, IsInvalidate, IsResponse),
InvalidCmd, "WriteInvalidateResp" },
/* UpgradeReq */
{ SET3(IsInvalidate, IsRequest, IsUpgrade), InvalidCmd, "UpgradeReq" },
diff --git a/src/mem/port.hh b/src/mem/port.hh
index 6296b42ca..877e00293 100644
--- a/src/mem/port.hh
+++ b/src/mem/port.hh
@@ -161,10 +161,10 @@ class Port
/** Called by a peer port in order to determine the block size of the
device connected to this port. It sometimes doesn't make sense for
- this function to be called, a DMA interface doesn't really have a
- block size, so it is defaulted to a panic.
+ this function to be called, so it just returns 0. Anytthing that is
+ concerned with the size should just ignore that.
*/
- virtual int deviceBlockSize() { panic("??"); M5_DUMMY_RETURN }
+ virtual int deviceBlockSize() { return 0; }
/** The peer port is requesting us to reply with a list of the ranges we
are responsible for.
diff --git a/src/python/m5/objects/Bridge.py b/src/python/m5/objects/Bridge.py
index ee8e76bff..e123c2891 100644
--- a/src/python/m5/objects/Bridge.py
+++ b/src/python/m5/objects/Bridge.py
@@ -9,3 +9,5 @@ class Bridge(MemObject):
queue_size_b = Param.Int(16, "The number of requests to buffer")
delay = Param.Latency('0ns', "The latency of this bridge")
write_ack = Param.Bool(False, "Should this bridge ack writes")
+ fix_partial_write_a = Param.Bool(False, "Should this bridge fixup partial block writes")
+ fix_partial_write_b = Param.Bool(False, "Should this bridge fixup partial block writes")
diff --git a/src/python/m5/objects/Bus.py b/src/python/m5/objects/Bus.py
index 8226fe8d2..48dbbe307 100644
--- a/src/python/m5/objects/Bus.py
+++ b/src/python/m5/objects/Bus.py
@@ -11,6 +11,7 @@ class Bus(MemObject):
clock = Param.Clock("1GHz", "bus clock speed")
width = Param.Int(64, "bus width (bytes)")
responder_set = Param.Bool(False, "Did the user specify a default responder.")
+ block_size = Param.Int(64, "The default block size if one isn't set by a device attached to the bus.")
if build_env['FULL_SYSTEM']:
responder = BadAddr(pio_addr=0x0, pio_latency="1ps")
default = Port(Self.responder.pio, "Default port for requests that aren't handled by a device.")
diff --git a/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing-dual/m5stats.txt b/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing-dual/m5stats.txt
index 24b2c4738..e0f0a0067 100644
--- a/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing-dual/m5stats.txt
+++ b/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing-dual/m5stats.txt
@@ -1,89 +1,89 @@
---------- Begin Simulation Statistics ----------
-host_inst_rate 249273 # Simulator instruction rate (inst/s)
-host_mem_usage 249952 # Number of bytes of host memory used
-host_seconds 261.36 # Real time elapsed on the host
-host_tick_rate 15217956 # Simulator tick rate (ticks/s)
+host_inst_rate 176514 # Simulator instruction rate (inst/s)
+host_mem_usage 193420 # Number of bytes of host memory used
+host_seconds 369.13 # Real time elapsed on the host
+host_tick_rate 10780504 # Simulator tick rate (ticks/s)
sim_freq 2000000000 # Frequency of simulated ticks
-sim_insts 65149861 # Number of instructions simulated
-sim_seconds 1.988682 # Number of seconds simulated
-sim_ticks 3977364868 # Number of ticks simulated
-system.cpu0.dtb.accesses 676531 # DTB accesses
+sim_insts 65155632 # Number of instructions simulated
+sim_seconds 1.989678 # Number of seconds simulated
+sim_ticks 3979356760 # Number of ticks simulated
+system.cpu0.dtb.accesses 676537 # DTB accesses
system.cpu0.dtb.acv 306 # DTB access violations
-system.cpu0.dtb.hits 12726821 # DTB hits
-system.cpu0.dtb.misses 8261 # DTB misses
-system.cpu0.dtb.read_accesses 494241 # DTB read accesses
+system.cpu0.dtb.hits 12789393 # DTB hits
+system.cpu0.dtb.misses 8263 # DTB misses
+system.cpu0.dtb.read_accesses 494246 # DTB read accesses
system.cpu0.dtb.read_acv 184 # DTB read access violations
-system.cpu0.dtb.read_hits 7906586 # DTB read hits
-system.cpu0.dtb.read_misses 7534 # DTB read misses
-system.cpu0.dtb.write_accesses 182290 # DTB write accesses
+system.cpu0.dtb.read_hits 7941036 # DTB read hits
+system.cpu0.dtb.read_misses 7535 # DTB read misses
+system.cpu0.dtb.write_accesses 182291 # DTB write accesses
system.cpu0.dtb.write_acv 122 # DTB write access violations
-system.cpu0.dtb.write_hits 4820235 # DTB write hits
-system.cpu0.dtb.write_misses 727 # DTB write misses
-system.cpu0.idle_fraction 0.930925 # Percentage of idle cycles
-system.cpu0.itb.accesses 3412128 # ITB accesses
+system.cpu0.dtb.write_hits 4848357 # DTB write hits
+system.cpu0.dtb.write_misses 728 # DTB write misses
+system.cpu0.idle_fraction 0.930790 # Percentage of idle cycles
+system.cpu0.itb.accesses 3420080 # ITB accesses
system.cpu0.itb.acv 161 # ITB acv
-system.cpu0.itb.hits 3408295 # ITB hits
-system.cpu0.itb.misses 3833 # ITB misses
-system.cpu0.kern.callpal 142543 # number of callpals executed
+system.cpu0.itb.hits 3416243 # ITB hits
+system.cpu0.itb.misses 3837 # ITB misses
+system.cpu0.kern.callpal 143414 # number of callpals executed
system.cpu0.kern.callpal_cserve 1 0.00% 0.00% # number of callpals executed
-system.cpu0.kern.callpal_wripir 572 0.40% 0.40% # number of callpals executed
+system.cpu0.kern.callpal_wripir 566 0.39% 0.40% # number of callpals executed
system.cpu0.kern.callpal_wrmces 1 0.00% 0.40% # number of callpals executed
system.cpu0.kern.callpal_wrfen 1 0.00% 0.40% # number of callpals executed
system.cpu0.kern.callpal_wrvptptr 1 0.00% 0.40% # number of callpals executed
-system.cpu0.kern.callpal_swpctx 2878 2.02% 2.42% # number of callpals executed
-system.cpu0.kern.callpal_tbi 47 0.03% 2.46% # number of callpals executed
-system.cpu0.kern.callpal_wrent 7 0.00% 2.46% # number of callpals executed
-system.cpu0.kern.callpal_swpipl 127693 89.58% 92.04% # number of callpals executed
-system.cpu0.kern.callpal_rdps 6611 4.64% 96.68% # number of callpals executed
-system.cpu0.kern.callpal_wrkgp 1 0.00% 96.68% # number of callpals executed
-system.cpu0.kern.callpal_wrusp 3 0.00% 96.68% # number of callpals executed
-system.cpu0.kern.callpal_rdusp 8 0.01% 96.69% # number of callpals executed
-system.cpu0.kern.callpal_whami 2 0.00% 96.69% # number of callpals executed
-system.cpu0.kern.callpal_rti 4215 2.96% 99.65% # number of callpals executed
+system.cpu0.kern.callpal_swpctx 2893 2.02% 2.41% # number of callpals executed
+system.cpu0.kern.callpal_tbi 47 0.03% 2.45% # number of callpals executed
+system.cpu0.kern.callpal_wrent 7 0.00% 2.45% # number of callpals executed
+system.cpu0.kern.callpal_swpipl 128466 89.58% 92.03% # number of callpals executed
+system.cpu0.kern.callpal_rdps 6699 4.67% 96.70% # number of callpals executed
+system.cpu0.kern.callpal_wrkgp 1 0.00% 96.70% # number of callpals executed
+system.cpu0.kern.callpal_wrusp 3 0.00% 96.70% # number of callpals executed
+system.cpu0.kern.callpal_rdusp 8 0.01% 96.71% # number of callpals executed
+system.cpu0.kern.callpal_whami 2 0.00% 96.71% # number of callpals executed
+system.cpu0.kern.callpal_rti 4216 2.94% 99.65% # number of callpals executed
system.cpu0.kern.callpal_callsys 355 0.25% 99.90% # number of callpals executed
system.cpu0.kern.callpal_imb 147 0.10% 100.00% # number of callpals executed
system.cpu0.kern.inst.arm 0 # number of arm instructions executed
-system.cpu0.kern.inst.hwrei 157728 # number of hwrei instructions executed
-system.cpu0.kern.inst.quiesce 6621 # number of quiesce instructions executed
-system.cpu0.kern.ipl_count 134531 # number of times we switched to this ipl
-system.cpu0.kern.ipl_count_0 53714 39.93% 39.93% # number of times we switched to this ipl
-system.cpu0.kern.ipl_count_21 131 0.10% 40.02% # number of times we switched to this ipl
-system.cpu0.kern.ipl_count_22 2009 1.49% 41.52% # number of times we switched to this ipl
-system.cpu0.kern.ipl_count_30 482 0.36% 41.88% # number of times we switched to this ipl
-system.cpu0.kern.ipl_count_31 78195 58.12% 100.00% # number of times we switched to this ipl
-system.cpu0.kern.ipl_good 108736 # number of times we switched to this ipl from a different ipl
-system.cpu0.kern.ipl_good_0 53298 49.02% 49.02% # number of times we switched to this ipl from a different ipl
+system.cpu0.kern.inst.hwrei 158606 # number of hwrei instructions executed
+system.cpu0.kern.inst.quiesce 6630 # number of quiesce instructions executed
+system.cpu0.kern.ipl_count 135306 # number of times we switched to this ipl
+system.cpu0.kern.ipl_count_0 54074 39.96% 39.96% # number of times we switched to this ipl
+system.cpu0.kern.ipl_count_21 131 0.10% 40.06% # number of times we switched to this ipl
+system.cpu0.kern.ipl_count_22 2010 1.49% 41.55% # number of times we switched to this ipl
+system.cpu0.kern.ipl_count_30 482 0.36% 41.90% # number of times we switched to this ipl
+system.cpu0.kern.ipl_count_31 78609 58.10% 100.00% # number of times we switched to this ipl
+system.cpu0.kern.ipl_good 109457 # number of times we switched to this ipl from a different ipl
+system.cpu0.kern.ipl_good_0 53658 49.02% 49.02% # number of times we switched to this ipl from a different ipl
system.cpu0.kern.ipl_good_21 131 0.12% 49.14% # number of times we switched to this ipl from a different ipl
-system.cpu0.kern.ipl_good_22 2009 1.85% 50.98% # number of times we switched to this ipl from a different ipl
-system.cpu0.kern.ipl_good_30 482 0.44% 51.43% # number of times we switched to this ipl from a different ipl
-system.cpu0.kern.ipl_good_31 52816 48.57% 100.00% # number of times we switched to this ipl from a different ipl
-system.cpu0.kern.ipl_ticks 3976579702 # number of cycles we spent at this ipl
-system.cpu0.kern.ipl_ticks_0 3843537444 96.65% 96.65% # number of cycles we spent at this ipl
-system.cpu0.kern.ipl_ticks_21 123584 0.00% 96.66% # number of cycles we spent at this ipl
-system.cpu0.kern.ipl_ticks_22 1875640 0.05% 96.70% # number of cycles we spent at this ipl
-system.cpu0.kern.ipl_ticks_30 1201752 0.03% 96.73% # number of cycles we spent at this ipl
-system.cpu0.kern.ipl_ticks_31 129841282 3.27% 100.00% # number of cycles we spent at this ipl
-system.cpu0.kern.ipl_used 0.808260 # fraction of swpipl calls that actually changed the ipl
-system.cpu0.kern.ipl_used_0 0.992255 # fraction of swpipl calls that actually changed the ipl
+system.cpu0.kern.ipl_good_22 2010 1.84% 50.98% # number of times we switched to this ipl from a different ipl
+system.cpu0.kern.ipl_good_30 482 0.44% 51.42% # number of times we switched to this ipl from a different ipl
+system.cpu0.kern.ipl_good_31 53176 48.58% 100.00% # number of times we switched to this ipl from a different ipl
+system.cpu0.kern.ipl_ticks 3978541594 # number of cycles we spent at this ipl
+system.cpu0.kern.ipl_ticks_0 3845416172 96.65% 96.65% # number of cycles we spent at this ipl
+system.cpu0.kern.ipl_ticks_21 119304 0.00% 96.66% # number of cycles we spent at this ipl
+system.cpu0.kern.ipl_ticks_22 1874808 0.05% 96.70% # number of cycles we spent at this ipl
+system.cpu0.kern.ipl_ticks_30 1202656 0.03% 96.73% # number of cycles we spent at this ipl
+system.cpu0.kern.ipl_ticks_31 129928654 3.27% 100.00% # number of cycles we spent at this ipl
+system.cpu0.kern.ipl_used 0.808959 # fraction of swpipl calls that actually changed the ipl
+system.cpu0.kern.ipl_used_0 0.992307 # fraction of swpipl calls that actually changed the ipl
system.cpu0.kern.ipl_used_21 1 # fraction of swpipl calls that actually changed the ipl
system.cpu0.kern.ipl_used_22 1 # fraction of swpipl calls that actually changed the ipl
system.cpu0.kern.ipl_used_30 1 # fraction of swpipl calls that actually changed the ipl
-system.cpu0.kern.ipl_used_31 0.675440 # fraction of swpipl calls that actually changed the ipl
-system.cpu0.kern.mode_good_kernel 1191
-system.cpu0.kern.mode_good_user 1191
+system.cpu0.kern.ipl_used_31 0.676462 # fraction of swpipl calls that actually changed the ipl
+system.cpu0.kern.mode_good_kernel 1189
+system.cpu0.kern.mode_good_user 1189
system.cpu0.kern.mode_good_idle 0
-system.cpu0.kern.mode_switch_kernel 6700 # number of protection mode switches
-system.cpu0.kern.mode_switch_user 1191 # number of protection mode switches
+system.cpu0.kern.mode_switch_kernel 6717 # number of protection mode switches
+system.cpu0.kern.mode_switch_user 1189 # number of protection mode switches
system.cpu0.kern.mode_switch_idle 0 # number of protection mode switches
-system.cpu0.kern.mode_switch_good 0.301863 # fraction of useful protection mode switches
-system.cpu0.kern.mode_switch_good_kernel 0.177761 # fraction of useful protection mode switches
+system.cpu0.kern.mode_switch_good 0.300784 # fraction of useful protection mode switches
+system.cpu0.kern.mode_switch_good_kernel 0.177014 # fraction of useful protection mode switches
system.cpu0.kern.mode_switch_good_user 1 # fraction of useful protection mode switches
system.cpu0.kern.mode_switch_good_idle <err: div-0> # fraction of useful protection mode switches
-system.cpu0.kern.mode_ticks_kernel 3965299112 99.76% 99.76% # number of ticks spent at the given mode
-system.cpu0.kern.mode_ticks_user 9599258 0.24% 100.00% # number of ticks spent at the given mode
+system.cpu0.kern.mode_ticks_kernel 3967314670 99.76% 99.76% # number of ticks spent at the given mode
+system.cpu0.kern.mode_ticks_user 9570844 0.24% 100.00% # number of ticks spent at the given mode
system.cpu0.kern.mode_ticks_idle 0 0.00% 100.00% # number of ticks spent at the given mode
-system.cpu0.kern.swap_context 2879 # number of times the context was actually changed
+system.cpu0.kern.swap_context 2894 # number of times the context was actually changed
system.cpu0.kern.syscall 216 # number of syscalls executed
system.cpu0.kern.syscall_2 7 3.24% 3.24% # number of syscalls executed
system.cpu0.kern.syscall_3 18 8.33% 11.57% # number of syscalls executed
@@ -115,82 +115,82 @@ system.cpu0.kern.syscall_98 2 0.93% 97.69% # nu
system.cpu0.kern.syscall_132 2 0.93% 98.61% # number of syscalls executed
system.cpu0.kern.syscall_144 1 0.46% 99.07% # number of syscalls executed
system.cpu0.kern.syscall_147 2 0.93% 100.00% # number of syscalls executed
-system.cpu0.not_idle_fraction 0.069075 # Percentage of non-idle cycles
-system.cpu0.numCycles 3976579942 # number of cpu cycles simulated
-system.cpu0.num_insts 50251391 # Number of instructions executed
-system.cpu0.num_refs 12958546 # Number of memory references
-system.cpu1.dtb.accesses 346252 # DTB accesses
+system.cpu0.not_idle_fraction 0.069210 # Percentage of non-idle cycles
+system.cpu0.numCycles 3978541834 # number of cpu cycles simulated
+system.cpu0.num_insts 50446812 # Number of instructions executed
+system.cpu0.num_refs 13021282 # Number of memory references
+system.cpu1.dtb.accesses 346250 # DTB accesses
system.cpu1.dtb.acv 67 # DTB access violations
-system.cpu1.dtb.hits 4740978 # DTB hits
-system.cpu1.dtb.misses 3345 # DTB misses
-system.cpu1.dtb.read_accesses 235843 # DTB read accesses
+system.cpu1.dtb.hits 4679272 # DTB hits
+system.cpu1.dtb.misses 3343 # DTB misses
+system.cpu1.dtb.read_accesses 235842 # DTB read accesses
system.cpu1.dtb.read_acv 26 # DTB read access violations
-system.cpu1.dtb.read_hits 2707473 # DTB read hits
-system.cpu1.dtb.read_misses 2918 # DTB read misses
-system.cpu1.dtb.write_accesses 110409 # DTB write accesses
+system.cpu1.dtb.read_hits 2672655 # DTB read hits
+system.cpu1.dtb.read_misses 2917 # DTB read misses
+system.cpu1.dtb.write_accesses 110408 # DTB write accesses
system.cpu1.dtb.write_acv 41 # DTB write access violations
-system.cpu1.dtb.write_hits 2033505 # DTB write hits
-system.cpu1.dtb.write_misses 427 # DTB write misses
-system.cpu1.idle_fraction 0.974575 # Percentage of idle cycles
-system.cpu1.itb.accesses 2097220 # ITB accesses
+system.cpu1.dtb.write_hits 2006617 # DTB write hits
+system.cpu1.dtb.write_misses 426 # DTB write misses
+system.cpu1.idle_fraction 0.974905 # Percentage of idle cycles
+system.cpu1.itb.accesses 2089153 # ITB accesses
system.cpu1.itb.acv 23 # ITB acv
-system.cpu1.itb.hits 2095948 # ITB hits
+system.cpu1.itb.hits 2087881 # ITB hits
system.cpu1.itb.misses 1272 # ITB misses
-system.cpu1.kern.callpal 80965 # number of callpals executed
+system.cpu1.kern.callpal 80102 # number of callpals executed
system.cpu1.kern.callpal_cserve 1 0.00% 0.00% # number of callpals executed
system.cpu1.kern.callpal_wripir 482 0.60% 0.60% # number of callpals executed
system.cpu1.kern.callpal_wrmces 1 0.00% 0.60% # number of callpals executed
-system.cpu1.kern.callpal_wrfen 1 0.00% 0.60% # number of callpals executed
-system.cpu1.kern.callpal_swpctx 2289 2.83% 3.43% # number of callpals executed
-system.cpu1.kern.callpal_tbi 7 0.01% 3.43% # number of callpals executed
-system.cpu1.kern.callpal_wrent 7 0.01% 3.44% # number of callpals executed
-system.cpu1.kern.callpal_swpipl 71577 88.40% 91.85% # number of callpals executed
-system.cpu1.kern.callpal_rdps 2303 2.84% 94.69% # number of callpals executed
-system.cpu1.kern.callpal_wrkgp 1 0.00% 94.69% # number of callpals executed
-system.cpu1.kern.callpal_wrusp 4 0.00% 94.70% # number of callpals executed
-system.cpu1.kern.callpal_rdusp 1 0.00% 94.70% # number of callpals executed
-system.cpu1.kern.callpal_whami 3 0.00% 94.70% # number of callpals executed
-system.cpu1.kern.callpal_rti 4092 5.05% 99.76% # number of callpals executed
+system.cpu1.kern.callpal_wrfen 1 0.00% 0.61% # number of callpals executed
+system.cpu1.kern.callpal_swpctx 2276 2.84% 3.45% # number of callpals executed
+system.cpu1.kern.callpal_tbi 7 0.01% 3.46% # number of callpals executed
+system.cpu1.kern.callpal_wrent 7 0.01% 3.46% # number of callpals executed
+system.cpu1.kern.callpal_swpipl 70820 88.41% 91.88% # number of callpals executed
+system.cpu1.kern.callpal_rdps 2215 2.77% 94.64% # number of callpals executed
+system.cpu1.kern.callpal_wrkgp 1 0.00% 94.64% # number of callpals executed
+system.cpu1.kern.callpal_wrusp 4 0.00% 94.65% # number of callpals executed
+system.cpu1.kern.callpal_rdusp 1 0.00% 94.65% # number of callpals executed
+system.cpu1.kern.callpal_whami 3 0.00% 94.65% # number of callpals executed
+system.cpu1.kern.callpal_rti 4087 5.10% 99.76% # number of callpals executed
system.cpu1.kern.callpal_callsys 162 0.20% 99.96% # number of callpals executed
system.cpu1.kern.callpal_imb 33 0.04% 100.00% # number of callpals executed
system.cpu1.kern.callpal_rdunique 1 0.00% 100.00% # number of callpals executed
system.cpu1.kern.inst.arm 0 # number of arm instructions executed
-system.cpu1.kern.inst.hwrei 88247 # number of hwrei instructions executed
-system.cpu1.kern.inst.quiesce 2815 # number of quiesce instructions executed
-system.cpu1.kern.ipl_count 78243 # number of times we switched to this ipl
-system.cpu1.kern.ipl_count_0 30463 38.93% 38.93% # number of times we switched to this ipl
-system.cpu1.kern.ipl_count_22 2001 2.56% 41.49% # number of times we switched to this ipl
-system.cpu1.kern.ipl_count_30 572 0.73% 42.22% # number of times we switched to this ipl
-system.cpu1.kern.ipl_count_31 45207 57.78% 100.00% # number of times we switched to this ipl
-system.cpu1.kern.ipl_good 61005 # number of times we switched to this ipl from a different ipl
-system.cpu1.kern.ipl_good_0 29502 48.36% 48.36% # number of times we switched to this ipl from a different ipl
-system.cpu1.kern.ipl_good_22 2001 3.28% 51.64% # number of times we switched to this ipl from a different ipl
-system.cpu1.kern.ipl_good_30 572 0.94% 52.58% # number of times we switched to this ipl from a different ipl
-system.cpu1.kern.ipl_good_31 28930 47.42% 100.00% # number of times we switched to this ipl from a different ipl
-system.cpu1.kern.ipl_ticks 3977363084 # number of cycles we spent at this ipl
-system.cpu1.kern.ipl_ticks_0 3855395406 96.93% 96.93% # number of cycles we spent at this ipl
-system.cpu1.kern.ipl_ticks_22 1873360 0.05% 96.98% # number of cycles we spent at this ipl
-system.cpu1.kern.ipl_ticks_30 1461344 0.04% 97.02% # number of cycles we spent at this ipl
-system.cpu1.kern.ipl_ticks_31 118632974 2.98% 100.00% # number of cycles we spent at this ipl
-system.cpu1.kern.ipl_used 0.779686 # fraction of swpipl calls that actually changed the ipl
-system.cpu1.kern.ipl_used_0 0.968454 # fraction of swpipl calls that actually changed the ipl
+system.cpu1.kern.inst.hwrei 87377 # number of hwrei instructions executed
+system.cpu1.kern.inst.quiesce 2792 # number of quiesce instructions executed
+system.cpu1.kern.ipl_count 77476 # number of times we switched to this ipl
+system.cpu1.kern.ipl_count_0 30110 38.86% 38.86% # number of times we switched to this ipl
+system.cpu1.kern.ipl_count_22 2002 2.58% 41.45% # number of times we switched to this ipl
+system.cpu1.kern.ipl_count_30 566 0.73% 42.18% # number of times we switched to this ipl
+system.cpu1.kern.ipl_count_31 44798 57.82% 100.00% # number of times we switched to this ipl
+system.cpu1.kern.ipl_good 60300 # number of times we switched to this ipl from a different ipl
+system.cpu1.kern.ipl_good_0 29149 48.34% 48.34% # number of times we switched to this ipl from a different ipl
+system.cpu1.kern.ipl_good_22 2002 3.32% 51.66% # number of times we switched to this ipl from a different ipl
+system.cpu1.kern.ipl_good_30 566 0.94% 52.60% # number of times we switched to this ipl from a different ipl
+system.cpu1.kern.ipl_good_31 28583 47.40% 100.00% # number of times we switched to this ipl from a different ipl
+system.cpu1.kern.ipl_ticks 3979354976 # number of cycles we spent at this ipl
+system.cpu1.kern.ipl_ticks_0 3857760682 96.94% 96.94% # number of cycles we spent at this ipl
+system.cpu1.kern.ipl_ticks_22 1872502 0.05% 96.99% # number of cycles we spent at this ipl
+system.cpu1.kern.ipl_ticks_30 1446416 0.04% 97.03% # number of cycles we spent at this ipl
+system.cpu1.kern.ipl_ticks_31 118275376 2.97% 100.00% # number of cycles we spent at this ipl
+system.cpu1.kern.ipl_used 0.778306 # fraction of swpipl calls that actually changed the ipl
+system.cpu1.kern.ipl_used_0 0.968084 # fraction of swpipl calls that actually changed the ipl
system.cpu1.kern.ipl_used_22 1 # fraction of swpipl calls that actually changed the ipl
system.cpu1.kern.ipl_used_30 1 # fraction of swpipl calls that actually changed the ipl
-system.cpu1.kern.ipl_used_31 0.639945 # fraction of swpipl calls that actually changed the ipl
-system.cpu1.kern.mode_good_kernel 1058
-system.cpu1.kern.mode_good_user 562
-system.cpu1.kern.mode_good_idle 496
-system.cpu1.kern.mode_switch_kernel 2397 # number of protection mode switches
-system.cpu1.kern.mode_switch_user 562 # number of protection mode switches
-system.cpu1.kern.mode_switch_idle 3035 # number of protection mode switches
-system.cpu1.kern.mode_switch_good 0.353020 # fraction of useful protection mode switches
-system.cpu1.kern.mode_switch_good_kernel 0.441385 # fraction of useful protection mode switches
+system.cpu1.kern.ipl_used_31 0.638042 # fraction of swpipl calls that actually changed the ipl
+system.cpu1.kern.mode_good_kernel 1051
+system.cpu1.kern.mode_good_user 561
+system.cpu1.kern.mode_good_idle 490
+system.cpu1.kern.mode_switch_kernel 2388 # number of protection mode switches
+system.cpu1.kern.mode_switch_user 561 # number of protection mode switches
+system.cpu1.kern.mode_switch_idle 3025 # number of protection mode switches
+system.cpu1.kern.mode_switch_good 0.351858 # fraction of useful protection mode switches
+system.cpu1.kern.mode_switch_good_kernel 0.440117 # fraction of useful protection mode switches
system.cpu1.kern.mode_switch_good_user 1 # fraction of useful protection mode switches
-system.cpu1.kern.mode_switch_good_idle 0.163427 # fraction of useful protection mode switches
-system.cpu1.kern.mode_ticks_kernel 64042452 1.61% 1.61% # number of ticks spent at the given mode
-system.cpu1.kern.mode_ticks_user 5753306 0.14% 1.75% # number of ticks spent at the given mode
-system.cpu1.kern.mode_ticks_idle 3907567318 98.25% 100.00% # number of ticks spent at the given mode
-system.cpu1.kern.swap_context 2290 # number of times the context was actually changed
+system.cpu1.kern.mode_switch_good_idle 0.161983 # fraction of useful protection mode switches
+system.cpu1.kern.mode_ticks_kernel 62784640 1.58% 1.58% # number of ticks spent at the given mode
+system.cpu1.kern.mode_ticks_user 5748262 0.14% 1.72% # number of ticks spent at the given mode
+system.cpu1.kern.mode_ticks_idle 3910822066 98.28% 100.00% # number of ticks spent at the given mode
+system.cpu1.kern.swap_context 2277 # number of times the context was actually changed
system.cpu1.kern.syscall 110 # number of syscalls executed
system.cpu1.kern.syscall_2 1 0.91% 0.91% # number of syscalls executed
system.cpu1.kern.syscall_3 12 10.91% 11.82% # number of syscalls executed
@@ -213,10 +213,10 @@ system.cpu1.kern.syscall_90 1 0.91% 95.45% # nu
system.cpu1.kern.syscall_92 2 1.82% 97.27% # number of syscalls executed
system.cpu1.kern.syscall_132 2 1.82% 99.09% # number of syscalls executed
system.cpu1.kern.syscall_144 1 0.91% 100.00% # number of syscalls executed
-system.cpu1.not_idle_fraction 0.025425 # Percentage of non-idle cycles
-system.cpu1.numCycles 3977364868 # number of cpu cycles simulated
-system.cpu1.num_insts 14898470 # Number of instructions executed
-system.cpu1.num_refs 4770918 # Number of memory references
+system.cpu1.not_idle_fraction 0.025095 # Percentage of non-idle cycles
+system.cpu1.numCycles 3979356760 # number of cpu cycles simulated
+system.cpu1.num_insts 14708820 # Number of instructions executed
+system.cpu1.num_refs 4709061 # Number of memory references
system.disk0.dma_read_bytes 1024 # Number of bytes transfered via DMA reads (not PRD).
system.disk0.dma_read_full_pages 0 # Number of full page size DMA reads (not PRD).
system.disk0.dma_read_txs 1 # Number of DMA read transactions (not PRD).
diff --git a/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing/m5stats.txt b/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing/m5stats.txt
index 7947c3d76..88a94edf5 100644
--- a/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing/m5stats.txt
+++ b/tests/quick/10.linux-boot/ref/alpha/linux/tsunami-simple-timing/m5stats.txt
@@ -1,84 +1,84 @@
---------- Begin Simulation Statistics ----------
-host_inst_rate 374146 # Simulator instruction rate (inst/s)
-host_mem_usage 249416 # Number of bytes of host memory used
-host_seconds 160.59 # Real time elapsed on the host
-host_tick_rate 24179677 # Simulator tick rate (ticks/s)
+host_inst_rate 261150 # Simulator instruction rate (inst/s)
+host_mem_usage 193084 # Number of bytes of host memory used
+host_seconds 230.08 # Real time elapsed on the host
+host_tick_rate 16884971 # Simulator tick rate (ticks/s)
sim_freq 2000000000 # Frequency of simulated ticks
-sim_insts 60085523 # Number of instructions simulated
-sim_seconds 1.941556 # Number of seconds simulated
-sim_ticks 3883112324 # Number of ticks simulated
-system.cpu.dtb.accesses 1020793 # DTB accesses
+sim_insts 60085806 # Number of instructions simulated
+sim_seconds 1.942464 # Number of seconds simulated
+sim_ticks 3884928812 # Number of ticks simulated
+system.cpu.dtb.accesses 1020801 # DTB accesses
system.cpu.dtb.acv 367 # DTB access violations
-system.cpu.dtb.hits 16070719 # DTB hits
-system.cpu.dtb.misses 11472 # DTB misses
-system.cpu.dtb.read_accesses 728862 # DTB read accesses
+system.cpu.dtb.hits 16070687 # DTB hits
+system.cpu.dtb.misses 11476 # DTB misses
+system.cpu.dtb.read_accesses 728869 # DTB read accesses
system.cpu.dtb.read_acv 210 # DTB read access violations
-system.cpu.dtb.read_hits 9714788 # DTB read hits
-system.cpu.dtb.read_misses 10330 # DTB read misses
-system.cpu.dtb.write_accesses 291931 # DTB write accesses
+system.cpu.dtb.read_hits 9714773 # DTB read hits
+system.cpu.dtb.read_misses 10333 # DTB read misses
+system.cpu.dtb.write_accesses 291932 # DTB write accesses
system.cpu.dtb.write_acv 157 # DTB write access violations
-system.cpu.dtb.write_hits 6355931 # DTB write hits
-system.cpu.dtb.write_misses 1142 # DTB write misses
-system.cpu.idle_fraction 0.921464 # Percentage of idle cycles
-system.cpu.itb.accesses 4985828 # ITB accesses
+system.cpu.dtb.write_hits 6355914 # DTB write hits
+system.cpu.dtb.write_misses 1143 # DTB write misses
+system.cpu.idle_fraction 0.921526 # Percentage of idle cycles
+system.cpu.itb.accesses 4986026 # ITB accesses
system.cpu.itb.acv 184 # ITB acv
-system.cpu.itb.hits 4980818 # ITB hits
+system.cpu.itb.hits 4981016 # ITB hits
system.cpu.itb.misses 5010 # ITB misses
-system.cpu.kern.callpal 193475 # number of callpals executed
+system.cpu.kern.callpal 193489 # number of callpals executed
system.cpu.kern.callpal_cserve 1 0.00% 0.00% # number of callpals executed
system.cpu.kern.callpal_wrmces 1 0.00% 0.00% # number of callpals executed
system.cpu.kern.callpal_wrfen 1 0.00% 0.00% # number of callpals executed
system.cpu.kern.callpal_wrvptptr 1 0.00% 0.00% # number of callpals executed
-system.cpu.kern.callpal_swpctx 4148 2.14% 2.15% # number of callpals executed
+system.cpu.kern.callpal_swpctx 4146 2.14% 2.14% # number of callpals executed
system.cpu.kern.callpal_tbi 54 0.03% 2.17% # number of callpals executed
system.cpu.kern.callpal_wrent 7 0.00% 2.18% # number of callpals executed
-system.cpu.kern.callpal_swpipl 176501 91.23% 93.40% # number of callpals executed
-system.cpu.kern.callpal_rdps 6860 3.55% 96.95% # number of callpals executed
+system.cpu.kern.callpal_swpipl 176515 91.23% 93.40% # number of callpals executed
+system.cpu.kern.callpal_rdps 6861 3.55% 96.95% # number of callpals executed
system.cpu.kern.callpal_wrkgp 1 0.00% 96.95% # number of callpals executed
system.cpu.kern.callpal_wrusp 7 0.00% 96.95% # number of callpals executed
system.cpu.kern.callpal_rdusp 9 0.00% 96.96% # number of callpals executed
system.cpu.kern.callpal_whami 2 0.00% 96.96% # number of callpals executed
-system.cpu.kern.callpal_rti 5186 2.68% 99.64% # number of callpals executed
+system.cpu.kern.callpal_rti 5187 2.68% 99.64% # number of callpals executed
system.cpu.kern.callpal_callsys 515 0.27% 99.91% # number of callpals executed
system.cpu.kern.callpal_imb 181 0.09% 100.00% # number of callpals executed
system.cpu.kern.inst.arm 0 # number of arm instructions executed
-system.cpu.kern.inst.hwrei 212602 # number of hwrei instructions executed
-system.cpu.kern.inst.quiesce 6154 # number of quiesce instructions executed
-system.cpu.kern.ipl_count 183780 # number of times we switched to this ipl
-system.cpu.kern.ipl_count_0 75067 40.85% 40.85% # number of times we switched to this ipl
+system.cpu.kern.inst.hwrei 212621 # number of hwrei instructions executed
+system.cpu.kern.inst.quiesce 6152 # number of quiesce instructions executed
+system.cpu.kern.ipl_count 183796 # number of times we switched to this ipl
+system.cpu.kern.ipl_count_0 75070 40.84% 40.84% # number of times we switched to this ipl
system.cpu.kern.ipl_count_21 131 0.07% 40.92% # number of times we switched to this ipl
-system.cpu.kern.ipl_count_22 1961 1.07% 41.98% # number of times we switched to this ipl
-system.cpu.kern.ipl_count_31 106621 58.02% 100.00% # number of times we switched to this ipl
-system.cpu.kern.ipl_good 149492 # number of times we switched to this ipl from a different ipl
-system.cpu.kern.ipl_good_0 73700 49.30% 49.30% # number of times we switched to this ipl from a different ipl
+system.cpu.kern.ipl_count_22 1962 1.07% 41.98% # number of times we switched to this ipl
+system.cpu.kern.ipl_count_31 106633 58.02% 100.00% # number of times we switched to this ipl
+system.cpu.kern.ipl_good 149499 # number of times we switched to this ipl from a different ipl
+system.cpu.kern.ipl_good_0 73703 49.30% 49.30% # number of times we switched to this ipl from a different ipl
system.cpu.kern.ipl_good_21 131 0.09% 49.39% # number of times we switched to this ipl from a different ipl
-system.cpu.kern.ipl_good_22 1961 1.31% 50.70% # number of times we switched to this ipl from a different ipl
-system.cpu.kern.ipl_good_31 73700 49.30% 100.00% # number of times we switched to this ipl from a different ipl
-system.cpu.kern.ipl_ticks 3883110540 # number of cycles we spent at this ipl
-system.cpu.kern.ipl_ticks_0 3755984220 96.73% 96.73% # number of cycles we spent at this ipl
+system.cpu.kern.ipl_good_22 1962 1.31% 50.70% # number of times we switched to this ipl from a different ipl
+system.cpu.kern.ipl_good_31 73703 49.30% 100.00% # number of times we switched to this ipl from a different ipl
+system.cpu.kern.ipl_ticks 3884927028 # number of cycles we spent at this ipl
+system.cpu.kern.ipl_ticks_0 3757862392 96.73% 96.73% # number of cycles we spent at this ipl
system.cpu.kern.ipl_ticks_21 112456 0.00% 96.73% # number of cycles we spent at this ipl
-system.cpu.kern.ipl_ticks_22 918754 0.02% 96.75% # number of cycles we spent at this ipl
-system.cpu.kern.ipl_ticks_31 126095110 3.25% 100.00% # number of cycles we spent at this ipl
-system.cpu.kern.ipl_used 0.813429 # fraction of swpipl calls that actually changed the ipl
+system.cpu.kern.ipl_ticks_22 918216 0.02% 96.76% # number of cycles we spent at this ipl
+system.cpu.kern.ipl_ticks_31 126033964 3.24% 100.00% # number of cycles we spent at this ipl
+system.cpu.kern.ipl_used 0.813396 # fraction of swpipl calls that actually changed the ipl
system.cpu.kern.ipl_used_0 0.981790 # fraction of swpipl calls that actually changed the ipl
system.cpu.kern.ipl_used_21 1 # fraction of swpipl calls that actually changed the ipl
system.cpu.kern.ipl_used_22 1 # fraction of swpipl calls that actually changed the ipl
-system.cpu.kern.ipl_used_31 0.691233 # fraction of swpipl calls that actually changed the ipl
-system.cpu.kern.mode_good_kernel 1897
-system.cpu.kern.mode_good_user 1742
-system.cpu.kern.mode_good_idle 155
-system.cpu.kern.mode_switch_kernel 5935 # number of protection mode switches
-system.cpu.kern.mode_switch_user 1742 # number of protection mode switches
+system.cpu.kern.ipl_used_31 0.691184 # fraction of swpipl calls that actually changed the ipl
+system.cpu.kern.mode_good_kernel 1898
+system.cpu.kern.mode_good_user 1744
+system.cpu.kern.mode_good_idle 154
+system.cpu.kern.mode_switch_kernel 5934 # number of protection mode switches
+system.cpu.kern.mode_switch_user 1744 # number of protection mode switches
system.cpu.kern.mode_switch_idle 2065 # number of protection mode switches
-system.cpu.kern.mode_switch_good 0.389448 # fraction of useful protection mode switches
-system.cpu.kern.mode_switch_good_kernel 0.319629 # fraction of useful protection mode switches
+system.cpu.kern.mode_switch_good 0.389613 # fraction of useful protection mode switches
+system.cpu.kern.mode_switch_good_kernel 0.319852 # fraction of useful protection mode switches
system.cpu.kern.mode_switch_good_user 1 # fraction of useful protection mode switches
-system.cpu.kern.mode_switch_good_idle 0.075061 # fraction of useful protection mode switches
-system.cpu.kern.mode_ticks_kernel 112876118 2.91% 2.91% # number of ticks spent at the given mode
-system.cpu.kern.mode_ticks_user 15210360 0.39% 3.30% # number of ticks spent at the given mode
-system.cpu.kern.mode_ticks_idle 3755024054 96.70% 100.00% # number of ticks spent at the given mode
-system.cpu.kern.swap_context 4149 # number of times the context was actually changed
+system.cpu.kern.mode_switch_good_idle 0.074576 # fraction of useful protection mode switches
+system.cpu.kern.mode_ticks_kernel 112858396 2.91% 2.91% # number of ticks spent at the given mode
+system.cpu.kern.mode_ticks_user 15210848 0.39% 3.30% # number of ticks spent at the given mode
+system.cpu.kern.mode_ticks_idle 3756857776 96.70% 100.00% # number of ticks spent at the given mode
+system.cpu.kern.swap_context 4147 # number of times the context was actually changed
system.cpu.kern.syscall 326 # number of syscalls executed
system.cpu.kern.syscall_2 8 2.45% 2.45% # number of syscalls executed
system.cpu.kern.syscall_3 30 9.20% 11.66% # number of syscalls executed
@@ -110,10 +110,10 @@ system.cpu.kern.syscall_98 2 0.61% 97.55% # nu
system.cpu.kern.syscall_132 4 1.23% 98.77% # number of syscalls executed
system.cpu.kern.syscall_144 2 0.61% 99.39% # number of syscalls executed
system.cpu.kern.syscall_147 2 0.61% 100.00% # number of syscalls executed
-system.cpu.not_idle_fraction 0.078536 # Percentage of non-idle cycles
-system.cpu.numCycles 3883112324 # number of cpu cycles simulated
-system.cpu.num_insts 60085523 # Number of instructions executed
-system.cpu.num_refs 16318655 # Number of memory references
+system.cpu.not_idle_fraction 0.078474 # Percentage of non-idle cycles
+system.cpu.numCycles 3884928812 # number of cpu cycles simulated
+system.cpu.num_insts 60085806 # Number of instructions executed
+system.cpu.num_refs 16318611 # Number of memory references
system.disk0.dma_read_bytes 1024 # Number of bytes transfered via DMA reads (not PRD).
system.disk0.dma_read_full_pages 0 # Number of full page size DMA reads (not PRD).
system.disk0.dma_read_txs 1 # Number of DMA read transactions (not PRD).
diff --git a/tests/quick/80.netperf-stream/ref/alpha/linux/twosys-tsunami-simple-atomic/m5stats.txt b/tests/quick/80.netperf-stream/ref/alpha/linux/twosys-tsunami-simple-atomic/m5stats.txt
index b190ca80a..8ef183435 100644
--- a/tests/quick/80.netperf-stream/ref/alpha/linux/twosys-tsunami-simple-atomic/m5stats.txt
+++ b/tests/quick/80.netperf-stream/ref/alpha/linux/twosys-tsunami-simple-atomic/m5stats.txt
@@ -140,12 +140,12 @@ drivesys.tsunami.ethernet.txPPS 25 # Pa
drivesys.tsunami.ethernet.txPackets 5 # Number of Packets Transmitted
drivesys.tsunami.ethernet.txTcpChecksums 2 # Number of tx TCP Checksums done by device
drivesys.tsunami.ethernet.txUdpChecksums 0 # Number of tx UDP Checksums done by device
-host_inst_rate 50427764 # Simulator instruction rate (inst/s)
-host_mem_usage 465972 # Number of bytes of host memory used
-host_seconds 5.44 # Real time elapsed on the host
-host_tick_rate 36752487576 # Simulator tick rate (ticks/s)
+host_inst_rate 36787265 # Simulator instruction rate (inst/s)
+host_mem_usage 407784 # Number of bytes of host memory used
+host_seconds 7.46 # Real time elapsed on the host
+host_tick_rate 26810828297 # Simulator tick rate (ticks/s)
sim_freq 1000000000000 # Frequency of simulated ticks
-sim_insts 274409387 # Number of instructions simulated
+sim_insts 274411697 # Number of instructions simulated
sim_seconds 0.200001 # Number of seconds simulated
sim_ticks 200000789468 # Number of ticks simulated
testsys.cpu.dtb.accesses 335402 # DTB accesses
@@ -383,12 +383,12 @@ drivesys.tsunami.ethernet.totalSwi 0 # to
drivesys.tsunami.ethernet.totalTxDesc 0 # total number of TxDesc written to ISR
drivesys.tsunami.ethernet.totalTxIdle 0 # total number of TxIdle written to ISR
drivesys.tsunami.ethernet.totalTxOk 0 # total number of TxOk written to ISR
-host_inst_rate 105949570270 # Simulator instruction rate (inst/s)
-host_mem_usage 465972 # Number of bytes of host memory used
+host_inst_rate 80923531996 # Simulator instruction rate (inst/s)
+host_mem_usage 407784 # Number of bytes of host memory used
host_seconds 0.00 # Real time elapsed on the host
-host_tick_rate 285395062 # Simulator tick rate (ticks/s)
+host_tick_rate 216582530 # Simulator tick rate (ticks/s)
sim_freq 1000000000000 # Frequency of simulated ticks
-sim_insts 274409387 # Number of instructions simulated
+sim_insts 274411697 # Number of instructions simulated
sim_seconds 0.000001 # Number of seconds simulated
sim_ticks 785978 # Number of ticks simulated
testsys.cpu.dtb.accesses 0 # DTB accesses