diff options
author | Nathan Binkert <nate@binkert.org> | 2008-11-14 04:55:30 -0800 |
---|---|---|
committer | Nathan Binkert <nate@binkert.org> | 2008-11-14 04:55:30 -0800 |
commit | 5711282f87afb609c79d657ed6aa8c9259b5b827 (patch) | |
tree | 399daee55331d1a8b0664a4a7d7d493f3b027708 | |
parent | 7a4d75bae31cfe2064fe0718c7f982f769659b3c (diff) | |
download | gem5-5711282f87afb609c79d657ed6aa8c9259b5b827.tar.xz |
Fix a bunch of bugs I introduced when I changed the flags stuff for packets.
I did some of the flags and assertions wrong. Thanks to Brad Beckmann
for pointing this out. I should have run the opt regressions instead
of the fast. I also screwed up some of the logical functions in the Flags
class.
-rw-r--r-- | src/arch/alpha/isa/mem.isa | 2 | ||||
-rw-r--r-- | src/arch/mips/isa/formats/util.isa | 2 | ||||
-rw-r--r-- | src/base/flags.hh | 8 | ||||
-rw-r--r-- | src/mem/packet.hh | 33 | ||||
-rw-r--r-- | src/mem/request.hh | 4 |
5 files changed, 25 insertions, 24 deletions
diff --git a/src/arch/alpha/isa/mem.isa b/src/arch/alpha/isa/mem.isa index b4e10e849..cd5e117ec 100644 --- a/src/arch/alpha/isa/mem.isa +++ b/src/arch/alpha/isa/mem.isa @@ -678,7 +678,7 @@ def LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, if mem_flags: mem_flags = [ 'Request::%s' % flag for flag in mem_flags ] - s = '\n\tmemAccessFlags.reset(' + string.join(mem_flags, '|') + ');' + s = '\n\tmemAccessFlags = ' + string.join(mem_flags, '|') + ';' iop.constructor += s memacc_iop.constructor += s diff --git a/src/arch/mips/isa/formats/util.isa b/src/arch/mips/isa/formats/util.isa index 786a964d4..f729cbf63 100644 --- a/src/arch/mips/isa/formats/util.isa +++ b/src/arch/mips/isa/formats/util.isa @@ -62,7 +62,7 @@ def LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, if mem_flags: mem_flags = [ 'Request::%s' % flag for flag in mem_flags ] - s = '\n\tmemAccessFlags.reset(' + string.join(mem_flags, '|') + ');' + s = '\n\tmemAccessFlags = ' + string.join(mem_flags, '|') + ';' iop.constructor += s memacc_iop.constructor += s diff --git a/src/base/flags.hh b/src/base/flags.hh index 7cf6ef9c6..712b65319 100644 --- a/src/base/flags.hh +++ b/src/base/flags.hh @@ -61,16 +61,14 @@ class Flags bool any() const { return _flags; } bool any(Type flags) const { return (_flags & flags); } - bool all() const { return (~_flags); } - bool all(Type flags) const { return (_flags & flags) != flags; } + bool all() const { return !(~_flags); } + bool all(Type flags) const { return (_flags & flags) == flags; } bool none() const { return _flags == 0; } bool none(Type flags) const { return (_flags & flags) == 0; } - bool exact(Type flags) const { return _flags = flags; } void clear() { _flags = 0; } void clear(Type flags) { _flags &= ~flags; } - void reset(Type flags) { _flags = flags;} void set(Type flags) { _flags |= flags; } - void set(Type f, bool val) { _flags = (_flags & f) | (val ? f : 0); } + void set(Type f, bool val) { _flags = (_flags & ~f) | (val ? f : 0); } void update(Type flags, Type mask) { diff --git a/src/mem/packet.hh b/src/mem/packet.hh index 38eb2e92b..b75490168 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -461,9 +461,12 @@ class Packet : public FastAlloc, public Printable * supplied. */ Packet(Request *_req, MemCmd _cmd, NodeID _dest) - : cmd(_cmd), req(_req), data(NULL), addr(_req->paddr), - size(_req->size), dest(_dest), time(curTick), senderState(NULL) + : flags(VALID_DST), cmd(_cmd), req(_req), data(NULL), + addr(_req->paddr), size(_req->size), dest(_dest), time(curTick), + senderState(NULL) { + if (req->flags.any(Request::VALID_PADDR)) + flags.set(VALID_ADDR|VALID_SIZE); } /** @@ -472,10 +475,12 @@ class Packet : public FastAlloc, public Printable * req. this allows for overriding the size/addr of the req. */ Packet(Request *_req, MemCmd _cmd, NodeID _dest, int _blkSize) - : cmd(_cmd), req(_req), data(NULL), + : flags(VALID_DST), cmd(_cmd), req(_req), data(NULL), addr(_req->paddr & ~(_blkSize - 1)), size(_blkSize), dest(_dest), time(curTick), senderState(NULL) { + if (req->flags.any(Request::VALID_PADDR)) + flags.set(VALID_ADDR|VALID_SIZE); } /** @@ -544,13 +549,10 @@ class Packet : public FastAlloc, public Printable assert(isRequest()); origCmd = cmd; cmd = cmd.responseCommand(); - if (flags.any(VALID_SRC)) { - dest = src; - flags.set(VALID_DST); - flags.clear(VALID_SRC); - } else { - flags.clear(VALID_DST); - } + + dest = src; + flags.set(VALID_DST, flags.any(VALID_SRC)); + flags.clear(VALID_SRC); } void @@ -690,7 +692,6 @@ class Packet : public FastAlloc, public Printable if (flags.any(ARRAY_DATA)) delete [] data; else if (flags.any(DYNAMIC_DATA)) - delete data; flags.clear(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA); @@ -702,11 +703,13 @@ class Packet : public FastAlloc, public Printable allocate() { if (data) { - assert(flags.none(STATIC_DATA|DYNAMIC_DATA)); - } else { - flags.set(DYNAMIC_DATA|ARRAY_DATA); - data = new uint8_t[getSize()]; + assert(flags.any(STATIC_DATA|DYNAMIC_DATA)); + return; } + + assert(flags.none(STATIC_DATA|DYNAMIC_DATA)); + flags.set(DYNAMIC_DATA|ARRAY_DATA); + data = new uint8_t[getSize()]; } diff --git a/src/mem/request.hh b/src/mem/request.hh index 007c33acf..c7cadaa03 100644 --- a/src/mem/request.hh +++ b/src/mem/request.hh @@ -53,6 +53,8 @@ typedef Request* RequestPtr; class Request : public FastAlloc { + friend class Packet; + public: typedef uint32_t FlagsType; typedef ::Flags<FlagsType> Flags; @@ -455,8 +457,6 @@ class Request : public FastAlloc return false; } - - friend class Packet; }; #endif // __MEM_REQUEST_HH__ |