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