^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * bpf-script-example.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Test basic LLVM building
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef LINUX_VERSION_CODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) # error Need LINUX_VERSION_CODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define BPF_ANY 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define BPF_MAP_TYPE_ARRAY 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define BPF_FUNC_map_lookup_elem 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define BPF_FUNC_map_update_elem 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) static void *(*bpf_map_lookup_elem)(void *map, void *key) =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) (void *) BPF_FUNC_map_lookup_elem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) (void *) BPF_FUNC_map_update_elem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) struct bpf_map_def {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) unsigned int type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) unsigned int key_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) unsigned int value_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) unsigned int max_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define SEC(NAME) __attribute__((section(NAME), used))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct bpf_map_def SEC("maps") flip_table = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .type = BPF_MAP_TYPE_ARRAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .key_size = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .value_size = sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .max_entries = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) SEC("func=do_epoll_wait")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) int bpf_func__SyS_epoll_pwait(void *ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) int ind =0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) int *flag = bpf_map_lookup_elem(&flip_table, &ind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) int new_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if (!flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* flip flag and store back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) new_flag = !*flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) return new_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) char _license[] SEC("license") = "GPL";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int _version SEC("version") = LINUX_VERSION_CODE;