Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2
3#include <asm/barrier.h>
4#include <asm/rwonce.h>
5#include <linux/atomic.h>
6
7__rust_helper s8 rust_helper_atomic_i8_read(s8 *ptr)
8{
9 return READ_ONCE(*ptr);
10}
11
12__rust_helper s8 rust_helper_atomic_i8_read_acquire(s8 *ptr)
13{
14 return smp_load_acquire(ptr);
15}
16
17__rust_helper s16 rust_helper_atomic_i16_read(s16 *ptr)
18{
19 return READ_ONCE(*ptr);
20}
21
22__rust_helper s16 rust_helper_atomic_i16_read_acquire(s16 *ptr)
23{
24 return smp_load_acquire(ptr);
25}
26
27__rust_helper void rust_helper_atomic_i8_set(s8 *ptr, s8 val)
28{
29 WRITE_ONCE(*ptr, val);
30}
31
32__rust_helper void rust_helper_atomic_i8_set_release(s8 *ptr, s8 val)
33{
34 smp_store_release(ptr, val);
35}
36
37__rust_helper void rust_helper_atomic_i16_set(s16 *ptr, s16 val)
38{
39 WRITE_ONCE(*ptr, val);
40}
41
42__rust_helper void rust_helper_atomic_i16_set_release(s16 *ptr, s16 val)
43{
44 smp_store_release(ptr, val);
45}
46
47/*
48 * xchg helpers depend on ARCH_SUPPORTS_ATOMIC_RMW and on the
49 * architecture provding xchg() support for i8 and i16.
50 *
51 * The architectures that currently support Rust (x86_64, armv7,
52 * arm64, riscv, and loongarch) satisfy these requirements.
53 */
54__rust_helper s8 rust_helper_atomic_i8_xchg(s8 *ptr, s8 new)
55{
56 return xchg(ptr, new);
57}
58
59__rust_helper s16 rust_helper_atomic_i16_xchg(s16 *ptr, s16 new)
60{
61 return xchg(ptr, new);
62}
63
64__rust_helper s8 rust_helper_atomic_i8_xchg_acquire(s8 *ptr, s8 new)
65{
66 return xchg_acquire(ptr, new);
67}
68
69__rust_helper s16 rust_helper_atomic_i16_xchg_acquire(s16 *ptr, s16 new)
70{
71 return xchg_acquire(ptr, new);
72}
73
74__rust_helper s8 rust_helper_atomic_i8_xchg_release(s8 *ptr, s8 new)
75{
76 return xchg_release(ptr, new);
77}
78
79__rust_helper s16 rust_helper_atomic_i16_xchg_release(s16 *ptr, s16 new)
80{
81 return xchg_release(ptr, new);
82}
83
84__rust_helper s8 rust_helper_atomic_i8_xchg_relaxed(s8 *ptr, s8 new)
85{
86 return xchg_relaxed(ptr, new);
87}
88
89__rust_helper s16 rust_helper_atomic_i16_xchg_relaxed(s16 *ptr, s16 new)
90{
91 return xchg_relaxed(ptr, new);
92}
93
94/*
95 * try_cmpxchg helpers depend on ARCH_SUPPORTS_ATOMIC_RMW and on the
96 * architecture provding try_cmpxchg() support for i8 and i16.
97 *
98 * The architectures that currently support Rust (x86_64, armv7,
99 * arm64, riscv, and loongarch) satisfy these requirements.
100 */
101__rust_helper bool rust_helper_atomic_i8_try_cmpxchg(s8 *ptr, s8 *old, s8 new)
102{
103 return try_cmpxchg(ptr, old, new);
104}
105
106__rust_helper bool rust_helper_atomic_i16_try_cmpxchg(s16 *ptr, s16 *old, s16 new)
107{
108 return try_cmpxchg(ptr, old, new);
109}
110
111__rust_helper bool rust_helper_atomic_i8_try_cmpxchg_acquire(s8 *ptr, s8 *old, s8 new)
112{
113 return try_cmpxchg_acquire(ptr, old, new);
114}
115
116__rust_helper bool rust_helper_atomic_i16_try_cmpxchg_acquire(s16 *ptr, s16 *old, s16 new)
117{
118 return try_cmpxchg_acquire(ptr, old, new);
119}
120
121__rust_helper bool rust_helper_atomic_i8_try_cmpxchg_release(s8 *ptr, s8 *old, s8 new)
122{
123 return try_cmpxchg_release(ptr, old, new);
124}
125
126__rust_helper bool rust_helper_atomic_i16_try_cmpxchg_release(s16 *ptr, s16 *old, s16 new)
127{
128 return try_cmpxchg_release(ptr, old, new);
129}
130
131__rust_helper bool rust_helper_atomic_i8_try_cmpxchg_relaxed(s8 *ptr, s8 *old, s8 new)
132{
133 return try_cmpxchg_relaxed(ptr, old, new);
134}
135
136__rust_helper bool rust_helper_atomic_i16_try_cmpxchg_relaxed(s16 *ptr, s16 *old, s16 new)
137{
138 return try_cmpxchg_relaxed(ptr, old, new);
139}