/* * Copyright (C) 2014 Regents of the University of California * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef _ASM_RISCV_CMPXCHG_H #define _ASM_RISCV_CMPXCHG_H #include <linux/bug.h> #include <asm/barrier.h> #define __xchg(new, ptr, size, asm_or) \ ({ \ __typeof__(ptr) __ptr = (ptr); \ __typeof__(new) __new = (new); \ __typeof__(*(ptr)) __ret; \ switch (size) { \ case 4: \ __asm__ __volatile__ ( \ "amoswap.w" #asm_or " %0, %2, %1" \ : "=r" (__ret), "+A" (*__ptr) \ : "r" (__new) \ : "memory"); \ break; \ case 8: \ __asm__ __volatile__ ( \ "amoswap.d" #asm_or " %0, %2, %1" \ : "=r" (__ret), "+A" (*__ptr) \ : "r" (__new) \ : "memory"); \ break; \ default: \ BUILD_BUG(); \ } \ __ret; \ }) #define xchg(ptr, x) (__xchg((x), (ptr), sizeof(*(ptr)), .aqrl)) #define xchg32(ptr, x) \ ({ \ BUILD_BUG_ON(sizeof(*(ptr)) != 4); \ xchg((ptr), (x)); \ }) #define xchg64(ptr, x) \ ({ \ BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ xchg((ptr), (x)); \ }) /* * Atomic compare and exchange. Compare OLD with MEM, if identical, * store NEW in MEM. Return the initial value in MEM. Success is * indicated by comparing RETURN with OLD. */ #define __cmpxchg(ptr, old, new, size, lrb, scb) \ ({ \ __typeof__(ptr) __ptr = (ptr); \ __typeof__(*(ptr)) __old = (old); \ __typeof__(*(ptr)) __new = (new); \ __typeof__(*(ptr)) __ret; \ register unsigned int __rc; \ switch (size) { \ case 4: \ __asm__ __volatile__ ( \ "0:" \ "lr.w" #scb " %0, %2\n" \ "bne %0, %z3, 1f\n" \ "sc.w" #lrb " %1, %z4, %2\n" \ "bnez %1, 0b\n" \ "1:" \ : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \ : "rJ" (__old), "rJ" (__new) \ : "memory"); \ break; \ case 8: \ __asm__ __volatile__ ( \ "0:" \ "lr.d" #scb " %0, %2\n" \ "bne %0, %z3, 1f\n" \ "sc.d" #lrb " %1, %z4, %2\n" \ "bnez %1, 0b\n" \ "1:" \ : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr) \ : "rJ" (__old), "rJ" (__new) \ : "memory"); \ break; \ default: \ BUILD_BUG(); \ } \ __ret; \ }) #define cmpxchg(ptr, o, n) \ (__cmpxchg((ptr), (o), (n), sizeof(*(ptr)), .aqrl, .aqrl)) #define cmpxchg_local(ptr, o, n) \ (__cmpxchg((ptr), (o), (n), sizeof(*(ptr)), , )) #define cmpxchg32(ptr, o, n) \ ({ \ BUILD_BUG_ON(sizeof(*(ptr)) != 4); \ cmpxchg((ptr), (o), (n)); \ }) #define cmpxchg32_local(ptr, o, n) \ ({ \ BUILD_BUG_ON(sizeof(*(ptr)) != 4); \ cmpxchg_local((ptr), (o), (n)); \ }) #define cmpxchg64(ptr, o, n) \ ({ \ BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ cmpxchg((ptr), (o), (n)); \ }) #define cmpxchg64_local(ptr, o, n) \ ({ \ BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ cmpxchg_local((ptr), (o), (n)); \ }) #endif /* _ASM_RISCV_CMPXCHG_H */
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Kbuild | File | 1.37 KB | 0644 |
|
asm-offsets.h | File | 35 B | 0644 |
|
asm-prototypes.h | File | 176 B | 0644 |
|
asm.h | File | 1.78 KB | 0644 |
|
atomic.h | File | 11.31 KB | 0644 |
|
barrier.h | File | 2.59 KB | 0644 |
|
bitops.h | File | 6.23 KB | 0644 |
|
bug.h | File | 2.12 KB | 0644 |
|
cache.h | File | 745 B | 0644 |
|
cacheflush.h | File | 1.7 KB | 0644 |
|
cmpxchg.h | File | 3.35 KB | 0644 |
|
compat.h | File | 924 B | 0644 |
|
csr.h | File | 3.8 KB | 0644 |
|
current.h | File | 1.27 KB | 0644 |
|
delay.h | File | 881 B | 0644 |
|
dma-mapping.h | File | 1.19 KB | 0644 |
|
elf.h | File | 2.3 KB | 0644 |
|
fence.h | File | 279 B | 0644 |
|
hwcap.h | File | 1013 B | 0644 |
|
io.h | File | 11.81 KB | 0644 |
|
irq.h | File | 841 B | 0644 |
|
irqflags.h | File | 1.54 KB | 0644 |
|
kprobes.h | File | 679 B | 0644 |
|
linkage.h | File | 677 B | 0644 |
|
mmu.h | File | 829 B | 0644 |
|
mmu_context.h | File | 3.14 KB | 0644 |
|
page.h | File | 3.76 KB | 0644 |
|
pci.h | File | 1.16 KB | 0644 |
|
pgalloc.h | File | 3.06 KB | 0644 |
|
pgtable-32.h | File | 870 B | 0644 |
|
pgtable-64.h | File | 2.08 KB | 0644 |
|
pgtable-bits.h | File | 1.81 KB | 0644 |
|
pgtable.h | File | 11.17 KB | 0644 |
|
processor.h | File | 2.44 KB | 0644 |
|
ptrace.h | File | 2.69 KB | 0644 |
|
sbi.h | File | 2.6 KB | 0644 |
|
smp.h | File | 1.59 KB | 0644 |
|
spinlock.h | File | 2.85 KB | 0644 |
|
spinlock_types.h | File | 906 B | 0644 |
|
string.h | File | 838 B | 0644 |
|
switch_to.h | File | 1.86 KB | 0644 |
|
syscall.h | File | 2.59 KB | 0644 |
|
thread_info.h | File | 3.11 KB | 0644 |
|
timex.h | File | 1.29 KB | 0644 |
|
tlb.h | File | 717 B | 0644 |
|
tlbflush.h | File | 1.83 KB | 0644 |
|
uaccess.h | File | 14 KB | 0644 |
|
unistd.h | File | 638 B | 0644 |
|
vdso.h | File | 1.49 KB | 0644 |
|
word-at-a-time.h | File | 1.48 KB | 0644 |
|