cpu: stop scheduling suspended threads in all stages of MinorCPU

This patch makes suspended threads non-schedulable in Fetch1, Fetch2,
Decode and Execute stages in MinorCPU.

Change-Id: Ie79857e13b7b782d9c58c32310993a132b609cf9
Reviewed-on: https://gem5-review.googlesource.com/c/9625
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Giacomo Gabrielli <giacomo.gabrielli@gmail.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Tuan Ta
2018-04-02 16:22:01 -04:00
parent e74921edd5
commit 6a6668bbc4
3 changed files with 14 additions and 4 deletions

View File

@@ -314,7 +314,9 @@ Decode::getScheduledThread()
}
for (auto tid : priority_list) {
if (getInput(tid) && !decodeInfo[tid].blocked) {
if (cpu.getContext(tid)->status() == ThreadContext::Active &&
getInput(tid) &&
!decodeInfo[tid].blocked) {
threadPriority = tid;
return tid;
}

View File

@@ -1676,7 +1676,12 @@ Execute::getCommittingThread()
for (auto tid : priority_list) {
ExecuteThreadInfo &ex_info = executeInfo[tid];
bool can_commit_insts = !ex_info.inFlightInsts->empty();
bool is_thread_active =
cpu.getContext(tid)->status() == ThreadContext::Active;
bool can_commit_insts = !ex_info.inFlightInsts->empty() &&
is_thread_active;
if (can_commit_insts) {
QueuedInst *head_inflight_inst = &(ex_info.inFlightInsts->front());
MinorDynInstPtr inst = head_inflight_inst->inst;
@@ -1742,7 +1747,8 @@ Execute::getIssuingThread()
}
for (auto tid : priority_list) {
if (getInput(tid)) {
if (cpu.getContext(tid)->status() == ThreadContext::Active &&
getInput(tid)) {
issuePriority = tid;
return tid;
}

View File

@@ -584,7 +584,9 @@ Fetch2::getScheduledThread()
}
for (auto tid : priority_list) {
if (getInput(tid) && !fetchInfo[tid].blocked) {
if (cpu.getContext(tid)->status() == ThreadContext::Active &&
getInput(tid) &&
!fetchInfo[tid].blocked) {
threadPriority = tid;
return tid;
}