1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright (c) 2019 Facebook */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include <test_progs.h>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun struct s {
7*4882a593Smuzhiyun int a;
8*4882a593Smuzhiyun long long b;
9*4882a593Smuzhiyun } __attribute__((packed));
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include "test_skeleton.skel.h"
12*4882a593Smuzhiyun
test_skeleton(void)13*4882a593Smuzhiyun void test_skeleton(void)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun int duration = 0, err;
16*4882a593Smuzhiyun struct test_skeleton* skel;
17*4882a593Smuzhiyun struct test_skeleton__bss *bss;
18*4882a593Smuzhiyun struct test_skeleton__data *data;
19*4882a593Smuzhiyun struct test_skeleton__rodata *rodata;
20*4882a593Smuzhiyun struct test_skeleton__kconfig *kcfg;
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun skel = test_skeleton__open();
23*4882a593Smuzhiyun if (CHECK(!skel, "skel_open", "failed to open skeleton\n"))
24*4882a593Smuzhiyun return;
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun if (CHECK(skel->kconfig, "skel_kconfig", "kconfig is mmaped()!\n"))
27*4882a593Smuzhiyun goto cleanup;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun bss = skel->bss;
30*4882a593Smuzhiyun data = skel->data;
31*4882a593Smuzhiyun rodata = skel->rodata;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /* validate values are pre-initialized correctly */
34*4882a593Smuzhiyun CHECK(data->in1 != -1, "in1", "got %d != exp %d\n", data->in1, -1);
35*4882a593Smuzhiyun CHECK(data->out1 != -1, "out1", "got %d != exp %d\n", data->out1, -1);
36*4882a593Smuzhiyun CHECK(data->in2 != -1, "in2", "got %lld != exp %lld\n", data->in2, -1LL);
37*4882a593Smuzhiyun CHECK(data->out2 != -1, "out2", "got %lld != exp %lld\n", data->out2, -1LL);
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun CHECK(bss->in3 != 0, "in3", "got %d != exp %d\n", bss->in3, 0);
40*4882a593Smuzhiyun CHECK(bss->out3 != 0, "out3", "got %d != exp %d\n", bss->out3, 0);
41*4882a593Smuzhiyun CHECK(bss->in4 != 0, "in4", "got %lld != exp %lld\n", bss->in4, 0LL);
42*4882a593Smuzhiyun CHECK(bss->out4 != 0, "out4", "got %lld != exp %lld\n", bss->out4, 0LL);
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun CHECK(rodata->in.in6 != 0, "in6", "got %d != exp %d\n", rodata->in.in6, 0);
45*4882a593Smuzhiyun CHECK(bss->out6 != 0, "out6", "got %d != exp %d\n", bss->out6, 0);
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /* validate we can pre-setup global variables, even in .bss */
48*4882a593Smuzhiyun data->in1 = 10;
49*4882a593Smuzhiyun data->in2 = 11;
50*4882a593Smuzhiyun bss->in3 = 12;
51*4882a593Smuzhiyun bss->in4 = 13;
52*4882a593Smuzhiyun rodata->in.in6 = 14;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun err = test_skeleton__load(skel);
55*4882a593Smuzhiyun if (CHECK(err, "skel_load", "failed to load skeleton: %d\n", err))
56*4882a593Smuzhiyun goto cleanup;
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun /* validate pre-setup values are still there */
59*4882a593Smuzhiyun CHECK(data->in1 != 10, "in1", "got %d != exp %d\n", data->in1, 10);
60*4882a593Smuzhiyun CHECK(data->in2 != 11, "in2", "got %lld != exp %lld\n", data->in2, 11LL);
61*4882a593Smuzhiyun CHECK(bss->in3 != 12, "in3", "got %d != exp %d\n", bss->in3, 12);
62*4882a593Smuzhiyun CHECK(bss->in4 != 13, "in4", "got %lld != exp %lld\n", bss->in4, 13LL);
63*4882a593Smuzhiyun CHECK(rodata->in.in6 != 14, "in6", "got %d != exp %d\n", rodata->in.in6, 14);
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun /* now set new values and attach to get them into outX variables */
66*4882a593Smuzhiyun data->in1 = 1;
67*4882a593Smuzhiyun data->in2 = 2;
68*4882a593Smuzhiyun bss->in3 = 3;
69*4882a593Smuzhiyun bss->in4 = 4;
70*4882a593Smuzhiyun bss->in5.a = 5;
71*4882a593Smuzhiyun bss->in5.b = 6;
72*4882a593Smuzhiyun kcfg = skel->kconfig;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun err = test_skeleton__attach(skel);
75*4882a593Smuzhiyun if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err))
76*4882a593Smuzhiyun goto cleanup;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /* trigger tracepoint */
79*4882a593Smuzhiyun usleep(1);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun CHECK(data->out1 != 1, "res1", "got %d != exp %d\n", data->out1, 1);
82*4882a593Smuzhiyun CHECK(data->out2 != 2, "res2", "got %lld != exp %d\n", data->out2, 2);
83*4882a593Smuzhiyun CHECK(bss->out3 != 3, "res3", "got %d != exp %d\n", (int)bss->out3, 3);
84*4882a593Smuzhiyun CHECK(bss->out4 != 4, "res4", "got %lld != exp %d\n", bss->out4, 4);
85*4882a593Smuzhiyun CHECK(bss->handler_out5.a != 5, "res5", "got %d != exp %d\n",
86*4882a593Smuzhiyun bss->handler_out5.a, 5);
87*4882a593Smuzhiyun CHECK(bss->handler_out5.b != 6, "res6", "got %lld != exp %d\n",
88*4882a593Smuzhiyun bss->handler_out5.b, 6);
89*4882a593Smuzhiyun CHECK(bss->out6 != 14, "res7", "got %d != exp %d\n", bss->out6, 14);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun CHECK(bss->bpf_syscall != kcfg->CONFIG_BPF_SYSCALL, "ext1",
92*4882a593Smuzhiyun "got %d != exp %d\n", bss->bpf_syscall, kcfg->CONFIG_BPF_SYSCALL);
93*4882a593Smuzhiyun CHECK(bss->kern_ver != kcfg->LINUX_KERNEL_VERSION, "ext2",
94*4882a593Smuzhiyun "got %d != exp %d\n", bss->kern_ver, kcfg->LINUX_KERNEL_VERSION);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun cleanup:
97*4882a593Smuzhiyun test_skeleton__destroy(skel);
98*4882a593Smuzhiyun }
99