diff options
author | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 13:05:46 -0500 |
---|---|---|
committer | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 13:05:46 -0500 |
commit | 52ff37caa3dc434baa0468f13ac609430f078982 (patch) | |
tree | c5d1ff3172fa4ba3069741d1110aa043bafa1b91 /src/cpu/thread_context.hh | |
parent | fca4fea769c09add919099e5ede694145c5c5f77 (diff) | |
download | gem5-52ff37caa3dc434baa0468f13ac609430f078982.tar.xz |
cpu: Fix broken thread context handover
The thread context handover code used to break when multiple handovers
were performed during the same quiesce period. Previously, the thread
contexts would assign the TC pointer in the old quiesce event to the
new TC. This obviously broke in cases where multiple switches were
performed within the same quiesce period, in which case the TC pointer
in the quiesce event would point to an old CPU.
The new implementation deschedules pending quiesce events in the old
TC and schedules a new quiesce event in the new TC. The code has been
refactored to remove most of the code duplication.
Diffstat (limited to 'src/cpu/thread_context.hh')
-rw-r--r-- | src/cpu/thread_context.hh | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh index c54076c8a..dbe3c0ce8 100644 --- a/src/cpu/thread_context.hh +++ b/src/cpu/thread_context.hh @@ -481,4 +481,17 @@ void unserialize(ThreadContext &tc, Checkpoint *cp, const std::string §ion); /** @} */ + +/** + * Copy state between thread contexts in preparation for CPU handover. + * + * @note This method modifies the old thread contexts as well as the + * new thread context. The old thread context will have its quiesce + * event descheduled if it is scheduled and its status set to halted. + * + * @param new_tc Destination ThreadContext. + * @param old_tc Source ThreadContext. + */ +void takeOverFrom(ThreadContext &new_tc, ThreadContext &old_tc); + #endif |