xref: /linux/rust/helpers/atomic_ext.c (revision 0923fd0419a1a2c8846e15deacac11b619e996d9)
12cc3d5d6SFUJITA Tomonori // SPDX-License-Identifier: GPL-2.0
22cc3d5d6SFUJITA Tomonori 
32cc3d5d6SFUJITA Tomonori #include <asm/barrier.h>
4300e53b3SFUJITA Tomonori #include <asm/rwonce.h>
55dbc0a69SFUJITA Tomonori #include <linux/atomic.h>
6300e53b3SFUJITA Tomonori 
7300e53b3SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_read(s8 *ptr)
8300e53b3SFUJITA Tomonori {
9300e53b3SFUJITA Tomonori 	return READ_ONCE(*ptr);
10300e53b3SFUJITA Tomonori }
112cc3d5d6SFUJITA Tomonori 
122cc3d5d6SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_read_acquire(s8 *ptr)
132cc3d5d6SFUJITA Tomonori {
142cc3d5d6SFUJITA Tomonori 	return smp_load_acquire(ptr);
152cc3d5d6SFUJITA Tomonori }
162cc3d5d6SFUJITA Tomonori 
17300e53b3SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_read(s16 *ptr)
18300e53b3SFUJITA Tomonori {
19300e53b3SFUJITA Tomonori 	return READ_ONCE(*ptr);
20300e53b3SFUJITA Tomonori }
21300e53b3SFUJITA Tomonori 
222cc3d5d6SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_read_acquire(s16 *ptr)
232cc3d5d6SFUJITA Tomonori {
242cc3d5d6SFUJITA Tomonori 	return smp_load_acquire(ptr);
252cc3d5d6SFUJITA Tomonori }
262cc3d5d6SFUJITA Tomonori 
27300e53b3SFUJITA Tomonori __rust_helper void rust_helper_atomic_i8_set(s8 *ptr, s8 val)
28300e53b3SFUJITA Tomonori {
29300e53b3SFUJITA Tomonori 	WRITE_ONCE(*ptr, val);
30300e53b3SFUJITA Tomonori }
31300e53b3SFUJITA Tomonori 
322cc3d5d6SFUJITA Tomonori __rust_helper void rust_helper_atomic_i8_set_release(s8 *ptr, s8 val)
332cc3d5d6SFUJITA Tomonori {
342cc3d5d6SFUJITA Tomonori 	smp_store_release(ptr, val);
352cc3d5d6SFUJITA Tomonori }
362cc3d5d6SFUJITA Tomonori 
37300e53b3SFUJITA Tomonori __rust_helper void rust_helper_atomic_i16_set(s16 *ptr, s16 val)
38300e53b3SFUJITA Tomonori {
39300e53b3SFUJITA Tomonori 	WRITE_ONCE(*ptr, val);
40300e53b3SFUJITA Tomonori }
41300e53b3SFUJITA Tomonori 
422cc3d5d6SFUJITA Tomonori __rust_helper void rust_helper_atomic_i16_set_release(s16 *ptr, s16 val)
432cc3d5d6SFUJITA Tomonori {
442cc3d5d6SFUJITA Tomonori 	smp_store_release(ptr, val);
452cc3d5d6SFUJITA Tomonori }
465dbc0a69SFUJITA Tomonori 
475dbc0a69SFUJITA Tomonori /*
485dbc0a69SFUJITA Tomonori  * xchg helpers depend on ARCH_SUPPORTS_ATOMIC_RMW and on the
495dbc0a69SFUJITA Tomonori  * architecture provding xchg() support for i8 and i16.
505dbc0a69SFUJITA Tomonori  *
515dbc0a69SFUJITA Tomonori  * The architectures that currently support Rust (x86_64, armv7,
525dbc0a69SFUJITA Tomonori  * arm64, riscv, and loongarch) satisfy these requirements.
535dbc0a69SFUJITA Tomonori  */
545dbc0a69SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg(s8 *ptr, s8 new)
555dbc0a69SFUJITA Tomonori {
565dbc0a69SFUJITA Tomonori 	return xchg(ptr, new);
575dbc0a69SFUJITA Tomonori }
585dbc0a69SFUJITA Tomonori 
595dbc0a69SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg(s16 *ptr, s16 new)
605dbc0a69SFUJITA Tomonori {
615dbc0a69SFUJITA Tomonori 	return xchg(ptr, new);
625dbc0a69SFUJITA Tomonori }
63ab717dd9SFUJITA Tomonori 
64ab717dd9SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg_acquire(s8 *ptr, s8 new)
65ab717dd9SFUJITA Tomonori {
66ab717dd9SFUJITA Tomonori 	return xchg_acquire(ptr, new);
67ab717dd9SFUJITA Tomonori }
68ab717dd9SFUJITA Tomonori 
69ab717dd9SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg_acquire(s16 *ptr, s16 new)
70ab717dd9SFUJITA Tomonori {
71ab717dd9SFUJITA Tomonori 	return xchg_acquire(ptr, new);
72ab717dd9SFUJITA Tomonori }
731bfca1e7SFUJITA Tomonori 
741bfca1e7SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg_release(s8 *ptr, s8 new)
751bfca1e7SFUJITA Tomonori {
761bfca1e7SFUJITA Tomonori 	return xchg_release(ptr, new);
771bfca1e7SFUJITA Tomonori }
781bfca1e7SFUJITA Tomonori 
791bfca1e7SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg_release(s16 *ptr, s16 new)
801bfca1e7SFUJITA Tomonori {
811bfca1e7SFUJITA Tomonori 	return xchg_release(ptr, new);
821bfca1e7SFUJITA Tomonori }
83910cbddcSFUJITA Tomonori 
84910cbddcSFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg_relaxed(s8 *ptr, s8 new)
85910cbddcSFUJITA Tomonori {
86910cbddcSFUJITA Tomonori 	return xchg_relaxed(ptr, new);
87910cbddcSFUJITA Tomonori }
88910cbddcSFUJITA Tomonori 
89910cbddcSFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg_relaxed(s16 *ptr, s16 new)
90910cbddcSFUJITA Tomonori {
91910cbddcSFUJITA Tomonori 	return xchg_relaxed(ptr, new);
92910cbddcSFUJITA Tomonori }
93164e4b56SFUJITA Tomonori 
94164e4b56SFUJITA Tomonori /*
95164e4b56SFUJITA Tomonori  * try_cmpxchg helpers depend on ARCH_SUPPORTS_ATOMIC_RMW and on the
96164e4b56SFUJITA Tomonori  * architecture provding try_cmpxchg() support for i8 and i16.
97164e4b56SFUJITA Tomonori  *
98164e4b56SFUJITA Tomonori  * The architectures that currently support Rust (x86_64, armv7,
99164e4b56SFUJITA Tomonori  * arm64, riscv, and loongarch) satisfy these requirements.
100164e4b56SFUJITA Tomonori  */
101164e4b56SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i8_try_cmpxchg(s8 *ptr, s8 *old, s8 new)
102164e4b56SFUJITA Tomonori {
103164e4b56SFUJITA Tomonori 	return try_cmpxchg(ptr, old, new);
104164e4b56SFUJITA Tomonori }
105164e4b56SFUJITA Tomonori 
106164e4b56SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i16_try_cmpxchg(s16 *ptr, s16 *old, s16 new)
107164e4b56SFUJITA Tomonori {
108164e4b56SFUJITA Tomonori 	return try_cmpxchg(ptr, old, new);
109164e4b56SFUJITA Tomonori }
110fed6aaa3SFUJITA Tomonori 
111fed6aaa3SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i8_try_cmpxchg_acquire(s8 *ptr, s8 *old, s8 new)
112fed6aaa3SFUJITA Tomonori {
113fed6aaa3SFUJITA Tomonori 	return try_cmpxchg_acquire(ptr, old, new);
114fed6aaa3SFUJITA Tomonori }
115fed6aaa3SFUJITA Tomonori 
116fed6aaa3SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i16_try_cmpxchg_acquire(s16 *ptr, s16 *old, s16 new)
117fed6aaa3SFUJITA Tomonori {
118fed6aaa3SFUJITA Tomonori 	return try_cmpxchg_acquire(ptr, old, new);
119fed6aaa3SFUJITA Tomonori }
120b5992f07SFUJITA Tomonori 
121b5992f07SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i8_try_cmpxchg_release(s8 *ptr, s8 *old, s8 new)
122b5992f07SFUJITA Tomonori {
123b5992f07SFUJITA Tomonori 	return try_cmpxchg_release(ptr, old, new);
124b5992f07SFUJITA Tomonori }
125b5992f07SFUJITA Tomonori 
126b5992f07SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i16_try_cmpxchg_release(s16 *ptr, s16 *old, s16 new)
127b5992f07SFUJITA Tomonori {
128b5992f07SFUJITA Tomonori 	return try_cmpxchg_release(ptr, old, new);
129b5992f07SFUJITA Tomonori }
130*8de731a6SFUJITA Tomonori 
131*8de731a6SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i8_try_cmpxchg_relaxed(s8 *ptr, s8 *old, s8 new)
132*8de731a6SFUJITA Tomonori {
133*8de731a6SFUJITA Tomonori 	return try_cmpxchg_relaxed(ptr, old, new);
134*8de731a6SFUJITA Tomonori }
135*8de731a6SFUJITA Tomonori 
136*8de731a6SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i16_try_cmpxchg_relaxed(s16 *ptr, s16 *old, s16 new)
137*8de731a6SFUJITA Tomonori {
138*8de731a6SFUJITA Tomonori 	return try_cmpxchg_relaxed(ptr, old, new);
139*8de731a6SFUJITA Tomonori }
140