162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <linux/bpf.h> 362306a36Sopenharmony_ci#include <bpf/bpf_helpers.h> 462306a36Sopenharmony_ci#include <bpf/bpf_tracing.h> 562306a36Sopenharmony_ci#include <stdbool.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 862306a36Sopenharmony_cibool skip_tests __attribute((__section__(".data"))) = false; 962306a36Sopenharmony_ci#else 1062306a36Sopenharmony_cibool skip_tests = true; 1162306a36Sopenharmony_ci#endif 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci__u32 pid = 0; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci__u64 add64_value = 1; 1662306a36Sopenharmony_ci__u64 add64_result = 0; 1762306a36Sopenharmony_ci__u32 add32_value = 1; 1862306a36Sopenharmony_ci__u32 add32_result = 0; 1962306a36Sopenharmony_ci__u64 add_stack_value_copy = 0; 2062306a36Sopenharmony_ci__u64 add_stack_result = 0; 2162306a36Sopenharmony_ci__u64 add_noreturn_value = 1; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 2462306a36Sopenharmony_ciint add(const void *ctx) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci if (pid != (bpf_get_current_pid_tgid() >> 32)) 2762306a36Sopenharmony_ci return 0; 2862306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 2962306a36Sopenharmony_ci __u64 add_stack_value = 1; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci add64_result = __sync_fetch_and_add(&add64_value, 2); 3262306a36Sopenharmony_ci add32_result = __sync_fetch_and_add(&add32_value, 2); 3362306a36Sopenharmony_ci add_stack_result = __sync_fetch_and_add(&add_stack_value, 2); 3462306a36Sopenharmony_ci add_stack_value_copy = add_stack_value; 3562306a36Sopenharmony_ci __sync_fetch_and_add(&add_noreturn_value, 2); 3662306a36Sopenharmony_ci#endif 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci__s64 sub64_value = 1; 4262306a36Sopenharmony_ci__s64 sub64_result = 0; 4362306a36Sopenharmony_ci__s32 sub32_value = 1; 4462306a36Sopenharmony_ci__s32 sub32_result = 0; 4562306a36Sopenharmony_ci__s64 sub_stack_value_copy = 0; 4662306a36Sopenharmony_ci__s64 sub_stack_result = 0; 4762306a36Sopenharmony_ci__s64 sub_noreturn_value = 1; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 5062306a36Sopenharmony_ciint sub(const void *ctx) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci if (pid != (bpf_get_current_pid_tgid() >> 32)) 5362306a36Sopenharmony_ci return 0; 5462306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 5562306a36Sopenharmony_ci __u64 sub_stack_value = 1; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci sub64_result = __sync_fetch_and_sub(&sub64_value, 2); 5862306a36Sopenharmony_ci sub32_result = __sync_fetch_and_sub(&sub32_value, 2); 5962306a36Sopenharmony_ci sub_stack_result = __sync_fetch_and_sub(&sub_stack_value, 2); 6062306a36Sopenharmony_ci sub_stack_value_copy = sub_stack_value; 6162306a36Sopenharmony_ci __sync_fetch_and_sub(&sub_noreturn_value, 2); 6262306a36Sopenharmony_ci#endif 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci return 0; 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci__u64 and64_value = (0x110ull << 32); 6862306a36Sopenharmony_ci__u64 and64_result = 0; 6962306a36Sopenharmony_ci__u32 and32_value = 0x110; 7062306a36Sopenharmony_ci__u32 and32_result = 0; 7162306a36Sopenharmony_ci__u64 and_noreturn_value = (0x110ull << 32); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 7462306a36Sopenharmony_ciint and(const void *ctx) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci if (pid != (bpf_get_current_pid_tgid() >> 32)) 7762306a36Sopenharmony_ci return 0; 7862306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci and64_result = __sync_fetch_and_and(&and64_value, 0x011ull << 32); 8162306a36Sopenharmony_ci and32_result = __sync_fetch_and_and(&and32_value, 0x011); 8262306a36Sopenharmony_ci __sync_fetch_and_and(&and_noreturn_value, 0x011ull << 32); 8362306a36Sopenharmony_ci#endif 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci return 0; 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci__u64 or64_value = (0x110ull << 32); 8962306a36Sopenharmony_ci__u64 or64_result = 0; 9062306a36Sopenharmony_ci__u32 or32_value = 0x110; 9162306a36Sopenharmony_ci__u32 or32_result = 0; 9262306a36Sopenharmony_ci__u64 or_noreturn_value = (0x110ull << 32); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 9562306a36Sopenharmony_ciint or(const void *ctx) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci if (pid != (bpf_get_current_pid_tgid() >> 32)) 9862306a36Sopenharmony_ci return 0; 9962306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 10062306a36Sopenharmony_ci or64_result = __sync_fetch_and_or(&or64_value, 0x011ull << 32); 10162306a36Sopenharmony_ci or32_result = __sync_fetch_and_or(&or32_value, 0x011); 10262306a36Sopenharmony_ci __sync_fetch_and_or(&or_noreturn_value, 0x011ull << 32); 10362306a36Sopenharmony_ci#endif 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci return 0; 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci__u64 xor64_value = (0x110ull << 32); 10962306a36Sopenharmony_ci__u64 xor64_result = 0; 11062306a36Sopenharmony_ci__u32 xor32_value = 0x110; 11162306a36Sopenharmony_ci__u32 xor32_result = 0; 11262306a36Sopenharmony_ci__u64 xor_noreturn_value = (0x110ull << 32); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 11562306a36Sopenharmony_ciint xor(const void *ctx) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci if (pid != (bpf_get_current_pid_tgid() >> 32)) 11862306a36Sopenharmony_ci return 0; 11962306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 12062306a36Sopenharmony_ci xor64_result = __sync_fetch_and_xor(&xor64_value, 0x011ull << 32); 12162306a36Sopenharmony_ci xor32_result = __sync_fetch_and_xor(&xor32_value, 0x011); 12262306a36Sopenharmony_ci __sync_fetch_and_xor(&xor_noreturn_value, 0x011ull << 32); 12362306a36Sopenharmony_ci#endif 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci return 0; 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci__u64 cmpxchg64_value = 1; 12962306a36Sopenharmony_ci__u64 cmpxchg64_result_fail = 0; 13062306a36Sopenharmony_ci__u64 cmpxchg64_result_succeed = 0; 13162306a36Sopenharmony_ci__u32 cmpxchg32_value = 1; 13262306a36Sopenharmony_ci__u32 cmpxchg32_result_fail = 0; 13362306a36Sopenharmony_ci__u32 cmpxchg32_result_succeed = 0; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 13662306a36Sopenharmony_ciint cmpxchg(const void *ctx) 13762306a36Sopenharmony_ci{ 13862306a36Sopenharmony_ci if (pid != (bpf_get_current_pid_tgid() >> 32)) 13962306a36Sopenharmony_ci return 0; 14062306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 14162306a36Sopenharmony_ci cmpxchg64_result_fail = __sync_val_compare_and_swap(&cmpxchg64_value, 0, 3); 14262306a36Sopenharmony_ci cmpxchg64_result_succeed = __sync_val_compare_and_swap(&cmpxchg64_value, 1, 2); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci cmpxchg32_result_fail = __sync_val_compare_and_swap(&cmpxchg32_value, 0, 3); 14562306a36Sopenharmony_ci cmpxchg32_result_succeed = __sync_val_compare_and_swap(&cmpxchg32_value, 1, 2); 14662306a36Sopenharmony_ci#endif 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci return 0; 14962306a36Sopenharmony_ci} 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci__u64 xchg64_value = 1; 15262306a36Sopenharmony_ci__u64 xchg64_result = 0; 15362306a36Sopenharmony_ci__u32 xchg32_value = 1; 15462306a36Sopenharmony_ci__u32 xchg32_result = 0; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 15762306a36Sopenharmony_ciint xchg(const void *ctx) 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci if (pid != (bpf_get_current_pid_tgid() >> 32)) 16062306a36Sopenharmony_ci return 0; 16162306a36Sopenharmony_ci#ifdef ENABLE_ATOMICS_TESTS 16262306a36Sopenharmony_ci __u64 val64 = 2; 16362306a36Sopenharmony_ci __u32 val32 = 2; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci xchg64_result = __sync_lock_test_and_set(&xchg64_value, val64); 16662306a36Sopenharmony_ci xchg32_result = __sync_lock_test_and_set(&xchg32_value, val32); 16762306a36Sopenharmony_ci#endif 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci return 0; 17062306a36Sopenharmony_ci} 171