brintos

brintos / linux-shallow public Read only

0
0
Text · 4.1 KiB · f89c7f0 Raw
171 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/bpf.h>3#include <bpf/bpf_helpers.h>4#include <bpf/bpf_tracing.h>5#include <stdbool.h>6 7#ifdef ENABLE_ATOMICS_TESTS8bool skip_tests __attribute((__section__(".data"))) = false;9#else10bool skip_tests = true;11#endif12 13__u32 pid = 0;14 15__u64 add64_value = 1;16__u64 add64_result = 0;17__u32 add32_value = 1;18__u32 add32_result = 0;19__u64 add_stack_value_copy = 0;20__u64 add_stack_result = 0;21__u64 add_noreturn_value = 1;22 23SEC("raw_tp/sys_enter")24int add(const void *ctx)25{26	if (pid != (bpf_get_current_pid_tgid() >> 32))27		return 0;28#ifdef ENABLE_ATOMICS_TESTS29	__u64 add_stack_value = 1;30 31	add64_result = __sync_fetch_and_add(&add64_value, 2);32	add32_result = __sync_fetch_and_add(&add32_value, 2);33	add_stack_result = __sync_fetch_and_add(&add_stack_value, 2);34	add_stack_value_copy = add_stack_value;35	__sync_fetch_and_add(&add_noreturn_value, 2);36#endif37 38	return 0;39}40 41__s64 sub64_value = 1;42__s64 sub64_result = 0;43__s32 sub32_value = 1;44__s32 sub32_result = 0;45__s64 sub_stack_value_copy = 0;46__s64 sub_stack_result = 0;47__s64 sub_noreturn_value = 1;48 49SEC("raw_tp/sys_enter")50int sub(const void *ctx)51{52	if (pid != (bpf_get_current_pid_tgid() >> 32))53		return 0;54#ifdef ENABLE_ATOMICS_TESTS55	__u64 sub_stack_value = 1;56 57	sub64_result = __sync_fetch_and_sub(&sub64_value, 2);58	sub32_result = __sync_fetch_and_sub(&sub32_value, 2);59	sub_stack_result = __sync_fetch_and_sub(&sub_stack_value, 2);60	sub_stack_value_copy = sub_stack_value;61	__sync_fetch_and_sub(&sub_noreturn_value, 2);62#endif63 64	return 0;65}66 67__u64 and64_value = (0x110ull << 32);68__u64 and64_result = 0;69__u32 and32_value = 0x110;70__u32 and32_result = 0;71__u64 and_noreturn_value = (0x110ull << 32);72 73SEC("raw_tp/sys_enter")74int and(const void *ctx)75{76	if (pid != (bpf_get_current_pid_tgid() >> 32))77		return 0;78#ifdef ENABLE_ATOMICS_TESTS79 80	and64_result = __sync_fetch_and_and(&and64_value, 0x011ull << 32);81	and32_result = __sync_fetch_and_and(&and32_value, 0x011);82	__sync_fetch_and_and(&and_noreturn_value, 0x011ull << 32);83#endif84 85	return 0;86}87 88__u64 or64_value = (0x110ull << 32);89__u64 or64_result = 0;90__u32 or32_value = 0x110;91__u32 or32_result = 0;92__u64 or_noreturn_value = (0x110ull << 32);93 94SEC("raw_tp/sys_enter")95int or(const void *ctx)96{97	if (pid != (bpf_get_current_pid_tgid() >> 32))98		return 0;99#ifdef ENABLE_ATOMICS_TESTS100	or64_result = __sync_fetch_and_or(&or64_value, 0x011ull << 32);101	or32_result = __sync_fetch_and_or(&or32_value, 0x011);102	__sync_fetch_and_or(&or_noreturn_value, 0x011ull << 32);103#endif104 105	return 0;106}107 108__u64 xor64_value = (0x110ull << 32);109__u64 xor64_result = 0;110__u32 xor32_value = 0x110;111__u32 xor32_result = 0;112__u64 xor_noreturn_value = (0x110ull << 32);113 114SEC("raw_tp/sys_enter")115int xor(const void *ctx)116{117	if (pid != (bpf_get_current_pid_tgid() >> 32))118		return 0;119#ifdef ENABLE_ATOMICS_TESTS120	xor64_result = __sync_fetch_and_xor(&xor64_value, 0x011ull << 32);121	xor32_result = __sync_fetch_and_xor(&xor32_value, 0x011);122	__sync_fetch_and_xor(&xor_noreturn_value, 0x011ull << 32);123#endif124 125	return 0;126}127 128__u64 cmpxchg64_value = 1;129__u64 cmpxchg64_result_fail = 0;130__u64 cmpxchg64_result_succeed = 0;131__u32 cmpxchg32_value = 1;132__u32 cmpxchg32_result_fail = 0;133__u32 cmpxchg32_result_succeed = 0;134 135SEC("raw_tp/sys_enter")136int cmpxchg(const void *ctx)137{138	if (pid != (bpf_get_current_pid_tgid() >> 32))139		return 0;140#ifdef ENABLE_ATOMICS_TESTS141	cmpxchg64_result_fail = __sync_val_compare_and_swap(&cmpxchg64_value, 0, 3);142	cmpxchg64_result_succeed = __sync_val_compare_and_swap(&cmpxchg64_value, 1, 2);143 144	cmpxchg32_result_fail = __sync_val_compare_and_swap(&cmpxchg32_value, 0, 3);145	cmpxchg32_result_succeed = __sync_val_compare_and_swap(&cmpxchg32_value, 1, 2);146#endif147 148	return 0;149}150 151__u64 xchg64_value = 1;152__u64 xchg64_result = 0;153__u32 xchg32_value = 1;154__u32 xchg32_result = 0;155 156SEC("raw_tp/sys_enter")157int xchg(const void *ctx)158{159	if (pid != (bpf_get_current_pid_tgid() >> 32))160		return 0;161#ifdef ENABLE_ATOMICS_TESTS162	__u64 val64 = 2;163	__u32 val32 = 2;164 165	xchg64_result = __sync_lock_test_and_set(&xchg64_value, val64);166	xchg32_result = __sync_lock_test_and_set(&xchg32_value, val32);167#endif168 169	return 0;170}171