1// SPDX-License-Identifier: GPL-2.0
2
3#include <linux/bpf.h>
4
5#include <bpf/bpf_helpers.h>
6
7struct S {
8 int v;
9};
10
11struct S global_variable = {};
12
13struct {
14 __uint(type, BPF_MAP_TYPE_ARRAY);
15 __uint(max_entries, 7);
16 __type(key, __u32);
17 __type(value, int);
18} values SEC(".maps");
19
20static void save_value(__u32 index, int value)
21{
22 bpf_map_update_elem(&values, &index, &value, 0);
23}
24
25__noinline int foo(__u32 index, struct S *s)
26{
27 if (s) {
28 save_value(index, value: s->v);
29 return ++s->v;
30 }
31
32 save_value(index, value: 0);
33
34 return 1;
35}
36
37__noinline int bar(__u32 index, volatile struct S *s)
38{
39 if (s) {
40 save_value(index, value: s->v);
41 return ++s->v;
42 }
43
44 save_value(index, value: 0);
45
46 return 1;
47}
48
49__noinline int baz(struct S **s)
50{
51 if (s)
52 *s = 0;
53
54 return 0;
55}
56
57SEC("cgroup_skb/ingress")
58int test_cls(struct __sk_buff *skb)
59{
60 __u32 index = 0;
61
62 {
63 const int v = foo(index++, 0);
64
65 save_value(index: index++, value: v);
66 }
67
68 {
69 struct S s = { .v = 100 };
70
71 foo(index++, &s);
72 save_value(index: index++, value: s.v);
73 }
74
75 {
76 global_variable.v = 42;
77 bar(index++, &global_variable);
78 save_value(index: index++, value: global_variable.v);
79 }
80
81 {
82 struct S v, *p = &v;
83
84 baz(&p);
85 save_value(index: index++, value: !p);
86 }
87
88 return 0;
89}
90
91char _license[] SEC("license") = "GPL";
92

source code of linux/tools/testing/selftests/bpf/progs/test_global_func_args.c