Y
     ˆÆÅ„m§ÄÀÂ ?÷     // SPDX-License-Identifier: GPL-2.0

// Generated by scripts/atomic/gen-atomic-instrumented.sh
// DO NOT MODIFY THIS FILE DIRECTLY

/*
 * This file provides wrappers with KASAN instrumentation for atomic operations.
 * To use this functionality an arch's atomic.h file needs to define all
 * atomic operations with arch_ prefix (e.g. arch_atomic_read()) and include
 * this file at the end. This file provides atomic_read() that forwards to
 * arch_atomic_read() for actual atomic operation.
 * Note: if an arch atomic operation is implemented by means of other atomic
 * operations (e.g. atomic_read()/atomic_cmpxchg() loop), then it needs to use
 * arch_ variants (i.e. arch_atomic_read()/arch_atomic_cmpxchg()) to avoid
 * double instrumentation.
 */
#ifndef _LINUX_ATOMIC_INSTRUMENTED_H
#define _LINUX_ATOMIC_INSTRUMENTED_H

#include <linux/build_bug.h>
#include <linux/compiler.h>
#include <linux/instrumented.h>

static __always_inline int
atomic_read(const atomic_t *v)
{
	instrument_atomic_read(v, sizeof(*v));
	return arch_atomic_read(v);
}

static __always_inline int
atomic_read_acquire(const atomic_t *v)
{
	instrument_atomic_read(v, sizeof(*v));
	return arch_atomic_read_acquire(v);
}

static __always_inline void
atomic_set(atomic_t *v, int i)
{
	instrument_atomic_write(v, sizeof(*v));
	arch_atomic_set(v, i);
}

static __always_inline void
atomic_set_release(atomic_t *v, int i)
{
	kcsan_release();
	instrument_atomic_write(v, sizeof(*v));
	arch_atomic_set_release(v, i);
}

static __always_inline void
atomic_add(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	arch_atomic_add(i, v);
}

static __always_inline int
atomic_add_return(int i, atomic_t *v)
{
	kcsan_mb();
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_add_return(i, v);
}

static __always_inline int
atomic_add_return_acquire(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_add_return_acquire(i, v);
}

static __always_inline int
atomic_add_return_release(int i, atomic_t *v)
{
	kcsan_release();
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_add_return_release(i, v);
}

static __always_inline int
atomic_add_return_relaxed(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_add_return_relaxed(i, v);
}

static __always_inline int
atomic_fetch_add(int i, atomic_t *v)
{
	kcsan_mb();
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_fetch_add(i, v);
}

static __always_inline int
atomic_fetch_add_acquire(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_fetch_add_acquire(i, v);
}

static __always_inline int
atomic_fetch_add_release(int i, atomic_t *v)
{
	kcsan_release();
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_fetch_add_release(i, v);
}

static __always_inline int
atomic_fetch_add_relaxed(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_fetch_add_relaxed(i, v);
}

static __always_inline void
atomic_sub(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	arch_atomic_sub(i, v);
}

static __always_inline int
atomic_sub_return(int i, atomic_t *v)
{
	kcsan_mb();
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_sub_return(i, v);
}

static __always_inline int
atomic_sub_return_acquire(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_sub_return_acquire(i, v);
}

static __always_inline int
atomic_sub_return_release(int i, atomic_t *v)
{
	kcsan_release();
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_sub_return_release(i, v);
}

static __always_inline int
atomic_sub_return_relaxed(int i, atomic_t *v)
{
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_sub_return_relaxed(i, v);
}

static __always_inline int
atomic_fetch_sub(int i, atomic_t *v)
{
	kcsan_mb();
	instrument_atomic_read_write(v, sizeof(*v));
	return arch_atomic_fetch_sub(i, v);
}

static __always_inline int
atomic_fetch_sub_acquire(int i, ato