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