Hi Everyone,
I started digging into the memory system to figure out how ASIs and
ASIDs are used. First of all, ASIDs are stored in a separate field in a
Request, while ASIs are a part of the flags field. To add even more
confusion, there is a separate context ID and thread ID field. What I've
found so far is that the concepts are used in, at least, three different
ways:
* The O3 CPU sets the ASID field in instruction fetch and data fetch
requests to the thread ID. This is zero unless it is simulating an SMT.
* The Simple CPUs set ASIDs to zero.
* The in-order CPU has an array to map between TIDs and ASIDs. It's
hard-coded to a unit mapping, which means it behaves like the O3 CPU.
* ARM sets the ASID field in the TLB. This is set to the value in the
asid field in CONTEXTIDR. I'm not sure if this is ever used as there is
no call to getAsid().
* SPARC has its own ASI field as a part of the flags field in Request.
This seems orthogonal to the ASID field.
* There is a separate thread ID the Request struct. I'm not sure what
it's used for, but it doesn't seem to be related to ASIDs. Why isn't
this used to distinguish between SMT threads?
Could anyone please clarify how things are used here and how they are
supposed to be used? I find it all terribly confusing.
Why do we even have a separate notion of ASID and ASI? Why not use the
ASID field for anything to do with architected ASIDs and the thread ID
field to distinguish between threads in an SMT configuration?
Are ASIDs ever used for anything? There isn't a single reference to the
Request::getAsid() method.
//Andreas
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev