]> Git Repo - linux.git/blob - tools/testing/selftests/bpf/progs/test_rdonly_maps.c
Linux 6.14-rc3
[linux.git] / tools / testing / selftests / bpf / progs / test_rdonly_maps.c
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2019 Facebook
3
4 #include <linux/ptrace.h>
5 #include <linux/bpf.h>
6 #include <bpf/bpf_helpers.h>
7 #include "bpf_misc.h"
8
9 const struct {
10         unsigned a[4];
11         /*
12          * if the struct's size is multiple of 16, compiler will put it into
13          * .rodata.cst16 section, which is not recognized by libbpf; work
14          * around this by ensuring we don't have 16-aligned struct
15          */
16         char _y;
17 } rdonly_values = { .a = {2, 3, 4, 5} };
18
19 struct {
20         unsigned did_run;
21         unsigned iters;
22         unsigned sum;
23 } res = {};
24
25 SEC("raw_tracepoint/sys_enter:skip_loop")
26 int skip_loop(struct pt_regs *ctx)
27 {
28         /* prevent compiler to optimize everything out */
29         unsigned * volatile p = (void *)&rdonly_values.a;
30         unsigned iters = 0, sum = 0;
31
32         /* we should never enter this loop */
33         while (*p & 1) {
34                 iters++;
35                 sum += *p;
36                 p++;
37         }
38         res.did_run = 1;
39         res.iters = iters;
40         res.sum = sum;
41         return 0;
42 }
43
44 SEC("raw_tracepoint/sys_enter:part_loop")
45 int part_loop(struct pt_regs *ctx)
46 {
47         /* prevent compiler to optimize everything out */
48         unsigned * volatile p = (void *)&rdonly_values.a;
49         unsigned iters = 0, sum = 0;
50
51         /* validate verifier can derive loop termination */
52         while (*p < 5) {
53                 iters++;
54                 sum += *p;
55                 p++;
56         }
57         res.did_run = 1;
58         res.iters = iters;
59         res.sum = sum;
60         return 0;
61 }
62
63 SEC("raw_tracepoint/sys_enter:full_loop")
64 int full_loop(struct pt_regs *ctx)
65 {
66         /* prevent compiler to optimize everything out */
67         unsigned * volatile p = (void *)&rdonly_values.a;
68         int i = ARRAY_SIZE(rdonly_values.a);
69         unsigned iters = 0, sum = 0;
70
71         /* validate verifier can allow full loop as well */
72         while (i > 0 ) {
73                 iters++;
74                 sum += *p;
75                 p++;
76                 i--;
77         }
78         res.did_run = 1;
79         res.iters = iters;
80         res.sum = sum;
81         return 0;
82 }
83
84 char _license[] SEC("license") = "GPL";
This page took 0.037328 seconds and 4 git commands to generate.