base: memory barriers in lock implementations
The memory barrier prevents the compiler from changing the program order of memory accesses in such a way that accesses to the guarded resource get outside the guarded stage. As cmpxchg() defines the start of the guarded stage it also represents an effective memory barrier. On x86, the architecture ensures to not reorder writes with older reads, writes to memory with other writes (except in cases that are not relevant for our locks), or read/write instructions with I/O instructions, locked instructions, and serializing instructions. However on ARM, the architectural memory model allows not only that memory accesses take local effect in another order as their program order but also that different observers (components that can access memory like data-busses, TLBs and branch predictors) observe these effects each in another order. Thus, a correct program order isn't sufficient for a correct observation order. An additional architectural preservation of the memory barrier is needed to achieve this. Fixes #692
This commit is contained in:
committed by
Christian Helmuth
parent
d452f37c25
commit
ec6c19a487
@@ -14,6 +14,7 @@
|
||||
/* Genode includes */
|
||||
#include <base/cancelable_lock.h>
|
||||
#include <cpu/atomic.h>
|
||||
#include <cpu/memory_barrier.h>
|
||||
#include <base/printf.h>
|
||||
|
||||
/* L4/Fiasco includes */
|
||||
@@ -46,5 +47,6 @@ void Cancelable_lock::lock()
|
||||
|
||||
void Cancelable_lock::unlock()
|
||||
{
|
||||
Genode::memory_barrier();
|
||||
_lock = UNLOCKED;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user