diff options
author | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-02-15 17:40:09 -0500 |
---|---|---|
committer | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-02-15 17:40:09 -0500 |
commit | b904bd5437ead0dfc2c4c0977f3d29d63299c601 (patch) | |
tree | f7d324fe5c806338534c5e41e9b251d2e62a3132 /src/cpu | |
parent | 1eec115c31395e2819c073a1859d75eb5933dac2 (diff) | |
download | gem5-b904bd5437ead0dfc2c4c0977f3d29d63299c601.tar.xz |
sim: Add a system-global option to bypass caches
Virtualized CPUs and the fastmem mode of the atomic CPU require direct
access to physical memory. We currently require caches to be disabled
when using them to prevent chaos. This is not ideal when switching
between hardware virutalized CPUs and other CPU models as it would
require a configuration change on each switch. This changeset
introduces a new version of the atomic memory mode,
'atomic_noncaching', where memory accesses are inserted into the
memory system as atomic accesses, but bypass caches.
To make memory mode tests cleaner, the following methods are added to
the System class:
* isAtomicMode() -- True if the memory mode is 'atomic' or 'direct'.
* isTimingMode() -- True if the memory mode is 'timing'.
* bypassCaches() -- True if caches should be bypassed.
The old getMemoryMode() and setMemoryMode() methods should never be
used from the C++ world anymore.
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/inorder/cpu.cc | 2 | ||||
-rw-r--r-- | src/cpu/o3/cpu.cc | 2 | ||||
-rw-r--r-- | src/cpu/simple/atomic.cc | 2 | ||||
-rw-r--r-- | src/cpu/simple/timing.cc | 2 | ||||
-rw-r--r-- | src/cpu/testers/traffic_gen/traffic_gen.cc | 6 |
5 files changed, 6 insertions, 8 deletions
diff --git a/src/cpu/inorder/cpu.cc b/src/cpu/inorder/cpu.cc index 5490cb3f2..1ba8e55b6 100644 --- a/src/cpu/inorder/cpu.cc +++ b/src/cpu/inorder/cpu.cc @@ -812,7 +812,7 @@ InOrderCPU::init() void InOrderCPU::verifyMemoryMode() const { - if (system->getMemoryMode() != Enums::timing) { + if (!system->isTimingMode()) { fatal("The in-order CPU requires the memory system to be in " "'timing' mode.\n"); } diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc index 53250d495..9caa49ad6 100644 --- a/src/cpu/o3/cpu.cc +++ b/src/cpu/o3/cpu.cc @@ -1316,7 +1316,7 @@ template <class Impl> void FullO3CPU<Impl>::verifyMemoryMode() const { - if (system->getMemoryMode() != Enums::timing) { + if (!system->isTimingMode()) { fatal("The O3 CPU requires the memory system to be in " "'timing' mode.\n"); } diff --git a/src/cpu/simple/atomic.cc b/src/cpu/simple/atomic.cc index 7a0778961..d7c4190ee 100644 --- a/src/cpu/simple/atomic.cc +++ b/src/cpu/simple/atomic.cc @@ -212,7 +212,7 @@ AtomicSimpleCPU::takeOverFrom(BaseCPU *oldCPU) void AtomicSimpleCPU::verifyMemoryMode() const { - if (system->getMemoryMode() != Enums::atomic) { + if (!system->isAtomicMode()) { fatal("The atomic CPU requires the memory system to be in " "'atomic' mode.\n"); } diff --git a/src/cpu/simple/timing.cc b/src/cpu/simple/timing.cc index 7423d082c..ab4ea9256 100644 --- a/src/cpu/simple/timing.cc +++ b/src/cpu/simple/timing.cc @@ -191,7 +191,7 @@ TimingSimpleCPU::takeOverFrom(BaseCPU *oldCPU) void TimingSimpleCPU::verifyMemoryMode() const { - if (system->getMemoryMode() != Enums::timing) { + if (!system->isTimingMode()) { fatal("The timing CPU requires the memory system to be in " "'timing' mode.\n"); } diff --git a/src/cpu/testers/traffic_gen/traffic_gen.cc b/src/cpu/testers/traffic_gen/traffic_gen.cc index 34e3b2c1e..d9d040858 100644 --- a/src/cpu/testers/traffic_gen/traffic_gen.cc +++ b/src/cpu/testers/traffic_gen/traffic_gen.cc @@ -83,10 +83,8 @@ TrafficGen::init() if (!port.isConnected()) fatal("The port of %s is not connected!\n", name()); - Enums::MemoryMode mode = system->getMemoryMode(); - // if the system is in timing mode active the request generator - if (mode == Enums::timing) { + if (system->isTimingMode()) { DPRINTF(TrafficGen, "Timing mode, activating request generator\n"); // enter initial state @@ -101,7 +99,7 @@ void TrafficGen::initState() { // when not restoring from a checkpoint, make sure we kick things off - if (system->getMemoryMode() == Enums::timing) { + if (system->isTimingMode()) { Tick nextStateGraphEvent = stateGraph.nextEventTick(); schedule(updateStateGraphEvent, nextStateGraphEvent); } else { |