mem: Reflect that packet address and size are always valid

This patch simplifies the packet, and removes the possibility of
creating a packet without a valid address and/or size. Under no
circumstances are these fields set at a later point, and thus they
really have to be provided at construction time.

The patch also fixes a case there the MinorCPU creates a packet
without a valid address and size, only to later delete it.
This commit is contained in:
Andreas Hansson 2015-08-21 07:03:27 -04:00
parent 6eb434c8a2
commit daaae3744d
2 changed files with 28 additions and 57 deletions

View file

@ -1578,6 +1578,12 @@ LSQ::LSQRequest::makePacket()
if (packet) if (packet)
return; return;
// if the translation faulted, do not create a packet
if (fault != NoFault) {
assert(packet == NULL);
return;
}
packet = makePacketForRequest(request, isLoad, this, data); packet = makePacketForRequest(request, isLoad, this, data);
/* Null the ret data so we know not to deallocate it when the /* Null the ret data so we know not to deallocate it when the
* ret is destroyed. The data now belongs to the ret and * ret is destroyed. The data now belongs to the ret and

View file

@ -255,10 +255,6 @@ class Packet : public Printable
// Snoop response flags // Snoop response flags
MEM_INHIBIT = 0x00000008, MEM_INHIBIT = 0x00000008,
/// Are the 'addr' and 'size' fields valid?
VALID_ADDR = 0x00000100,
VALID_SIZE = 0x00000200,
/// Is the data pointer set to a value that shouldn't be freed /// Is the data pointer set to a value that shouldn't be freed
/// when the packet is destroyed? /// when the packet is destroyed?
STATIC_DATA = 0x00001000, STATIC_DATA = 0x00001000,
@ -523,7 +519,7 @@ class Packet : public Printable
void copyError(Packet *pkt) { assert(pkt->isError()); cmd = pkt->cmd; } void copyError(Packet *pkt) { assert(pkt->isError()); cmd = pkt->cmd; }
Addr getAddr() const { assert(flags.isSet(VALID_ADDR)); return addr; } Addr getAddr() const { return addr; }
/** /**
* Update the address of this packet mid-transaction. This is used * Update the address of this packet mid-transaction. This is used
* by the address mapper to change an already set address to a new * by the address mapper to change an already set address to a new
@ -531,9 +527,9 @@ class Packet : public Printable
* an existing address, so it asserts that the current address is * an existing address, so it asserts that the current address is
* valid. * valid.
*/ */
void setAddr(Addr _addr) { assert(flags.isSet(VALID_ADDR)); addr = _addr; } void setAddr(Addr _addr) { addr = _addr; }
unsigned getSize() const { assert(flags.isSet(VALID_SIZE)); return size; } unsigned getSize() const { return size; }
Addr getOffset(unsigned int blk_size) const Addr getOffset(unsigned int blk_size) const
{ {
@ -545,11 +541,7 @@ class Packet : public Printable
return getAddr() & ~(Addr(blk_size - 1)); return getAddr() & ~(Addr(blk_size - 1));
} }
bool isSecure() const bool isSecure() const { return _isSecure; }
{
assert(flags.isSet(VALID_ADDR));
return _isSecure;
}
/** /**
* It has been determined that the SC packet should successfully update * It has been determined that the SC packet should successfully update
@ -577,43 +569,28 @@ class Packet : public Printable
/** /**
* Constructor. Note that a Request object must be constructed * Constructor. Note that a Request object must be constructed
* first, but the Requests's physical address and size fields need * first, and have a valid physical address and size. The command
* not be valid. The command must be supplied. * must be supplied.
*/ */
Packet(const RequestPtr _req, MemCmd _cmd) Packet(const RequestPtr _req, MemCmd _cmd)
: cmd(_cmd), req(_req), data(nullptr), addr(0), _isSecure(false), : cmd(_cmd), req(_req), data(nullptr), addr(req->getPaddr()),
size(0), headerDelay(0), payloadDelay(0), _isSecure(req->isSecure()), size(req->getSize()),
senderState(NULL)
{
if (req->hasPaddr()) {
addr = req->getPaddr();
flags.set(VALID_ADDR);
_isSecure = req->isSecure();
}
if (req->hasSize()) {
size = req->getSize();
flags.set(VALID_SIZE);
}
}
/**
* Alternate constructor if you are trying to create a packet with
* a request that is for a whole block, not the address from the
* req. this allows for overriding the size/addr of the req.
*/
Packet(const RequestPtr _req, MemCmd _cmd, int _blkSize)
: cmd(_cmd), req(_req), data(nullptr), addr(0), _isSecure(false),
headerDelay(0), payloadDelay(0), headerDelay(0), payloadDelay(0),
senderState(NULL) senderState(NULL)
{ { }
if (req->hasPaddr()) {
addr = req->getPaddr() & ~(_blkSize - 1); /**
flags.set(VALID_ADDR); * Alternate constructor when creating a packet that is for a
_isSecure = req->isSecure(); * whole block. This allows for overriding the size and addr of
} * the request.
size = _blkSize; */
flags.set(VALID_SIZE); Packet(const RequestPtr _req, MemCmd _cmd, unsigned _blkSize)
} : cmd(_cmd), req(_req), data(nullptr),
addr(_req->getPaddr() & ~Addr(_blkSize - 1)),
_isSecure(_req->isSecure()), size(_blkSize),
headerDelay(0), payloadDelay(0),
senderState(NULL)
{ }
/** /**
* Alternate constructor for copying a packet. Copy all fields * Alternate constructor for copying a packet. Copy all fields
@ -634,8 +611,6 @@ class Packet : public Printable
if (!clear_flags) if (!clear_flags)
flags.set(pkt->flags & COPY_FLAGS); flags.set(pkt->flags & COPY_FLAGS);
flags.set(pkt->flags & (VALID_ADDR|VALID_SIZE));
// should we allocate space for data, or not, the express // should we allocate space for data, or not, the express
// snoops do not need to carry any data as they only serve to // snoops do not need to carry any data as they only serve to
// co-ordinate state changes // co-ordinate state changes
@ -757,16 +732,6 @@ class Packet : public Printable
} }
} }
void
setSize(unsigned size)
{
assert(!flags.isSet(VALID_SIZE));
this->size = size;
flags.set(VALID_SIZE);
}
public: public:
/** /**
* @{ * @{