diff -r 24cfe67c0749 -r d470799261e2 src/arch/null/cpu_dummy.hh --- a/src/arch/null/cpu_dummy.hh Mon Mar 03 14:44:57 2014 +0100 +++ b/src/arch/null/cpu_dummy.hh Thu Mar 06 15:27:00 2014 +0000 @@ -47,6 +47,7 @@ public: static int numSimulatedInsts() { return 0; } static int numSimulatedOps() { return 0; } + static void wakeup() { ; } }; #endif // __ARCH_NULL_CPU_DUMMY_HH__ diff -r 24cfe67c0749 -r d470799261e2 src/mem/abstract_mem.cc --- a/src/mem/abstract_mem.cc Mon Mar 03 14:44:57 2014 +0100 +++ b/src/mem/abstract_mem.cc Thu Mar 06 15:27:00 2014 +0000 @@ -44,6 +44,8 @@ #include "arch/registers.hh" #include "config/the_isa.hh" +#include "cpu/base.hh" +#include "cpu/thread_context.hh" #include "debug/LLSC.hh" #include "debug/MemoryAccess.hh" #include "mem/abstract_mem.hh" @@ -260,6 +262,12 @@ if (i->addr == paddr) { DPRINTF(LLSC, "Erasing lock record: context %d addr %#x\n", i->contextId, paddr); + // For ARM, 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. + system()->getThreadContext(i->contextId)->getCpuPtr()->wakeup(); i = lockedAddrList.erase(i); } else { i++;