xref: /linux/tools/testing/selftests/bpf/progs/test_rdonly_maps.c (revision 566ab427f827b0256d3e8ce0235d088e6a9c28bd)
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";
85