Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/parisc/lib/bitops.c
26299 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* bitops.c: atomic operations which got too long to be inlined all over
4
* the place.
5
*
6
* Copyright 1999 Philipp Rumpf ([email protected])
7
* Copyright 2000 Grant Grundler ([email protected])
8
*/
9
10
#include <linux/kernel.h>
11
#include <linux/spinlock.h>
12
#include <linux/atomic.h>
13
14
#ifdef CONFIG_SMP
15
arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = {
16
[0 ... (ATOMIC_HASH_SIZE-1)] = __ARCH_SPIN_LOCK_UNLOCKED
17
};
18
#endif
19
20
#ifdef CONFIG_64BIT
21
unsigned long notrace __xchg64(unsigned long x, volatile unsigned long *ptr)
22
{
23
unsigned long temp, flags;
24
25
_atomic_spin_lock_irqsave(ptr, flags);
26
temp = *ptr;
27
*ptr = x;
28
_atomic_spin_unlock_irqrestore(ptr, flags);
29
return temp;
30
}
31
#endif
32
33
unsigned long notrace __xchg32(int x, volatile int *ptr)
34
{
35
unsigned long flags;
36
long temp;
37
38
_atomic_spin_lock_irqsave(ptr, flags);
39
temp = (long) *ptr; /* XXX - sign extension wanted? */
40
*ptr = x;
41
_atomic_spin_unlock_irqrestore(ptr, flags);
42
return (unsigned long)temp;
43
}
44
45
46
unsigned long notrace __xchg8(char x, volatile char *ptr)
47
{
48
unsigned long flags;
49
long temp;
50
51
_atomic_spin_lock_irqsave(ptr, flags);
52
temp = (long) *ptr; /* XXX - sign extension wanted? */
53
*ptr = x;
54
_atomic_spin_unlock_irqrestore(ptr, flags);
55
return (unsigned long)temp;
56
}
57
58
59
#define CMPXCHG(T) \
60
T notrace __cmpxchg_##T(volatile T *ptr, T old, T new) \
61
{ \
62
unsigned long flags; \
63
T prev; \
64
\
65
_atomic_spin_lock_irqsave(ptr, flags); \
66
if ((prev = *ptr) == old) \
67
*ptr = new; \
68
_atomic_spin_unlock_irqrestore(ptr, flags); \
69
return prev; \
70
}
71
72
CMPXCHG(u64)
73
CMPXCHG(u32)
74
CMPXCHG(u16)
75
CMPXCHG(u8)
76
77