__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
*/
#ifndef __ASM_ARC_CMPXCHG_H
#define __ASM_ARC_CMPXCHG_H
#include <linux/build_bug.h>
#include <linux/types.h>
#include <linux/cmpxchg-emu.h>
#include <asm/barrier.h>
#include <asm/smp.h>
#ifdef CONFIG_ARC_HAS_LLSC
/*
* if (*ptr == @old)
* *ptr = @new
*/
#define __cmpxchg(ptr, old, new) \
({ \
__typeof__(*(ptr)) _prev; \
\
__asm__ __volatile__( \
"1: llock %0, [%1] \n" \
" brne %0, %2, 2f \n" \
" scond %3, [%1] \n" \
" bnz 1b \n" \
"2: \n" \
: "=&r"(_prev) /* Early clobber prevent reg reuse */ \
: "r"(ptr), /* Not "m": llock only supports reg */ \
"ir"(old), \
"r"(new) /* Not "ir": scond can't take LIMM */ \
: "cc", \
"memory"); /* gcc knows memory is clobbered */ \
\
_prev; \
})
#define arch_cmpxchg_relaxed(ptr, old, new) \
({ \
__typeof__(ptr) _p_ = (ptr); \
__typeof__(*(ptr)) _o_ = (old); \
__typeof__(*(ptr)) _n_ = (new); \
__typeof__(*(ptr)) _prev_; \
\
switch(sizeof((_p_))) { \
case 1: \
_prev_ = (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *__force)_p_, (uintptr_t)_o_, (uintptr_t)_n_); \
break; \
case 4: \
_prev_ = __cmpxchg(_p_, _o_, _n_); \
break; \
default: \
BUILD_BUG(); \
} \
_prev_; \
})
#else
#define arch_cmpxchg(ptr, old, new) \
({ \
volatile __typeof__(ptr) _p_ = (ptr); \
__typeof__(*(ptr)) _o_ = (old); \
__typeof__(*(ptr)) _n_ = (new); \
__typeof__(*(ptr)) _prev_; \
unsigned long __flags; \
\
/* \
* spin lock/unlock provide the needed smp_mb() before/after \
*/ \
atomic_ops_lock(__flags); \
_prev_ = *_p_; \
if (_prev_ == _o_) \
*_p_ = _n_; \
atomic_ops_unlock(__flags); \
_prev_; \
})
#endif
/*
* xchg
*/
#ifdef CONFIG_ARC_HAS_LLSC
#define __arch_xchg(ptr, val) \
({ \
__asm__ __volatile__( \
" ex %0, [%1] \n" /* set new value */ \
: "+r"(val) \
: "r"(ptr) \
: "memory"); \
_val_; /* get old value */ \
})
#define arch_xchg_relaxed(ptr, val) \
({ \
__typeof__(ptr) _p_ = (ptr); \
__typeof__(*(ptr)) _val_ = (val); \
\
switch(sizeof(*(_p_))) { \
case 4: \
_val_ = __arch_xchg(_p_, _val_); \
break; \
default: \
BUILD_BUG(); \
} \
_val_; \
})
#else /* !CONFIG_ARC_HAS_LLSC */
/*
* EX instructions is baseline and present in !LLSC too. But in this
* regime it still needs use @atomic_ops_lock spinlock to allow interop
* with cmpxchg() which uses spinlock in !LLSC
* (llist.h use xchg and cmpxchg on sama data)
*/
#define arch_xchg(ptr, val) \
({ \
__typeof__(ptr) _p_ = (ptr); \
__typeof__(*(ptr)) _val_ = (val); \
\
unsigned long __flags; \
\
atomic_ops_lock(__flags); \
\
__asm__ __volatile__( \
" ex %0, [%1] \n" \
: "+r"(_val_) \
: "r"(_p_) \
: "memory"); \
\
atomic_ops_unlock(__flags); \
_val_; \
})
#endif
#endif
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| Kbuild | File | 215 B | 0644 |
|
| arcregs.h | File | 9.44 KB | 0644 |
|
| asm-offsets.h | File | 165 B | 0644 |
|
| asserts.h | File | 958 B | 0644 |
|
| atomic-llsc.h | File | 2.71 KB | 0644 |
|
| atomic-spinlock.h | File | 2.88 KB | 0644 |
|
| atomic.h | File | 658 B | 0644 |
|
| atomic64-arcv2.h | File | 5.57 KB | 0644 |
|
| barrier.h | File | 1.34 KB | 0644 |
|
| bitops.h | File | 3.69 KB | 0644 |
|
| bug.h | File | 819 B | 0644 |
|
| cache.h | File | 3.52 KB | 0644 |
|
| cacheflush.h | File | 2.38 KB | 0644 |
|
| cachetype.h | File | 185 B | 0644 |
|
| checksum.h | File | 2.32 KB | 0644 |
|
| cmpxchg.h | File | 3.24 KB | 0644 |
|
| current.h | File | 548 B | 0644 |
|
| delay.h | File | 1.85 KB | 0644 |
|
| disasm.h | File | 3.72 KB | 0644 |
|
| dma.h | File | 218 B | 0644 |
|
| dsp-impl.h | File | 3.77 KB | 0644 |
|
| dsp.h | File | 796 B | 0644 |
|
| dwarf.h | File | 1.04 KB | 0644 |
|
| elf.h | File | 1.89 KB | 0644 |
|
| entry-arcv2.h | File | 7.71 KB | 0644 |
|
| entry-compact.h | File | 9.45 KB | 0644 |
|
| entry.h | File | 4.42 KB | 0644 |
|
| exec.h | File | 264 B | 0644 |
|
| fpu.h | File | 1.1 KB | 0644 |
|
| futex.h | File | 3.53 KB | 0644 |
|
| highmem.h | File | 1.39 KB | 0644 |
|
| hugepage.h | File | 2.14 KB | 0644 |
|
| io.h | File | 5.97 KB | 0644 |
|
| irq.h | File | 737 B | 0644 |
|
| irqflags-arcv2.h | File | 3.41 KB | 0644 |
|
| irqflags-compact.h | File | 4.31 KB | 0644 |
|
| irqflags.h | File | 363 B | 0644 |
|
| jump_label.h | File | 1.91 KB | 0644 |
|
| kdebug.h | File | 254 B | 0644 |
|
| kgdb.h | File | 1.21 KB | 0644 |
|
| kprobes.h | File | 1.06 KB | 0644 |
|
| linkage.h | File | 1.45 KB | 0644 |
|
| mach_desc.h | File | 1.9 KB | 0644 |
|
| mmu-arcv2.h | File | 2.46 KB | 0644 |
|
| mmu.h | File | 486 B | 0644 |
|
| mmu_context.h | File | 5.44 KB | 0644 |
|
| module.h | File | 428 B | 0644 |
|
| page.h | File | 3.22 KB | 0644 |
|
| pci.h | File | 360 B | 0644 |
|
| perf_event.h | File | 2 KB | 0644 |
|
| pgalloc.h | File | 2.68 KB | 0644 |
|
| pgtable-bits-arcv2.h | File | 4.79 KB | 0644 |
|
| pgtable-levels.h | File | 5.44 KB | 0644 |
|
| pgtable.h | File | 780 B | 0644 |
|
| processor.h | File | 2.96 KB | 0644 |
|
| ptrace.h | File | 4.39 KB | 0644 |
|
| sections.h | File | 261 B | 0644 |
|
| serial.h | File | 498 B | 0644 |
|
| setup.h | File | 1.21 KB | 0644 |
|
| shmparam.h | File | 297 B | 0644 |
|
| smp.h | File | 3.82 KB | 0644 |
|
| spinlock.h | File | 8.38 KB | 0644 |
|
| spinlock_types.h | File | 905 B | 0644 |
|
| stacktrace.h | File | 1.15 KB | 0644 |
|
| string.h | File | 1.01 KB | 0644 |
|
| switch_to.h | File | 553 B | 0644 |
|
| syscall.h | File | 1.73 KB | 0644 |
|
| syscalls.h | File | 547 B | 0644 |
|
| thread_info.h | File | 3.35 KB | 0644 |
|
| timex.h | File | 362 B | 0644 |
|
| tlb.h | File | 262 B | 0644 |
|
| tlbflush.h | File | 1.62 KB | 0644 |
|
| uaccess.h | File | 15.54 KB | 0644 |
|
| unistd.h | File | 305 B | 0644 |
|
| unwind.h | File | 3.37 KB | 0644 |
|
| vermagic.h | File | 157 B | 0644 |
|
| vmalloc.h | File | 87 B | 0644 |
|