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
12const volatile int skip = 0;
13#else
14const volatile int skip = 1;
15#endif
16
17volatile const short val1 = -1;
18volatile const int val2 = -1;
19short val3 = -1;
20int val4 = -1;
21int done1, done2, ret1, ret2;
22
23SEC("?raw_tp/sys_enter")
24int 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
37SEC("?raw_tp/sys_enter")
38int 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
51struct bpf_testmod_struct_arg_1 {
52	int a;
53};
54
55long long int_member;
56
57SEC("?fentry/bpf_testmod_test_arg_ptr_to_struct")
58int 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
65long long set_optlen, set_retval;
66
67SEC("?cgroup/getsockopt")
68int _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
88long long set_mark;
89
90SEC("?tc")
91int _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
125char _license[] SEC("license") = "GPL";
126