# Linux Kernel Module Cheat

##### 24.21.2.1. gem5 `Packet`

`Packet` is what goes through ports: a single packet is sent out to the memory system, gets modified when it hits valid data, and then returns with the reply.

`Packet` is what CPUs create and send to get memory values. E.g. on gem5 `AtomicSimpleCPU`:

    void
    AtomicSimpleCPU::tick()
    {
        ...
        Packet ifetch_pkt = Packet(ifetch_req, MemCmd::ReadReq);
        ifetch_pkt.dataStatic(&inst);

        icache_latency = sendPacket(icachePort, &ifetch_pkt);

    Tick
    AtomicSimpleCPU::sendPacket(MasterPort &port, const PacketPtr &pkt)
    {
        return port.sendAtomic(pkt);
    }

On TimingSimpleCPU, we note that the packet is dynamically created unlike for the AtomicSimpleCPU, since it must exist across multiple events which happen on separate function calls, unlike atomic memory which is done immediately in a single call:

    void
    TimingSimpleCPU::sendFetch(const Fault &fault, const RequestPtr &req,
                               ThreadContext *tc)
    {
        if (fault == NoFault) {
            DPRINTF(SimpleCPU, "Sending fetch for addr %#x(pa: %#x)\n",
                    req->getVaddr(), req->getPaddr());
            ifetch_pkt = new Packet(req, MemCmd::ReadReq);
            ifetch_pkt->dataStatic(&inst);
            DPRINTF(SimpleCPU, " -- pkt addr: %#x\n", ifetch_pkt->getAddr());

            if (!icachePort.sendTimingReq(ifetch_pkt)) {

It must later delete the return packet that it gets later on, e.g. for the ifetch:

    TimingSimpleCPU::completeIfetch(PacketPtr pkt)
    {
        if (pkt) {
            delete pkt;
        }

The most important properties of a Packet are:

- `PacketDataPtr data;`: the data coming back from a reply packet or being sent via it

- `Addr addr;`: the physical address of the data. TODO comment says could be virtual too, when?

      /// The address of the request.  This address could be virtual or
      /// physical, depending on the system configuration.
      Addr addr;

- `Flags flags;`: flags describing properties of the `Packet`

- `MemCmd cmd;`: see gem5 `MemCmd`

- gem5 <code>MemCmd</code>