2022-01-18 23:43:25 +03:00
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright ( c ) 2021 , Microsoft Corporation .
*
* Authors :
* Beau Belgrave < beaub @ linux . microsoft . com >
*/
# include <errno.h>
# include <sys/ioctl.h>
# include <sys/mman.h>
2023-03-29 02:52:15 +03:00
# include <sys/uio.h>
2022-01-18 23:43:25 +03:00
# include <fcntl.h>
# include <stdio.h>
# include <unistd.h>
# include <linux/user_events.h>
2023-02-16 01:33:45 +03:00
const char * data_file = " /sys/kernel/tracing/user_events_data " ;
2023-03-29 02:52:15 +03:00
int enabled = 0 ;
2022-01-18 23:43:25 +03:00
2023-03-29 02:52:15 +03:00
static int event_reg ( int fd , const char * command , int * write , int * enabled )
2022-01-18 23:43:25 +03:00
{
struct user_reg reg = { 0 } ;
reg . size = sizeof ( reg ) ;
2023-03-29 02:52:15 +03:00
reg . enable_bit = 31 ;
reg . enable_size = sizeof ( * enabled ) ;
reg . enable_addr = ( __u64 ) enabled ;
2022-01-18 23:43:25 +03:00
reg . name_args = ( __u64 ) command ;
if ( ioctl ( fd , DIAG_IOCSREG , & reg ) = = - 1 )
return - 1 ;
* write = reg . write_index ;
return 0 ;
}
int main ( int argc , char * * argv )
{
2022-07-29 02:33:08 +03:00
int data_fd , write ;
2022-01-18 23:43:25 +03:00
struct iovec io [ 2 ] ;
__u32 count = 0 ;
data_fd = open ( data_file , O_RDWR ) ;
2023-03-29 02:52:15 +03:00
if ( event_reg ( data_fd , " test u32 count " , & write , & enabled ) = = - 1 )
2022-01-18 23:43:25 +03:00
return errno ;
/* Setup iovec */
io [ 0 ] . iov_base = & write ;
io [ 0 ] . iov_len = sizeof ( write ) ;
io [ 1 ] . iov_base = & count ;
io [ 1 ] . iov_len = sizeof ( count ) ;
ask :
printf ( " Press enter to check status... \n " ) ;
getchar ( ) ;
/* Check if anyone is listening */
2023-03-29 02:52:15 +03:00
if ( enabled ) {
2022-01-18 23:43:25 +03:00
/* Yep, trace out our data */
writev ( data_fd , ( const struct iovec * ) io , 2 ) ;
/* Increase the count */
count + + ;
printf ( " Something was attached, wrote data \n " ) ;
}
goto ask ;
return 0 ;
}