11e8611bbSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0 21e8611bbSAndrii Nakryiko #include <test_progs.h> 3f3c926a4SAndrii Nakryiko #include "test_attach_probe.skel.h" 41e8611bbSAndrii Nakryiko 51e8611bbSAndrii Nakryiko ssize_t get_base_addr() { 61e8611bbSAndrii Nakryiko size_t start; 71e8611bbSAndrii Nakryiko char buf[256]; 81e8611bbSAndrii Nakryiko FILE *f; 91e8611bbSAndrii Nakryiko 101e8611bbSAndrii Nakryiko f = fopen("/proc/self/maps", "r"); 111e8611bbSAndrii Nakryiko if (!f) 121e8611bbSAndrii Nakryiko return -errno; 131e8611bbSAndrii Nakryiko 141e8611bbSAndrii Nakryiko while (fscanf(f, "%zx-%*x %s %*s\n", &start, buf) == 2) { 151e8611bbSAndrii Nakryiko if (strcmp(buf, "r-xp") == 0) { 161e8611bbSAndrii Nakryiko fclose(f); 171e8611bbSAndrii Nakryiko return start; 181e8611bbSAndrii Nakryiko } 191e8611bbSAndrii Nakryiko } 201e8611bbSAndrii Nakryiko 211e8611bbSAndrii Nakryiko fclose(f); 221e8611bbSAndrii Nakryiko return -EINVAL; 231e8611bbSAndrii Nakryiko } 241e8611bbSAndrii Nakryiko 251e8611bbSAndrii Nakryiko void test_attach_probe(void) 261e8611bbSAndrii Nakryiko { 27f3c926a4SAndrii Nakryiko int duration = 0; 28f3c926a4SAndrii Nakryiko struct bpf_link *kprobe_link, *kretprobe_link; 29f3c926a4SAndrii Nakryiko struct bpf_link *uprobe_link, *uretprobe_link; 30f3c926a4SAndrii Nakryiko struct test_attach_probe* skel; 311e8611bbSAndrii Nakryiko size_t uprobe_offset; 321e8611bbSAndrii Nakryiko ssize_t base_addr; 331e8611bbSAndrii Nakryiko 341e8611bbSAndrii Nakryiko base_addr = get_base_addr(); 351e8611bbSAndrii Nakryiko if (CHECK(base_addr < 0, "get_base_addr", 361e8611bbSAndrii Nakryiko "failed to find base addr: %zd", base_addr)) 371e8611bbSAndrii Nakryiko return; 381e8611bbSAndrii Nakryiko uprobe_offset = (size_t)&get_base_addr - base_addr; 391e8611bbSAndrii Nakryiko 405dc7a8b2SAndrii Nakryiko skel = test_attach_probe__open_and_load(); 41f3c926a4SAndrii Nakryiko if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) 421e8611bbSAndrii Nakryiko return; 43f3c926a4SAndrii Nakryiko if (CHECK(!skel->bss, "check_bss", ".bss wasn't mmap()-ed\n")) 44928ca75eSAndrii Nakryiko goto cleanup; 45928ca75eSAndrii Nakryiko 46f3c926a4SAndrii Nakryiko kprobe_link = bpf_program__attach_kprobe(skel->progs.handle_kprobe, 471e8611bbSAndrii Nakryiko false /* retprobe */, 481cb59a60SIlya Leoshkevich SYS_NANOSLEEP_KPROBE_NAME); 491e8611bbSAndrii Nakryiko if (CHECK(IS_ERR(kprobe_link), "attach_kprobe", 50f3c926a4SAndrii Nakryiko "err %ld\n", PTR_ERR(kprobe_link))) 511e8611bbSAndrii Nakryiko goto cleanup; 52f3c926a4SAndrii Nakryiko skel->links.handle_kprobe = kprobe_link; 53f3c926a4SAndrii Nakryiko 54f3c926a4SAndrii Nakryiko kretprobe_link = bpf_program__attach_kprobe(skel->progs.handle_kretprobe, 551e8611bbSAndrii Nakryiko true /* retprobe */, 561cb59a60SIlya Leoshkevich SYS_NANOSLEEP_KPROBE_NAME); 571e8611bbSAndrii Nakryiko if (CHECK(IS_ERR(kretprobe_link), "attach_kretprobe", 58f3c926a4SAndrii Nakryiko "err %ld\n", PTR_ERR(kretprobe_link))) 591e8611bbSAndrii Nakryiko goto cleanup; 60f3c926a4SAndrii Nakryiko skel->links.handle_kretprobe = kretprobe_link; 61f3c926a4SAndrii Nakryiko 62f3c926a4SAndrii Nakryiko uprobe_link = bpf_program__attach_uprobe(skel->progs.handle_uprobe, 631e8611bbSAndrii Nakryiko false /* retprobe */, 641e8611bbSAndrii Nakryiko 0 /* self pid */, 651e8611bbSAndrii Nakryiko "/proc/self/exe", 661e8611bbSAndrii Nakryiko uprobe_offset); 671e8611bbSAndrii Nakryiko if (CHECK(IS_ERR(uprobe_link), "attach_uprobe", 68f3c926a4SAndrii Nakryiko "err %ld\n", PTR_ERR(uprobe_link))) 691e8611bbSAndrii Nakryiko goto cleanup; 70f3c926a4SAndrii Nakryiko skel->links.handle_uprobe = uprobe_link; 71f3c926a4SAndrii Nakryiko 72f3c926a4SAndrii Nakryiko uretprobe_link = bpf_program__attach_uprobe(skel->progs.handle_uretprobe, 731e8611bbSAndrii Nakryiko true /* retprobe */, 741e8611bbSAndrii Nakryiko -1 /* any pid */, 751e8611bbSAndrii Nakryiko "/proc/self/exe", 761e8611bbSAndrii Nakryiko uprobe_offset); 771e8611bbSAndrii Nakryiko if (CHECK(IS_ERR(uretprobe_link), "attach_uretprobe", 78f3c926a4SAndrii Nakryiko "err %ld\n", PTR_ERR(uretprobe_link))) 791e8611bbSAndrii Nakryiko goto cleanup; 80f3c926a4SAndrii Nakryiko skel->links.handle_uretprobe = uretprobe_link; 811e8611bbSAndrii Nakryiko 821e8611bbSAndrii Nakryiko /* trigger & validate kprobe && kretprobe */ 831e8611bbSAndrii Nakryiko usleep(1); 841e8611bbSAndrii Nakryiko 85f3c926a4SAndrii Nakryiko if (CHECK(skel->bss->kprobe_res != 1, "check_kprobe_res", 86f3c926a4SAndrii Nakryiko "wrong kprobe res: %d\n", skel->bss->kprobe_res)) 871e8611bbSAndrii Nakryiko goto cleanup; 88f3c926a4SAndrii Nakryiko if (CHECK(skel->bss->kretprobe_res != 2, "check_kretprobe_res", 89f3c926a4SAndrii Nakryiko "wrong kretprobe res: %d\n", skel->bss->kretprobe_res)) 901e8611bbSAndrii Nakryiko goto cleanup; 911e8611bbSAndrii Nakryiko 921e8611bbSAndrii Nakryiko /* trigger & validate uprobe & uretprobe */ 931e8611bbSAndrii Nakryiko get_base_addr(); 941e8611bbSAndrii Nakryiko 95f3c926a4SAndrii Nakryiko if (CHECK(skel->bss->uprobe_res != 3, "check_uprobe_res", 96f3c926a4SAndrii Nakryiko "wrong uprobe res: %d\n", skel->bss->uprobe_res)) 971e8611bbSAndrii Nakryiko goto cleanup; 98f3c926a4SAndrii Nakryiko if (CHECK(skel->bss->uretprobe_res != 4, "check_uretprobe_res", 99f3c926a4SAndrii Nakryiko "wrong uretprobe res: %d\n", skel->bss->uretprobe_res)) 1001e8611bbSAndrii Nakryiko goto cleanup; 1011e8611bbSAndrii Nakryiko 1021e8611bbSAndrii Nakryiko cleanup: 103f3c926a4SAndrii Nakryiko test_attach_probe__destroy(skel); 1041e8611bbSAndrii Nakryiko } 105