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/sim/system.hh | |
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/sim/system.hh')
-rw-r--r-- | src/sim/system.hh | 61 |
1 files changed, 52 insertions, 9 deletions
diff --git a/src/sim/system.hh b/src/sim/system.hh index d1b79bbf4..05b1f2077 100644 --- a/src/sim/system.hh +++ b/src/sim/system.hh @@ -120,20 +120,63 @@ class System : public MemObject BaseMasterPort& getMasterPort(const std::string &if_name, PortID idx = InvalidPortID); - static const char *MemoryModeStrings[3]; + static const char *MemoryModeStrings[4]; - Enums::MemoryMode - getMemoryMode() - { - assert(memoryMode); - return memoryMode; + /** @{ */ + /** + * Is the system in atomic mode? + * + * There are currently two different atomic memory modes: + * 'atomic', which supports caches; and 'atomic_noncaching', which + * bypasses caches. The latter is used by hardware virtualized + * CPUs. SimObjects are expected to use Port::sendAtomic() and + * Port::recvAtomic() when accessing memory in this mode. + */ + bool isAtomicMode() const { + return memoryMode == Enums::atomic || + memoryMode == Enums::atomic_noncaching; } - /** Change the memory mode of the system. This should only be called by the - * python!! - * @param mode Mode to change to (atomic/timing) + /** + * Is the system in timing mode? + * + * SimObjects are expected to use Port::sendTiming() and + * Port::recvTiming() when accessing memory in this mode. + */ + bool isTimingMode() const { + return memoryMode == Enums::timing; + } + + /** + * Should caches be bypassed? + * + * Some CPUs need to bypass caches to allow direct memory + * accesses, which is required for hardware virtualization. + */ + bool bypassCaches() const { + return memoryMode == Enums::atomic_noncaching; + } + /** @} */ + + /** @{ */ + /** + * Get the memory mode of the system. + * + * \warn This should only be used by the Python world. The C++ + * world should use one of the query functions above + * (isAtomicMode(), isTimingMode(), bypassCaches()). + */ + Enums::MemoryMode getMemoryMode() const { return memoryMode; } + + /** + * Change the memory mode of the system. + * + * \warn This should only be called by the Python! + * + * @param mode Mode to change to (atomic/timing/...) */ void setMemoryMode(Enums::MemoryMode mode); + /** @} */ PCEventQueue pcEventQueue; |