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 } 93*164e4b56SFUJITA Tomonori 94*164e4b56SFUJITA Tomonori /* 95*164e4b56SFUJITA Tomonori * try_cmpxchg helpers depend on ARCH_SUPPORTS_ATOMIC_RMW and on the 96*164e4b56SFUJITA Tomonori * architecture provding try_cmpxchg() support for i8 and i16. 97*164e4b56SFUJITA Tomonori * 98*164e4b56SFUJITA Tomonori * The architectures that currently support Rust (x86_64, armv7, 99*164e4b56SFUJITA Tomonori * arm64, riscv, and loongarch) satisfy these requirements. 100*164e4b56SFUJITA Tomonori */ 101*164e4b56SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i8_try_cmpxchg(s8 *ptr, s8 *old, s8 new) 102*164e4b56SFUJITA Tomonori { 103*164e4b56SFUJITA Tomonori return try_cmpxchg(ptr, old, new); 104*164e4b56SFUJITA Tomonori } 105*164e4b56SFUJITA Tomonori 106*164e4b56SFUJITA Tomonori __rust_helper bool rust_helper_atomic_i16_try_cmpxchg(s16 *ptr, s16 *old, s16 new) 107*164e4b56SFUJITA Tomonori { 108*164e4b56SFUJITA Tomonori return try_cmpxchg(ptr, old, new); 109*164e4b56SFUJITA Tomonori } 110