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