]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
locks: bakery: add a DMB to the 'read_cache_op' macro
authorVarun Wadekar <vwadekar@nvidia.com>
Fri, 29 Jun 2018 20:34:51 +0000 (13:34 -0700)
committerVarun Wadekar <vwadekar@nvidia.com>
Fri, 6 Mar 2020 16:53:33 +0000 (08:53 -0800)
ARM has a weak memory ordering model. This means that without
explicit barriers, memory accesses can be observed differently
than program order. In this case, the cache invalidate instruction
can be observed after the subsequent read to address.

To solve this, a DMB instruction is required between the cache
invalidate and the read. This ensures that the cache invalidate
completes before all memory accesses in program order after the DMB.

This patch updates the 'read_cache_op' macro to issue a DMB after
the cache invalidate instruction to fix this anomaly.

Change-Id: Iac9a90d228c57ba8bcdca7e409ea6719546ab441
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
lib/locks/bakery/bakery_lock_normal.c

index caced8f4644391925aa93ded889398bfc99ed7d4..0605fceb957a78f0eeebe5e236e6b6acb66ad3de 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2020, NVIDIA Corporation. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -77,6 +78,8 @@ static inline void read_cache_op(uintptr_t addr, bool cached)
 {
        if (cached)
                dccivac(addr);
+
+       dmbish();
 }
 
 /* Helper function to check if the lock is acquired */