summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authorAnouk Van Laer <anouk.vanlaer@arm.com>2017-04-06 15:38:07 +0100
committerAnouk Van Laer <anouk.vanlaer@arm.com>2017-07-17 17:50:52 +0000
commitdb522eb930020a7a9caf1ea6e289fc81a0bcc842 (patch)
tree368fb65a256a1231291ac06975491b377f689b87 /src/cpu
parenteeb8ade6c25feacbccc6bfce3ad07077b668bd89 (diff)
downloadgem5-db522eb930020a7a9caf1ea6e289fc81a0bcc842.tar.xz
cpu,o3: Fixed checkpointing bug occuring in the o3 CPU
Checkpointing a system with out-of-order CPUs might get stuck if one of the CPUs has been put to sleep. The quiesce instruction cannot get drained hence checkpointing never finishes. This commit resolves that by activating all suspended thread contexts when draining the system. Change-Id: I817ab1672b4ead777bd8e12a0445829481c46fdc Reviewed-by: Sascha Bischoff <sascha.bischoff@arm.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/3970 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/o3/cpu.cc13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc
index 09790f4ce..0695711f1 100644
--- a/src/cpu/o3/cpu.cc
+++ b/src/cpu/o3/cpu.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2012, 2014, 2016 ARM Limited
+ * Copyright (c) 2011-2012, 2014, 2016, 2017 ARM Limited
* Copyright (c) 2013 Advanced Micro Devices, Inc.
* All rights reserved
*
@@ -1048,6 +1048,17 @@ FullO3CPU<Impl>::drain()
// Wake the CPU and record activity so everything can drain out if
// the CPU was not able to immediately drain.
if (!isDrained()) {
+ // If a thread is suspended, wake it up so it can be drained
+ for (auto t : threadContexts) {
+ if (t->status() == ThreadContext::Suspended){
+ DPRINTF(Drain, "Currently suspended so activate %i \n",
+ t->threadId());
+ t->activate();
+ // As the thread is now active, change the power state as well
+ activateContext(t->threadId());
+ }
+ }
+
wakeCPU();
activityRec.activity();