LCOV - code coverage report
Current view: top level - zephyr/sys - barrier.h Hit Total Coverage
Test: new.info Lines: 3 4 75.0 %
Date: 2024-12-21 18:13:37

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2023 Carlo Caione <ccaione@baylibre.com>
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_SYS_BARRIER_H_
       8             : #define ZEPHYR_INCLUDE_SYS_BARRIER_H_
       9             : 
      10             : #include <zephyr/toolchain.h>
      11             : 
      12             : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH)
      13             : # if defined(CONFIG_ARM)
      14             : # include <zephyr/arch/arm/barrier.h>
      15             : # elif defined(CONFIG_ARM64)
      16             : # include <zephyr/arch/arm64/barrier.h>
      17             : # endif
      18             : #elif defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
      19             : #include <zephyr/sys/barrier_builtin.h>
      20             : #endif
      21             : 
      22             : #ifdef __cplusplus
      23             : extern "C" {
      24             : #endif
      25             : 
      26             : /**
      27             :  * @addtogroup barrier_apis Barrier Services APIs
      28             :  * @since 3.4
      29             :  * @version 0.1.0
      30             :  * @ingroup kernel_apis
      31             :  * @{
      32             :  */
      33             : 
      34             : /**
      35             :  * @brief Full/sequentially-consistent data memory barrier.
      36             :  *
      37             :  * This routine acts as a synchronization fence between threads and prevents
      38             :  * re-ordering of data accesses instructions across the barrier instruction.
      39             :  */
      40           1 : static ALWAYS_INLINE void barrier_dmem_fence_full(void)
      41             : {
      42             : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH) || defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
      43             :         z_barrier_dmem_fence_full();
      44             : #endif
      45             : }
      46             : 
      47             : /**
      48             :  * @brief Full/sequentially-consistent data synchronization barrier.
      49             :  *
      50             :  * This routine acts as a synchronization fence between threads and prevents
      51             :  * re-ordering of data accesses instructions across the barrier instruction
      52             :  * like @ref barrier_dmem_fence_full(), but has the additional effect of
      53             :  * blocking execution of any further instructions, not just loads or stores, or
      54             :  * both, until synchronization is complete.
      55             :  *
      56             :  * @note When not supported by hardware or architecture, this instruction falls
      57             :  * back to a full/sequentially-consistent data memory barrier.
      58             :  */
      59           1 : static ALWAYS_INLINE void barrier_dsync_fence_full(void)
      60             : {
      61             : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH) || defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
      62             :         z_barrier_dsync_fence_full();
      63             : #endif
      64             : }
      65             : 
      66             : /**
      67             :  * @brief Full/sequentially-consistent instruction synchronization barrier.
      68             :  *
      69             :  * This routine is used to guarantee that any subsequent instructions are
      70             :  * fetched and to ensure any previously executed context-changing operations,
      71             :  * such as writes to system control registers, have completed by the time the
      72             :  * routine completes. In hardware terms, this might mean that the instruction
      73             :  * pipeline is flushed, for example.
      74             :  *
      75             :  * @note When not supported by hardware or architecture, this instruction falls
      76             :  * back to a compiler barrier.
      77             :  */
      78           1 : static ALWAYS_INLINE void barrier_isync_fence_full(void)
      79             : {
      80             : #if defined(CONFIG_BARRIER_OPERATIONS_ARCH) || defined(CONFIG_BARRIER_OPERATIONS_BUILTIN)
      81             :         z_barrier_isync_fence_full();
      82             : #endif
      83             : }
      84             : 
      85             : /** @} */
      86             : 
      87             : #ifdef __cplusplus
      88             : } /* extern "C" */
      89             : #endif
      90             : 
      91             : #endif /* ZEPHYR_INCLUDE_SYS_ATOMIC_H_ */

Generated by: LCOV version 1.14