LCOV - code coverage report
Current view: top level - arch/arm64/include/asm - atomic.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwa @ Mon Jul 31 20:08:17 PDT 2023 Lines: 14 14 100.0 %
Date: 2023-07-31 20:08:17 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-only */
       2             : /*
       3             :  * Based on arch/arm/include/asm/atomic.h
       4             :  *
       5             :  * Copyright (C) 1996 Russell King.
       6             :  * Copyright (C) 2002 Deep Blue Solutions Ltd.
       7             :  * Copyright (C) 2012 ARM Ltd.
       8             :  */
       9             : #ifndef __ASM_ATOMIC_H
      10             : #define __ASM_ATOMIC_H
      11             : 
      12             : #include <linux/compiler.h>
      13             : #include <linux/types.h>
      14             : 
      15             : #include <asm/barrier.h>
      16             : #include <asm/cmpxchg.h>
      17             : #include <asm/lse.h>
      18             : 
      19             : #define ATOMIC_OP(op)                                                   \
      20             : static __always_inline void arch_##op(int i, atomic_t *v)               \
      21             : {                                                                       \
      22             :         __lse_ll_sc_body(op, i, v);                                     \
      23             : }
      24             : 
      25             : ATOMIC_OP(atomic_andnot)
      26             : ATOMIC_OP(atomic_or)
      27             : ATOMIC_OP(atomic_xor)
      28 >14396*10^7 : ATOMIC_OP(atomic_add)
      29             : ATOMIC_OP(atomic_and)
      30 74736591996 : ATOMIC_OP(atomic_sub)
      31             : 
      32             : #undef ATOMIC_OP
      33             : 
      34             : #define ATOMIC_FETCH_OP(name, op)                                       \
      35             : static __always_inline int arch_##op##name(int i, atomic_t *v)          \
      36             : {                                                                       \
      37             :         return __lse_ll_sc_body(op##name, i, v);                        \
      38             : }
      39             : 
      40             : #define ATOMIC_FETCH_OPS(op)                                            \
      41             :         ATOMIC_FETCH_OP(_relaxed, op)                                   \
      42             :         ATOMIC_FETCH_OP(_acquire, op)                                   \
      43             :         ATOMIC_FETCH_OP(_release, op)                                   \
      44             :         ATOMIC_FETCH_OP(        , op)
      45             : 
      46             : ATOMIC_FETCH_OPS(atomic_fetch_andnot)
      47             : ATOMIC_FETCH_OPS(atomic_fetch_or)
      48             : ATOMIC_FETCH_OPS(atomic_fetch_xor)
      49    10182240 : ATOMIC_FETCH_OPS(atomic_fetch_add)
      50             : ATOMIC_FETCH_OPS(atomic_fetch_and)
      51    14064969 : ATOMIC_FETCH_OPS(atomic_fetch_sub)
      52  1412418689 : ATOMIC_FETCH_OPS(atomic_add_return)
      53 16896642763 : ATOMIC_FETCH_OPS(atomic_sub_return)
      54             : 
      55             : #undef ATOMIC_FETCH_OP
      56             : #undef ATOMIC_FETCH_OPS
      57             : 
      58             : #define ATOMIC64_OP(op)                                                 \
      59             : static __always_inline void arch_##op(long i, atomic64_t *v)            \
      60             : {                                                                       \
      61             :         __lse_ll_sc_body(op, i, v);                                     \
      62             : }
      63             : 
      64 16091110893 : ATOMIC64_OP(atomic64_andnot)
      65  7329420335 : ATOMIC64_OP(atomic64_or)
      66             : ATOMIC64_OP(atomic64_xor)
      67   178795450 : ATOMIC64_OP(atomic64_add)
      68             : ATOMIC64_OP(atomic64_and)
      69    67536443 : ATOMIC64_OP(atomic64_sub)
      70             : 
      71             : #undef ATOMIC64_OP
      72             : 
      73             : #define ATOMIC64_FETCH_OP(name, op)                                     \
      74             : static __always_inline long arch_##op##name(long i, atomic64_t *v)      \
      75             : {                                                                       \
      76             :         return __lse_ll_sc_body(op##name, i, v);                        \
      77             : }
      78             : 
      79             : #define ATOMIC64_FETCH_OPS(op)                                          \
      80             :         ATOMIC64_FETCH_OP(_relaxed, op)                                 \
      81             :         ATOMIC64_FETCH_OP(_acquire, op)                                 \
      82             :         ATOMIC64_FETCH_OP(_release, op)                                 \
      83             :         ATOMIC64_FETCH_OP(        , op)
      84             : 
      85  2013339292 : ATOMIC64_FETCH_OPS(atomic64_fetch_andnot)
      86  6627077727 : ATOMIC64_FETCH_OPS(atomic64_fetch_or)
      87             : ATOMIC64_FETCH_OPS(atomic64_fetch_xor)
      88             : ATOMIC64_FETCH_OPS(atomic64_fetch_add)
      89             : ATOMIC64_FETCH_OPS(atomic64_fetch_and)
      90             : ATOMIC64_FETCH_OPS(atomic64_fetch_sub)
      91    14435307 : ATOMIC64_FETCH_OPS(atomic64_add_return)
      92  4102347346 : ATOMIC64_FETCH_OPS(atomic64_sub_return)
      93             : 
      94             : #undef ATOMIC64_FETCH_OP
      95             : #undef ATOMIC64_FETCH_OPS
      96             : 
      97             : static __always_inline long arch_atomic64_dec_if_positive(atomic64_t *v)
      98             : {
      99             :         return __lse_ll_sc_body(atomic64_dec_if_positive, v);
     100             : }
     101             : 
     102             : #define arch_atomic_read(v)                     __READ_ONCE((v)->counter)
     103             : #define arch_atomic_set(v, i)                   __WRITE_ONCE(((v)->counter), (i))
     104             : 
     105             : #define arch_atomic_add_return_relaxed          arch_atomic_add_return_relaxed
     106             : #define arch_atomic_add_return_acquire          arch_atomic_add_return_acquire
     107             : #define arch_atomic_add_return_release          arch_atomic_add_return_release
     108             : #define arch_atomic_add_return                  arch_atomic_add_return
     109             : 
     110             : #define arch_atomic_sub_return_relaxed          arch_atomic_sub_return_relaxed
     111             : #define arch_atomic_sub_return_acquire          arch_atomic_sub_return_acquire
     112             : #define arch_atomic_sub_return_release          arch_atomic_sub_return_release
     113             : #define arch_atomic_sub_return                  arch_atomic_sub_return
     114             : 
     115             : #define arch_atomic_fetch_add_relaxed           arch_atomic_fetch_add_relaxed
     116             : #define arch_atomic_fetch_add_acquire           arch_atomic_fetch_add_acquire
     117             : #define arch_atomic_fetch_add_release           arch_atomic_fetch_add_release
     118             : #define arch_atomic_fetch_add                   arch_atomic_fetch_add
     119             : 
     120             : #define arch_atomic_fetch_sub_relaxed           arch_atomic_fetch_sub_relaxed
     121             : #define arch_atomic_fetch_sub_acquire           arch_atomic_fetch_sub_acquire
     122             : #define arch_atomic_fetch_sub_release           arch_atomic_fetch_sub_release
     123             : #define arch_atomic_fetch_sub                   arch_atomic_fetch_sub
     124             : 
     125             : #define arch_atomic_fetch_and_relaxed           arch_atomic_fetch_and_relaxed
     126             : #define arch_atomic_fetch_and_acquire           arch_atomic_fetch_and_acquire
     127             : #define arch_atomic_fetch_and_release           arch_atomic_fetch_and_release
     128             : #define arch_atomic_fetch_and                   arch_atomic_fetch_and
     129             : 
     130             : #define arch_atomic_fetch_andnot_relaxed        arch_atomic_fetch_andnot_relaxed
     131             : #define arch_atomic_fetch_andnot_acquire        arch_atomic_fetch_andnot_acquire
     132             : #define arch_atomic_fetch_andnot_release        arch_atomic_fetch_andnot_release
     133             : #define arch_atomic_fetch_andnot                arch_atomic_fetch_andnot
     134             : 
     135             : #define arch_atomic_fetch_or_relaxed            arch_atomic_fetch_or_relaxed
     136             : #define arch_atomic_fetch_or_acquire            arch_atomic_fetch_or_acquire
     137             : #define arch_atomic_fetch_or_release            arch_atomic_fetch_or_release
     138             : #define arch_atomic_fetch_or                    arch_atomic_fetch_or
     139             : 
     140             : #define arch_atomic_fetch_xor_relaxed           arch_atomic_fetch_xor_relaxed
     141             : #define arch_atomic_fetch_xor_acquire           arch_atomic_fetch_xor_acquire
     142             : #define arch_atomic_fetch_xor_release           arch_atomic_fetch_xor_release
     143             : #define arch_atomic_fetch_xor                   arch_atomic_fetch_xor
     144             : 
     145             : #define arch_atomic_andnot                      arch_atomic_andnot
     146             : 
     147             : /*
     148             :  * 64-bit arch_atomic operations.
     149             :  */
     150             : #define ATOMIC64_INIT                           ATOMIC_INIT
     151             : #define arch_atomic64_read                      arch_atomic_read
     152             : #define arch_atomic64_set                       arch_atomic_set
     153             : 
     154             : #define arch_atomic64_add_return_relaxed        arch_atomic64_add_return_relaxed
     155             : #define arch_atomic64_add_return_acquire        arch_atomic64_add_return_acquire
     156             : #define arch_atomic64_add_return_release        arch_atomic64_add_return_release
     157             : #define arch_atomic64_add_return                arch_atomic64_add_return
     158             : 
     159             : #define arch_atomic64_sub_return_relaxed        arch_atomic64_sub_return_relaxed
     160             : #define arch_atomic64_sub_return_acquire        arch_atomic64_sub_return_acquire
     161             : #define arch_atomic64_sub_return_release        arch_atomic64_sub_return_release
     162             : #define arch_atomic64_sub_return                arch_atomic64_sub_return
     163             : 
     164             : #define arch_atomic64_fetch_add_relaxed         arch_atomic64_fetch_add_relaxed
     165             : #define arch_atomic64_fetch_add_acquire         arch_atomic64_fetch_add_acquire
     166             : #define arch_atomic64_fetch_add_release         arch_atomic64_fetch_add_release
     167             : #define arch_atomic64_fetch_add                 arch_atomic64_fetch_add
     168             : 
     169             : #define arch_atomic64_fetch_sub_relaxed         arch_atomic64_fetch_sub_relaxed
     170             : #define arch_atomic64_fetch_sub_acquire         arch_atomic64_fetch_sub_acquire
     171             : #define arch_atomic64_fetch_sub_release         arch_atomic64_fetch_sub_release
     172             : #define arch_atomic64_fetch_sub                 arch_atomic64_fetch_sub
     173             : 
     174             : #define arch_atomic64_fetch_and_relaxed         arch_atomic64_fetch_and_relaxed
     175             : #define arch_atomic64_fetch_and_acquire         arch_atomic64_fetch_and_acquire
     176             : #define arch_atomic64_fetch_and_release         arch_atomic64_fetch_and_release
     177             : #define arch_atomic64_fetch_and                 arch_atomic64_fetch_and
     178             : 
     179             : #define arch_atomic64_fetch_andnot_relaxed      arch_atomic64_fetch_andnot_relaxed
     180             : #define arch_atomic64_fetch_andnot_acquire      arch_atomic64_fetch_andnot_acquire
     181             : #define arch_atomic64_fetch_andnot_release      arch_atomic64_fetch_andnot_release
     182             : #define arch_atomic64_fetch_andnot              arch_atomic64_fetch_andnot
     183             : 
     184             : #define arch_atomic64_fetch_or_relaxed          arch_atomic64_fetch_or_relaxed
     185             : #define arch_atomic64_fetch_or_acquire          arch_atomic64_fetch_or_acquire
     186             : #define arch_atomic64_fetch_or_release          arch_atomic64_fetch_or_release
     187             : #define arch_atomic64_fetch_or                  arch_atomic64_fetch_or
     188             : 
     189             : #define arch_atomic64_fetch_xor_relaxed         arch_atomic64_fetch_xor_relaxed
     190             : #define arch_atomic64_fetch_xor_acquire         arch_atomic64_fetch_xor_acquire
     191             : #define arch_atomic64_fetch_xor_release         arch_atomic64_fetch_xor_release
     192             : #define arch_atomic64_fetch_xor                 arch_atomic64_fetch_xor
     193             : 
     194             : #define arch_atomic64_andnot                    arch_atomic64_andnot
     195             : 
     196             : #define arch_atomic64_dec_if_positive           arch_atomic64_dec_if_positive
     197             : 
     198             : #endif /* __ASM_ATOMIC_H */

Generated by: LCOV version 1.14