1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
3#include <vmlinux.h>
4#include <bpf/bpf_tracing.h>
5#include <bpf/bpf_helpers.h>
6#include "../bpf_testmod/bpf_testmod_kfunc.h"
7
8static struct prog_test_ref_kfunc __kptr *v;
9long total_sum = -1;
10
11SEC("tc")
12int test_jit_probe_mem(struct __sk_buff *ctx)
13{
14 struct prog_test_ref_kfunc *p;
15 unsigned long zero = 0, sum;
16
17 p = bpf_kfunc_call_test_acquire(scalar_ptr: &zero);
18 if (!p)
19 return 1;
20
21 p = bpf_kptr_xchg(&v, p);
22 if (p)
23 goto release_out;
24
25 /* Direct map value access of kptr, should be PTR_UNTRUSTED */
26 p = v;
27 if (!p)
28 return 1;
29
30 asm volatile (
31 "r9 = %[p];"
32 "%[sum] = 0;"
33
34 /* r8 = p->a */
35 "r8 = *(u32 *)(r9 + 0);"
36 "%[sum] += r8;"
37
38 /* r8 = p->b */
39 "r8 = *(u32 *)(r9 + 4);"
40 "%[sum] += r8;"
41
42 "r9 += 8;"
43 /* r9 = p->a */
44 "r9 = *(u32 *)(r9 - 8);"
45 "%[sum] += r9;"
46
47 : [sum] "=r"(sum)
48 : [p] "r"(p)
49 : "r8", "r9"
50 );
51
52 total_sum = sum;
53 return 0;
54release_out:
55 bpf_kfunc_call_test_release(p);
56 return 1;
57}
58
59char _license[] SEC("license") = "GPL";
60

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