diff options
author | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2017-06-13 11:14:00 +0100 |
---|---|---|
committer | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2017-10-13 08:41:08 +0000 |
commit | b10a0092aecbc6927e9a2336188615ed97614fd0 (patch) | |
tree | d566b7e712bb7573de3aee0599d9ea5f5c1e4127 /src/arch/arm | |
parent | 64b8feeb0e70c7e138d7e9485ccacb7fd39ae044 (diff) | |
download | gem5-b10a0092aecbc6927e9a2336188615ed97614fd0.tar.xz |
mem: Signal the local monitor when clearing the global monitor
ARM systems require the coordination of the global and local
monitors. When the system is run without caches the global monitor is
implemented in the abstract memory object. This change adds a callback
from the abstract memory that notifies the local monitor when the
global monitor is cleared.
Additionally, for ARM systems the local monitor signals the event
register and wakes the thread context up. Subsequent wait-for-event
(WFE) instructions will be immediately signaled.
Change-Id: If6c038f3a6bea7239ba4258f07f39c7f9a30500b
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/3760
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/arch/arm')
-rw-r--r-- | src/arch/arm/locked_mem.hh | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/arch/arm/locked_mem.hh b/src/arch/arm/locked_mem.hh index 8aa181245..2fcbc4a92 100644 --- a/src/arch/arm/locked_mem.hh +++ b/src/arch/arm/locked_mem.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013 ARM Limited + * Copyright (c) 2012-2013,2017 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -148,6 +148,20 @@ handleLockedWrite(XC *xc, Request *req, Addr cacheBlockMask) return true; } +template <class XC> +inline void +globalClearExclusive(XC *xc) +{ + // A spinlock would typically include a Wait For Event (WFE) to + // conserve energy. The ARMv8 architecture specifies that an event + // is automatically generated when clearing the exclusive monitor + // to wake up the processor in WFE. + DPRINTF(LLSC,"Clearing lock and signaling sev\n"); + xc->setMiscReg(MISCREG_LOCKFLAG, false); + // Implement ARMv8 WFE/SEV semantics + xc->setMiscReg(MISCREG_SEV_MAILBOX, true); + xc->getCpuPtr()->wakeup(xc->threadId()); +} } // namespace ArmISA |