# Linux Kernel Module Cheat

##### 24.10.3.4. gem5 stats internals

This describes the internals of the gem5 m5out/stats.txt file.

GDB call stack to `dumpstats`:

    Stats::pythonDump () at build/ARM/python/pybind11/stats.cc:58
    Stats::StatEvent::process() ()
    GlobalEvent::BarrierEvent::process (this=0x555559fa6a80) at build/ARM/sim/global_event.cc:131
    EventQueue::serviceOne (this=this@entry=0x555558c36080) at build/ARM/sim/eventq.cc:228
    doSimLoop (eventq=0x555558c36080) at build/ARM/sim/simulate.cc:219
    simulate (num_cycles=<optimized out>) at build/ARM/sim/simulate.cc:132

`Stats::pythonDump` does:

    void
    pythonDump()
    {
        py::module m = py::module::import("m5.stats");
        m.attr("dump")();
    }

This calls `src/python/m5/stats/init.py` in `def dump` does the main dumping

That function does notably:

        for output in outputList:
            if output.valid():
                output.begin()
                for stat in stats_list:
                    stat.visit(output)
                output.end()

`begin` and `end` are defined in C++ and output the header and tail respectively

    void
    Text::begin()
    {
        ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
    }

    void
    Text::end()
    {
        ccprintf(*stream, "\n---------- End Simulation Statistics   ----------\n");
        stream->flush();
    }

`stats_list` contains the stats, and `stat.visit` prints them, `outputList` contains by default just the text output. I don’t see any other types of output in gem5, but likely JSON / binary formats could be envisioned.

Tested in gem5 b4879ae5b0b6644e6836b0881e4da05c64a6550d.