11e38abefSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
21e38abefSAndrii Nakryiko /* Copyright (c) 2020 Facebook */
31e38abefSAndrii Nakryiko 
41e38abefSAndrii Nakryiko #include <test_progs.h>
5fa7f17d0SHou Tao #include <stdbool.h>
61e38abefSAndrii Nakryiko #include "test_module_attach.skel.h"
7*11642eb9SJiri Olsa #include "testing_helpers.h"
81e38abefSAndrii Nakryiko 
91e38abefSAndrii Nakryiko static int duration;
101e38abefSAndrii Nakryiko 
trigger_module_test_writable(int * val)11fa7f17d0SHou Tao static int trigger_module_test_writable(int *val)
12fa7f17d0SHou Tao {
13fa7f17d0SHou Tao 	int fd, err;
14fa7f17d0SHou Tao 	char buf[65];
15fa7f17d0SHou Tao 	ssize_t rd;
16fa7f17d0SHou Tao 
17fa7f17d0SHou Tao 	fd = open(BPF_TESTMOD_TEST_FILE, O_RDONLY);
18fa7f17d0SHou Tao 	err = -errno;
19fa7f17d0SHou Tao 	if (!ASSERT_GE(fd, 0, "testmode_file_open"))
20fa7f17d0SHou Tao 		return err;
21fa7f17d0SHou Tao 
22fa7f17d0SHou Tao 	rd = read(fd, buf, sizeof(buf) - 1);
23fa7f17d0SHou Tao 	err = -errno;
24fa7f17d0SHou Tao 	if (!ASSERT_GT(rd, 0, "testmod_file_rd_val")) {
25fa7f17d0SHou Tao 		close(fd);
26fa7f17d0SHou Tao 		return err;
27fa7f17d0SHou Tao 	}
28fa7f17d0SHou Tao 
29fa7f17d0SHou Tao 	buf[rd] = '\0';
30fa7f17d0SHou Tao 	*val = strtol(buf, NULL, 0);
31fa7f17d0SHou Tao 	close(fd);
32fa7f17d0SHou Tao 
33fa7f17d0SHou Tao 	return 0;
34fa7f17d0SHou Tao }
35fa7f17d0SHou Tao 
test_module_attach(void)361e38abefSAndrii Nakryiko void test_module_attach(void)
371e38abefSAndrii Nakryiko {
381e38abefSAndrii Nakryiko 	const int READ_SZ = 456;
39407be922SQais Yousef 	const int WRITE_SZ = 457;
401e38abefSAndrii Nakryiko 	struct test_module_attach* skel;
411e38abefSAndrii Nakryiko 	struct test_module_attach__bss *bss;
42a1c05c3bSJiri Olsa 	struct bpf_link *link;
431e38abefSAndrii Nakryiko 	int err;
44fa7f17d0SHou Tao 	int writable_val = 0;
451e38abefSAndrii Nakryiko 
462e33f831SAndrii Nakryiko 	skel = test_module_attach__open();
471e38abefSAndrii Nakryiko 	if (CHECK(!skel, "skel_open", "failed to open skeleton\n"))
481e38abefSAndrii Nakryiko 		return;
491e38abefSAndrii Nakryiko 
502e33f831SAndrii Nakryiko 	err = bpf_program__set_attach_target(skel->progs.handle_fentry_manual,
512e33f831SAndrii Nakryiko 					     0, "bpf_testmod_test_read");
522e33f831SAndrii Nakryiko 	ASSERT_OK(err, "set_attach_target");
532e33f831SAndrii Nakryiko 
542e33f831SAndrii Nakryiko 	err = test_module_attach__load(skel);
552e33f831SAndrii Nakryiko 	if (CHECK(err, "skel_load", "failed to load skeleton\n"))
562e33f831SAndrii Nakryiko 		return;
572e33f831SAndrii Nakryiko 
581e38abefSAndrii Nakryiko 	bss = skel->bss;
591e38abefSAndrii Nakryiko 
601e38abefSAndrii Nakryiko 	err = test_module_attach__attach(skel);
611e38abefSAndrii Nakryiko 	if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err))
621e38abefSAndrii Nakryiko 		goto cleanup;
631e38abefSAndrii Nakryiko 
641e38abefSAndrii Nakryiko 	/* trigger tracepoint */
651e38abefSAndrii Nakryiko 	ASSERT_OK(trigger_module_test_read(READ_SZ), "trigger_read");
66407be922SQais Yousef 	ASSERT_OK(trigger_module_test_write(WRITE_SZ), "trigger_write");
671e38abefSAndrii Nakryiko 
681e38abefSAndrii Nakryiko 	ASSERT_EQ(bss->raw_tp_read_sz, READ_SZ, "raw_tp");
69407be922SQais Yousef 	ASSERT_EQ(bss->raw_tp_bare_write_sz, WRITE_SZ, "raw_tp_bare");
701e38abefSAndrii Nakryiko 	ASSERT_EQ(bss->tp_btf_read_sz, READ_SZ, "tp_btf");
711e38abefSAndrii Nakryiko 	ASSERT_EQ(bss->fentry_read_sz, READ_SZ, "fentry");
722e33f831SAndrii Nakryiko 	ASSERT_EQ(bss->fentry_manual_read_sz, READ_SZ, "fentry_manual");
731e38abefSAndrii Nakryiko 	ASSERT_EQ(bss->fexit_read_sz, READ_SZ, "fexit");
741e38abefSAndrii Nakryiko 	ASSERT_EQ(bss->fexit_ret, -EIO, "fexit_tet");
751e38abefSAndrii Nakryiko 	ASSERT_EQ(bss->fmod_ret_read_sz, READ_SZ, "fmod_ret");
761e38abefSAndrii Nakryiko 
77fa7f17d0SHou Tao 	bss->raw_tp_writable_bare_early_ret = true;
78fa7f17d0SHou Tao 	bss->raw_tp_writable_bare_out_val = 0xf1f2f3f4;
79fa7f17d0SHou Tao 	ASSERT_OK(trigger_module_test_writable(&writable_val),
80fa7f17d0SHou Tao 		  "trigger_writable");
81fa7f17d0SHou Tao 	ASSERT_EQ(bss->raw_tp_writable_bare_in_val, 1024, "writable_test_in");
82fa7f17d0SHou Tao 	ASSERT_EQ(bss->raw_tp_writable_bare_out_val, writable_val,
83fa7f17d0SHou Tao 		  "writable_test_out");
84fa7f17d0SHou Tao 
85a1c05c3bSJiri Olsa 	test_module_attach__detach(skel);
86a1c05c3bSJiri Olsa 
87a1c05c3bSJiri Olsa 	/* attach fentry/fexit and make sure it get's module reference */
88a1c05c3bSJiri Olsa 	link = bpf_program__attach(skel->progs.handle_fentry);
89a1c05c3bSJiri Olsa 	if (!ASSERT_OK_PTR(link, "attach_fentry"))
90a1c05c3bSJiri Olsa 		goto cleanup;
91a1c05c3bSJiri Olsa 
92*11642eb9SJiri Olsa 	ASSERT_ERR(unload_bpf_testmod(false), "unload_bpf_testmod");
93a1c05c3bSJiri Olsa 	bpf_link__destroy(link);
94a1c05c3bSJiri Olsa 
95a1c05c3bSJiri Olsa 	link = bpf_program__attach(skel->progs.handle_fexit);
96a1c05c3bSJiri Olsa 	if (!ASSERT_OK_PTR(link, "attach_fexit"))
97a1c05c3bSJiri Olsa 		goto cleanup;
98a1c05c3bSJiri Olsa 
99*11642eb9SJiri Olsa 	ASSERT_ERR(unload_bpf_testmod(false), "unload_bpf_testmod");
100a1c05c3bSJiri Olsa 	bpf_link__destroy(link);
101a1c05c3bSJiri Olsa 
102e697d8dcSJiri Olsa 	link = bpf_program__attach(skel->progs.kprobe_multi);
103e697d8dcSJiri Olsa 	if (!ASSERT_OK_PTR(link, "attach_kprobe_multi"))
104e697d8dcSJiri Olsa 		goto cleanup;
105e697d8dcSJiri Olsa 
106*11642eb9SJiri Olsa 	ASSERT_ERR(unload_bpf_testmod(false), "unload_bpf_testmod");
107e697d8dcSJiri Olsa 	bpf_link__destroy(link);
108e697d8dcSJiri Olsa 
1091e38abefSAndrii Nakryiko cleanup:
1101e38abefSAndrii Nakryiko 	test_module_attach__destroy(skel);
1111e38abefSAndrii Nakryiko }
112