Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/sh/include/asm/cmpxchg-llsc.h
15126 views
1
#ifndef __ASM_SH_CMPXCHG_LLSC_H
2
#define __ASM_SH_CMPXCHG_LLSC_H
3
4
static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
5
{
6
unsigned long retval;
7
unsigned long tmp;
8
9
__asm__ __volatile__ (
10
"1: \n\t"
11
"movli.l @%2, %0 ! xchg_u32 \n\t"
12
"mov %0, %1 \n\t"
13
"mov %3, %0 \n\t"
14
"movco.l %0, @%2 \n\t"
15
"bf 1b \n\t"
16
"synco \n\t"
17
: "=&z"(tmp), "=&r" (retval)
18
: "r" (m), "r" (val)
19
: "t", "memory"
20
);
21
22
return retval;
23
}
24
25
static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
26
{
27
unsigned long retval;
28
unsigned long tmp;
29
30
__asm__ __volatile__ (
31
"1: \n\t"
32
"movli.l @%2, %0 ! xchg_u8 \n\t"
33
"mov %0, %1 \n\t"
34
"mov %3, %0 \n\t"
35
"movco.l %0, @%2 \n\t"
36
"bf 1b \n\t"
37
"synco \n\t"
38
: "=&z"(tmp), "=&r" (retval)
39
: "r" (m), "r" (val & 0xff)
40
: "t", "memory"
41
);
42
43
return retval;
44
}
45
46
static inline unsigned long
47
__cmpxchg_u32(volatile int *m, unsigned long old, unsigned long new)
48
{
49
unsigned long retval;
50
unsigned long tmp;
51
52
__asm__ __volatile__ (
53
"1: \n\t"
54
"movli.l @%2, %0 ! __cmpxchg_u32 \n\t"
55
"mov %0, %1 \n\t"
56
"cmp/eq %1, %3 \n\t"
57
"bf 2f \n\t"
58
"mov %4, %0 \n\t"
59
"2: \n\t"
60
"movco.l %0, @%2 \n\t"
61
"bf 1b \n\t"
62
"synco \n\t"
63
: "=&z" (tmp), "=&r" (retval)
64
: "r" (m), "r" (old), "r" (new)
65
: "t", "memory"
66
);
67
68
return retval;
69
}
70
71
#endif /* __ASM_SH_CMPXCHG_LLSC_H */
72
73