cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

atomic-gcc.h (1538B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __TOOLS_ASM_GENERIC_ATOMIC_H
      3#define __TOOLS_ASM_GENERIC_ATOMIC_H
      4
      5#include <linux/compiler.h>
      6#include <linux/types.h>
      7
      8/*
      9 * Atomic operations that C can't guarantee us.  Useful for
     10 * resource counting etc..
     11 *
     12 * Excerpts obtained from the Linux kernel sources.
     13 */
     14
     15#define ATOMIC_INIT(i)	{ (i) }
     16
     17/**
     18 * atomic_read - read atomic variable
     19 * @v: pointer of type atomic_t
     20 *
     21 * Atomically reads the value of @v.
     22 */
     23static inline int atomic_read(const atomic_t *v)
     24{
     25	return READ_ONCE((v)->counter);
     26}
     27
     28/**
     29 * atomic_set - set atomic variable
     30 * @v: pointer of type atomic_t
     31 * @i: required value
     32 *
     33 * Atomically sets the value of @v to @i.
     34 */
     35static inline void atomic_set(atomic_t *v, int i)
     36{
     37        v->counter = i;
     38}
     39
     40/**
     41 * atomic_inc - increment atomic variable
     42 * @v: pointer of type atomic_t
     43 *
     44 * Atomically increments @v by 1.
     45 */
     46static inline void atomic_inc(atomic_t *v)
     47{
     48	__sync_add_and_fetch(&v->counter, 1);
     49}
     50
     51/**
     52 * atomic_dec_and_test - decrement and test
     53 * @v: pointer of type atomic_t
     54 *
     55 * Atomically decrements @v by 1 and
     56 * returns true if the result is 0, or false for all other
     57 * cases.
     58 */
     59static inline int atomic_dec_and_test(atomic_t *v)
     60{
     61	return __sync_sub_and_fetch(&v->counter, 1) == 0;
     62}
     63
     64#define cmpxchg(ptr, oldval, newval) \
     65	__sync_val_compare_and_swap(ptr, oldval, newval)
     66
     67static inline int atomic_cmpxchg(atomic_t *v, int oldval, int newval)
     68{
     69	return cmpxchg(&(v)->counter, oldval, newval);
     70}
     71
     72#endif /* __TOOLS_ASM_GENERIC_ATOMIC_H */