| 1 | |
| 2 | |
| 3 | * Copyright (c) 2021, Microsoft Corporation.
|
| 4 | *
|
| 5 | * Authors:
|
| 6 | * Beau Belgrave <[email protected]>
|
| 7 |
|
| 8 |
|
| 9 | #include <errno.h>
|
| 10 | #include <sys/ioctl.h>
|
| 11 | #include <sys/mman.h>
|
| 12 | #include <sys/uio.h>
|
| 13 | #include <fcntl.h>
|
| 14 | #include <stdio.h>
|
| 15 | #include <unistd.h>
|
| 16 | #include <linux/user_events.h>
|
| 17 |
|
| 18 | const char *data_file = "/sys/kernel/tracing/user_events_data";
|
| 19 | int enabled = 0;
|
| 20 |
|
| 21 | static int event_reg(int fd, const char *command, int *write, int *enabled)
|
| 22 | {
|
| 23 | struct user_reg reg = {0};
|
| 24 |
|
| 25 | reg.size = sizeof(reg);
|
| 26 | reg.enable_bit = 31;
|
| 27 | reg.enable_size = sizeof(*enabled);
|
| 28 | reg.enable_addr = (__u64)enabled;
|
| 29 | reg.name_args = (__u64)command;
|
| 30 |
|
| 31 | if (ioctl(fd, DIAG_IOCSREG, ®) == -1)
|
| 32 | return -1;
|
| 33 |
|
| 34 | *write = reg.write_index;
|
| 35 |
|
| 36 | return 0;
|
| 37 | }
|
| 38 |
|
| 39 | int main(int argc, char **argv)
|
| 40 | {
|
| 41 | int data_fd, write;
|
| 42 | struct iovec io[2];
|
| 43 | __u32 count = 0;
|
| 44 |
|
| 45 | data_fd = open(data_file, O_RDWR);
|
| 46 |
|
| 47 | if (event_reg(data_fd, "test u32 count", &write, &enabled) == -1)
|
| 48 | return errno;
|
| 49 |
|
| 50 |
|
| 51 | io[0].iov_base = &write;
|
| 52 | io[0].iov_len = sizeof(write);
|
| 53 | io[1].iov_base = &count;
|
| 54 | io[1].iov_len = sizeof(count);
|
| 55 | ask:
|
| 56 | printf("Press enter to check status...\n");
|
| 57 | getchar();
|
| 58 |
|
| 59 |
|
| 60 | if (enabled) {
|
| 61 |
|
| 62 | writev(data_fd, (const struct iovec *)io, 2);
|
| 63 |
|
| 64 |
|
| 65 | count++;
|
| 66 |
|
| 67 | printf("Something was attached, wrote data\n");
|
| 68 | }
|
| 69 |
|
| 70 | goto ask;
|
| 71 |
|
| 72 | return 0;
|
| 73 | }
|