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.h (1499B)


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