1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */ |
3 | |
4 | #include "vmlinux.h" |
5 | #include <bpf/bpf_helpers.h> |
6 | #include <bpf/bpf_tracing.h> |
7 | |
8 | #if (defined(__TARGET_ARCH_arm64) || defined(__TARGET_ARCH_x86) || \ |
9 | (defined(__TARGET_ARCH_riscv) && __riscv_xlen == 64) || \ |
10 | defined(__TARGET_ARCH_s390) || defined(__TARGET_ARCH_loongarch)) && \ |
11 | __clang_major__ >= 18 |
12 | const volatile int skip = 0; |
13 | #else |
14 | const volatile int skip = 1; |
15 | #endif |
16 | |
17 | volatile const short val1 = -1; |
18 | volatile const int val2 = -1; |
19 | short val3 = -1; |
20 | int val4 = -1; |
21 | int done1, done2, ret1, ret2; |
22 | |
23 | SEC("?raw_tp/sys_enter" ) |
24 | int rdonly_map_prog(const void *ctx) |
25 | { |
26 | if (done1) |
27 | return 0; |
28 | |
29 | done1 = 1; |
30 | /* val1/val2 readonly map */ |
31 | if (val1 == val2) |
32 | ret1 = 1; |
33 | return 0; |
34 | |
35 | } |
36 | |
37 | SEC("?raw_tp/sys_enter" ) |
38 | int map_val_prog(const void *ctx) |
39 | { |
40 | if (done2) |
41 | return 0; |
42 | |
43 | done2 = 1; |
44 | /* val1/val2 regular read/write map */ |
45 | if (val3 == val4) |
46 | ret2 = 1; |
47 | return 0; |
48 | |
49 | } |
50 | |
51 | struct bpf_testmod_struct_arg_1 { |
52 | int a; |
53 | }; |
54 | |
55 | long long int_member; |
56 | |
57 | SEC("?fentry/bpf_testmod_test_arg_ptr_to_struct" ) |
58 | int BPF_PROG2(test_ptr_struct_arg, struct bpf_testmod_struct_arg_1 *, p) |
59 | { |
60 | /* probed memory access */ |
61 | int_member = p->a; |
62 | return 0; |
63 | } |
64 | |
65 | long long set_optlen, set_retval; |
66 | |
67 | SEC("?cgroup/getsockopt" ) |
68 | int _getsockopt(volatile struct bpf_sockopt *ctx) |
69 | { |
70 | int old_optlen, old_retval; |
71 | |
72 | old_optlen = ctx->optlen; |
73 | old_retval = ctx->retval; |
74 | |
75 | ctx->optlen = -1; |
76 | ctx->retval = -1; |
77 | |
78 | /* sign extension for ctx member */ |
79 | set_optlen = ctx->optlen; |
80 | set_retval = ctx->retval; |
81 | |
82 | ctx->optlen = old_optlen; |
83 | ctx->retval = old_retval; |
84 | |
85 | return 0; |
86 | } |
87 | |
88 | long long set_mark; |
89 | |
90 | SEC("?tc" ) |
91 | int _tc(volatile struct __sk_buff *skb) |
92 | { |
93 | long long tmp_mark; |
94 | int old_mark; |
95 | |
96 | old_mark = skb->mark; |
97 | |
98 | skb->mark = 0xf6fe; |
99 | |
100 | /* narrowed sign extension for ctx member */ |
101 | #if __clang_major__ >= 18 |
102 | /* force narrow one-byte signed load. Otherwise, compiler may |
103 | * generate a 32-bit unsigned load followed by an s8 movsx. |
104 | */ |
105 | asm volatile ("r1 = *(s8 *)(%[ctx] + %[off_mark])\n\t" |
106 | "%[tmp_mark] = r1" |
107 | : [tmp_mark]"=r" (tmp_mark) |
108 | : [ctx]"r" (skb), |
109 | [off_mark]"i" (offsetof(struct __sk_buff, mark) |
110 | #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ |
111 | + sizeof(skb->mark) - 1 |
112 | #endif |
113 | ) |
114 | : "r1" ); |
115 | #else |
116 | tmp_mark = (char)skb->mark; |
117 | #endif |
118 | set_mark = tmp_mark; |
119 | |
120 | skb->mark = old_mark; |
121 | |
122 | return 0; |
123 | } |
124 | |
125 | char _license[] SEC("license" ) = "GPL" ; |
126 | |