24.22.6.2. gem5 ThreadState
Owned one per ThreadContext.
Many ThreadContext methods simply forward to ThreadState implementations.
SimpleThread inherits from ThreadState, and forwards to it on several methods e.g.:
    int cpuId() const override { return ThreadState::cpuId(); }
    uint32_t socketId() const override { return ThreadState::socketId(); }
    int threadId() const override { return ThreadState::threadId(); }
    void setThreadId(int id) override { ThreadState::setThreadId(id); }
    ContextID contextId() const override { return ThreadState::contextId(); }
    void setContextId(ContextID id) override { ThreadState::setContextId(id); }
O3ThreadContext on the other hand contains an O3ThreadState:
template <class Impl> struct O3ThreadState : public ThreadState
at:
template <class Impl>
class O3ThreadContext : public ThreadContext
{
    O3ThreadState<Impl> *thread
    ContextID contextId() const override { return thread->contextId(); }
    void setContextId(ContextID id) override { thread->setContextId(id); }