2019-10-09 13:14:58 -07:00
// SPDX-License-Identifier: GPL-2.0
// Copyright (c) 2019 Facebook
# include <linux/ptrace.h>
# include <linux/bpf.h>
2020-01-20 14:06:45 +01:00
# include <bpf/bpf_helpers.h>
2019-10-09 13:14:58 -07:00
static volatile const struct {
unsigned a [ 4 ] ;
/*
* if the struct ' s size is multiple of 16 , compiler will put it into
* . rodata . cst16 section , which is not recognized by libbpf ; work
* around this by ensuring we don ' t have 16 - aligned struct
*/
char _y ;
} rdonly_values = { . a = { 2 , 3 , 4 , 5 } } ;
static volatile struct {
unsigned did_run ;
unsigned iters ;
unsigned sum ;
} res ;
SEC ( " raw_tracepoint/sys_enter:skip_loop " )
int skip_loop ( struct pt_regs * ctx )
{
/* prevent compiler to optimize everything out */
unsigned * volatile p = ( void * ) & rdonly_values . a ;
unsigned iters = 0 , sum = 0 ;
/* we should never enter this loop */
while ( * p & 1 ) {
iters + + ;
sum + = * p ;
p + + ;
}
res . did_run = 1 ;
res . iters = iters ;
res . sum = sum ;
return 0 ;
}
SEC ( " raw_tracepoint/sys_enter:part_loop " )
int part_loop ( struct pt_regs * ctx )
{
/* prevent compiler to optimize everything out */
unsigned * volatile p = ( void * ) & rdonly_values . a ;
unsigned iters = 0 , sum = 0 ;
/* validate verifier can derive loop termination */
while ( * p < 5 ) {
iters + + ;
sum + = * p ;
p + + ;
}
res . did_run = 1 ;
res . iters = iters ;
res . sum = sum ;
return 0 ;
}
SEC ( " raw_tracepoint/sys_enter:full_loop " )
int full_loop ( struct pt_regs * ctx )
{
/* prevent compiler to optimize everything out */
unsigned * volatile p = ( void * ) & rdonly_values . a ;
int i = sizeof ( rdonly_values . a ) / sizeof ( rdonly_values . a [ 0 ] ) ;
unsigned iters = 0 , sum = 0 ;
/* validate verifier can allow full loop as well */
while ( i > 0 ) {
iters + + ;
sum + = * p ;
p + + ;
i - - ;
}
res . did_run = 1 ;
res . iters = iters ;
res . sum = sum ;
return 0 ;
}
char _license [ ] SEC ( " license " ) = " GPL " ;