24.21.2.2. gem5 Request
One good way to think about Request vs Packet could be "it is what the instruction definitions see", a bit like ExecContext vs ThreadContext.
Request is passed to the constructor of Packet, and Packet keeps a reference to it:
Packet(const RequestPtr &_req, MemCmd _cmd)
: cmd(_cmd), id((PacketId)_req.get()), req(_req),
data(nullptr), addr(0), _isSecure(false), size(0),
_qosValue(0), headerDelay(0), snoopDelay(0),
payloadDelay(0), 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);
}
}
where RequestPtr is defined as:
typedef std::shared_ptr<Request> RequestPtr;
so we see that shared pointers to requests are basically passed around.
Some key fields include:
-
_paddr:/** * The physical address of the request. Valid only if validPaddr * is set. */ Addr _paddr = 0; -
_vaddr:/** The virtual address of the request. */ Addr _vaddr = MaxAddr;