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

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