brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · 7035fb4 Raw
85 lines · c
1// SPDX-License-Identifier: GPL-2.02// Copyright (c) 2019 Facebook3 4#include <linux/ptrace.h>5#include <linux/bpf.h>6#include <bpf/bpf_helpers.h>7#include "bpf_misc.h"8 9const struct {10	unsigned a[4];11	/*12	 * if the struct's size is multiple of 16, compiler will put it into13	 * .rodata.cst16 section, which is not recognized by libbpf; work14	 * around this by ensuring we don't have 16-aligned struct15	 */16	char _y;17} rdonly_values = { .a = {2, 3, 4, 5} };18 19struct {20	unsigned did_run;21	unsigned iters;22	unsigned sum;23} res = {};24 25SEC("raw_tracepoint/sys_enter:skip_loop")26int 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 44SEC("raw_tracepoint/sys_enter:part_loop")45int 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 63SEC("raw_tracepoint/sys_enter:full_loop")64int 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 84char _license[] SEC("license") = "GPL";85