2 * Copyright (c) 2018 The strace developers.
5 * SPDX-License-Identifier: LGPL-2.1-or-later
10 #include <linux/ioctl.h>
12 #include "perf_event_struct.h"
14 #define XLAT_MACROS_ONLY
15 #include "xlat/perf_ioctl_cmds.h"
16 #undef XLAT_MACROS_ONLY
18 #include "xlat/perf_ioctl_flags.h"
23 perf_ioctl_query_bpf(struct tcb *const tcp, const kernel_ulong_t arg)
30 if (umove_or_printaddr(tcp, arg, &info))
31 return RVAL_IOCTL_DECODED;
33 tprintf("{ids_len=%u, ", info);
39 umove(tcp, arg + offsetof(struct perf_event_query_bpf, prog_cnt),
43 return RVAL_IOCTL_DECODED;
46 tprintf("prog_cnt=%u, ids=", info);
48 print_array(tcp, arg + offsetof(struct perf_event_query_bpf, ids), info,
50 tfetch_mem, print_uint32_array_member, NULL);
54 return RVAL_IOCTL_DECODED;
58 perf_ioctl_modify_attributes(struct tcb *const tcp, const kernel_ulong_t arg)
61 if (!fetch_perf_event_attr(tcp, arg))
62 print_perf_event_attr(tcp, arg);
64 return RVAL_IOCTL_DECODED;
67 MPERS_PRINTER_DECL(int, perf_ioctl,
68 struct tcb *const tcp, const unsigned int code,
69 const kernel_ulong_t arg)
72 case PERF_EVENT_IOC_ENABLE:
73 case PERF_EVENT_IOC_DISABLE:
74 case PERF_EVENT_IOC_RESET:
76 printflags(perf_ioctl_flags, arg, "PERF_IOC_FLAG_???");
78 return RVAL_IOCTL_DECODED;
80 case PERF_EVENT_IOC_REFRESH:
81 tprintf(", %d", (int) arg);
83 return RVAL_IOCTL_DECODED;
85 case PERF_EVENT_IOC_PERIOD:
87 printnum_int64(tcp, arg, "%" PRIu64);
89 return RVAL_IOCTL_DECODED;
91 case PERF_EVENT_IOC_SET_OUTPUT:
92 case PERF_EVENT_IOC_SET_BPF:
94 printfd(tcp, (int) arg);
96 return RVAL_IOCTL_DECODED;
98 case PERF_EVENT_IOC_PAUSE_OUTPUT:
99 tprintf(", %" PRI_klu, arg);
101 return RVAL_IOCTL_DECODED;
104 * The following ioctl requests are personality-specific
105 * due to the pointer size.
107 case PERF_EVENT_IOC_SET_FILTER:
109 printstr_ex(tcp, arg, get_pagesize(), QUOTE_0_TERMINATED);
111 return RVAL_IOCTL_DECODED;
113 case PERF_EVENT_IOC_ID:
120 printnum_int64(tcp, arg, "%" PRIu64);
122 return RVAL_IOCTL_DECODED;
124 case PERF_EVENT_IOC_QUERY_BPF:
125 return perf_ioctl_query_bpf(tcp, arg);
127 case PERF_EVENT_IOC_MODIFY_ATTRIBUTES:
128 return perf_ioctl_modify_attributes(tcp, arg);