cpu: Check that the memory system is in the correct mode
This patch adds checks to all CPU models to make sure that the memory system is in the correct mode at startup and when resuming after a drain. Previously, we only checked that the memory system was in the right mode when resuming. This is inadequate since this is a configuration error that should be detected at startup as well as when resuming. Additionally, since the check was done using an assert, it wasn't performed when NDEBUG was set (e.g., the fast target).
This commit is contained in:
parent
94561dd526
commit
7eb0fb8b6e
4 changed files with 36 additions and 3 deletions
|
@ -787,6 +787,12 @@ InOrderCPU::init()
|
|||
{
|
||||
BaseCPU::init();
|
||||
|
||||
if (!params()->defer_registration &&
|
||||
system->getMemoryMode() != Enums::timing) {
|
||||
fatal("The in-order CPU requires the memory system to be in "
|
||||
"'timing' mode.\n");
|
||||
}
|
||||
|
||||
for (ThreadID tid = 0; tid < numThreads; ++tid) {
|
||||
// Set noSquashFromTC so that the CPU doesn't squash when initially
|
||||
// setting up registers.
|
||||
|
|
|
@ -647,6 +647,12 @@ FullO3CPU<Impl>::init()
|
|||
{
|
||||
BaseCPU::init();
|
||||
|
||||
if (!params()->defer_registration &&
|
||||
system->getMemoryMode() != Enums::timing) {
|
||||
fatal("The O3 CPU requires the memory system to be in "
|
||||
"'timing' mode.\n");
|
||||
}
|
||||
|
||||
for (ThreadID tid = 0; tid < numThreads; ++tid) {
|
||||
// Set noSquashFromTC so that the CPU doesn't squash when initially
|
||||
// setting up registers.
|
||||
|
@ -1174,7 +1180,10 @@ FullO3CPU<Impl>::drainResume()
|
|||
if (_status == SwitchedOut)
|
||||
return;
|
||||
|
||||
assert(system->getMemoryMode() == Enums::timing);
|
||||
if (system->getMemoryMode() != Enums::timing) {
|
||||
fatal("The O3 CPU requires the memory system to be in "
|
||||
"'timing' mode.\n");
|
||||
}
|
||||
|
||||
if (!tickEvent.scheduled())
|
||||
schedule(tickEvent, nextCycle());
|
||||
|
|
|
@ -83,6 +83,12 @@ AtomicSimpleCPU::init()
|
|||
{
|
||||
BaseCPU::init();
|
||||
|
||||
if (!params()->defer_registration &&
|
||||
system->getMemoryMode() != Enums::atomic) {
|
||||
fatal("The atomic CPU requires the memory system to be in "
|
||||
"'atomic' mode.\n");
|
||||
}
|
||||
|
||||
// Initialise the ThreadContext's memory proxies
|
||||
tcBase()->initMemProxies(tcBase());
|
||||
|
||||
|
@ -155,7 +161,10 @@ AtomicSimpleCPU::drainResume()
|
|||
return;
|
||||
|
||||
DPRINTF(SimpleCPU, "Resume\n");
|
||||
assert(system->getMemoryMode() == Enums::atomic);
|
||||
if (system->getMemoryMode() != Enums::atomic) {
|
||||
fatal("The atomic CPU requires the memory system to be in "
|
||||
"'atomic' mode.\n");
|
||||
}
|
||||
|
||||
setDrainState(Drainable::Running);
|
||||
if (thread->status() == ThreadContext::Active) {
|
||||
|
|
|
@ -66,6 +66,12 @@ TimingSimpleCPU::init()
|
|||
{
|
||||
BaseCPU::init();
|
||||
|
||||
if (!params()->defer_registration &&
|
||||
system->getMemoryMode() != Enums::timing) {
|
||||
fatal("The timing CPU requires the memory system to be in "
|
||||
"'timing' mode.\n");
|
||||
}
|
||||
|
||||
// Initialise the ThreadContext's memory proxies
|
||||
tcBase()->initMemProxies(tcBase());
|
||||
|
||||
|
@ -140,7 +146,10 @@ TimingSimpleCPU::drainResume()
|
|||
{
|
||||
DPRINTF(SimpleCPU, "Resume\n");
|
||||
if (_status != SwitchedOut && _status != Idle) {
|
||||
assert(system->getMemoryMode() == Enums::timing);
|
||||
if (system->getMemoryMode() != Enums::timing) {
|
||||
fatal("The timing CPU requires the memory system to be in "
|
||||
"'timing' mode.\n");
|
||||
}
|
||||
|
||||
if (fetchEvent.scheduled())
|
||||
deschedule(fetchEvent);
|
||||
|
|
Loading…
Reference in a new issue