.. | .. |
---|
| 1 | +// SPDX-License-Identifier: LGPL-2.1 |
---|
1 | 2 | /* |
---|
2 | 3 | * trace/beauty/ioctl.c |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> |
---|
5 | | - * |
---|
6 | | - * Released under the GPL v2. (and only v2, not any later version) |
---|
7 | 6 | */ |
---|
8 | 7 | |
---|
9 | 8 | #include "trace/beauty/beauty.h" |
---|
.. | .. |
---|
32 | 31 | "TCSETSW2", "TCSETSF2", "TIOCGRS48", "TIOCSRS485", "TIOCGPTN", "TIOCSPTLCK", |
---|
33 | 32 | "TIOCGDEV", "TCSETX", "TCSETXF", "TCSETXW", "TIOCSIG", "TIOCVHANGUP", "TIOCGPKT", |
---|
34 | 33 | "TIOCGPTLCK", [_IOC_NR(TIOCGEXCL)] = "TIOCGEXCL", "TIOCGPTPEER", |
---|
| 34 | + "TIOCGISO7816", "TIOCSISO7816", |
---|
35 | 35 | [_IOC_NR(FIONCLEX)] = "FIONCLEX", "FIOCLEX", "FIOASYNC", "TIOCSERCONFIG", |
---|
36 | 36 | "TIOCSERGWILD", "TIOCSERSWILD", "TIOCGLCKTRMIOS", "TIOCSLCKTRMIOS", |
---|
37 | 37 | "TIOCSERGSTRUCT", "TIOCSERGETLSR", "TIOCSERGETMULTI", "TIOCSERSETMULTI", |
---|
38 | 38 | "TIOCMIWAIT", "TIOCGICOUNT", }; |
---|
39 | | - static DEFINE_STRARRAY(ioctl_tty_cmd); |
---|
| 39 | + static DEFINE_STRARRAY(ioctl_tty_cmd, ""); |
---|
40 | 40 | |
---|
41 | 41 | if (nr < strarray__ioctl_tty_cmd.nr_entries && strarray__ioctl_tty_cmd.entries[nr] != NULL) |
---|
42 | 42 | return scnprintf(bf, size, "%s", strarray__ioctl_tty_cmd.entries[nr]); |
---|
.. | .. |
---|
47 | 47 | static size_t ioctl__scnprintf_drm_cmd(int nr, int dir, char *bf, size_t size) |
---|
48 | 48 | { |
---|
49 | 49 | #include "trace/beauty/generated/ioctl/drm_ioctl_array.c" |
---|
50 | | - static DEFINE_STRARRAY(drm_ioctl_cmds); |
---|
| 50 | + static DEFINE_STRARRAY(drm_ioctl_cmds, ""); |
---|
51 | 51 | |
---|
52 | 52 | if (nr < strarray__drm_ioctl_cmds.nr_entries && strarray__drm_ioctl_cmds.entries[nr] != NULL) |
---|
53 | 53 | return scnprintf(bf, size, "DRM_%s", strarray__drm_ioctl_cmds.entries[nr]); |
---|
.. | .. |
---|
58 | 58 | static size_t ioctl__scnprintf_sndrv_pcm_cmd(int nr, int dir, char *bf, size_t size) |
---|
59 | 59 | { |
---|
60 | 60 | #include "trace/beauty/generated/ioctl/sndrv_pcm_ioctl_array.c" |
---|
61 | | - static DEFINE_STRARRAY(sndrv_pcm_ioctl_cmds); |
---|
| 61 | + static DEFINE_STRARRAY(sndrv_pcm_ioctl_cmds, ""); |
---|
62 | 62 | |
---|
63 | 63 | if (nr < strarray__sndrv_pcm_ioctl_cmds.nr_entries && strarray__sndrv_pcm_ioctl_cmds.entries[nr] != NULL) |
---|
64 | 64 | return scnprintf(bf, size, "SNDRV_PCM_%s", strarray__sndrv_pcm_ioctl_cmds.entries[nr]); |
---|
.. | .. |
---|
69 | 69 | static size_t ioctl__scnprintf_sndrv_ctl_cmd(int nr, int dir, char *bf, size_t size) |
---|
70 | 70 | { |
---|
71 | 71 | #include "trace/beauty/generated/ioctl/sndrv_ctl_ioctl_array.c" |
---|
72 | | - static DEFINE_STRARRAY(sndrv_ctl_ioctl_cmds); |
---|
| 72 | + static DEFINE_STRARRAY(sndrv_ctl_ioctl_cmds, ""); |
---|
73 | 73 | |
---|
74 | 74 | if (nr < strarray__sndrv_ctl_ioctl_cmds.nr_entries && strarray__sndrv_ctl_ioctl_cmds.entries[nr] != NULL) |
---|
75 | 75 | return scnprintf(bf, size, "SNDRV_CTL_%s", strarray__sndrv_ctl_ioctl_cmds.entries[nr]); |
---|
.. | .. |
---|
80 | 80 | static size_t ioctl__scnprintf_kvm_cmd(int nr, int dir, char *bf, size_t size) |
---|
81 | 81 | { |
---|
82 | 82 | #include "trace/beauty/generated/ioctl/kvm_ioctl_array.c" |
---|
83 | | - static DEFINE_STRARRAY(kvm_ioctl_cmds); |
---|
| 83 | + static DEFINE_STRARRAY(kvm_ioctl_cmds, ""); |
---|
84 | 84 | |
---|
85 | 85 | if (nr < strarray__kvm_ioctl_cmds.nr_entries && strarray__kvm_ioctl_cmds.entries[nr] != NULL) |
---|
86 | 86 | return scnprintf(bf, size, "KVM_%s", strarray__kvm_ioctl_cmds.entries[nr]); |
---|
.. | .. |
---|
91 | 91 | static size_t ioctl__scnprintf_vhost_virtio_cmd(int nr, int dir, char *bf, size_t size) |
---|
92 | 92 | { |
---|
93 | 93 | #include "trace/beauty/generated/ioctl/vhost_virtio_ioctl_array.c" |
---|
94 | | - static DEFINE_STRARRAY(vhost_virtio_ioctl_cmds); |
---|
95 | | - static DEFINE_STRARRAY(vhost_virtio_ioctl_read_cmds); |
---|
| 94 | + static DEFINE_STRARRAY(vhost_virtio_ioctl_cmds, ""); |
---|
| 95 | + static DEFINE_STRARRAY(vhost_virtio_ioctl_read_cmds, ""); |
---|
96 | 96 | struct strarray *s = (dir & _IOC_READ) ? &strarray__vhost_virtio_ioctl_read_cmds : &strarray__vhost_virtio_ioctl_cmds; |
---|
97 | 97 | |
---|
98 | 98 | if (nr < s->nr_entries && s->entries[nr] != NULL) |
---|
.. | .. |
---|
104 | 104 | static size_t ioctl__scnprintf_perf_cmd(int nr, int dir, char *bf, size_t size) |
---|
105 | 105 | { |
---|
106 | 106 | #include "trace/beauty/generated/ioctl/perf_ioctl_array.c" |
---|
107 | | - static DEFINE_STRARRAY(perf_ioctl_cmds); |
---|
| 107 | + static DEFINE_STRARRAY(perf_ioctl_cmds, ""); |
---|
108 | 108 | |
---|
109 | 109 | if (nr < strarray__perf_ioctl_cmds.nr_entries && strarray__perf_ioctl_cmds.entries[nr] != NULL) |
---|
110 | 110 | return scnprintf(bf, size, "PERF_%s", strarray__perf_ioctl_cmds.entries[nr]); |
---|
.. | .. |
---|
112 | 112 | return scnprintf(bf, size, "(%#x, %#x, %#x)", 0xAE, nr, dir); |
---|
113 | 113 | } |
---|
114 | 114 | |
---|
115 | | -static size_t ioctl__scnprintf_cmd(unsigned long cmd, char *bf, size_t size) |
---|
| 115 | +static size_t ioctl__scnprintf_usbdevfs_cmd(int nr, int dir, char *bf, size_t size) |
---|
116 | 116 | { |
---|
| 117 | +#include "trace/beauty/generated/ioctl/usbdevfs_ioctl_array.c" |
---|
| 118 | + static DEFINE_STRARRAY(usbdevfs_ioctl_cmds, ""); |
---|
| 119 | + |
---|
| 120 | + if (nr < strarray__usbdevfs_ioctl_cmds.nr_entries && strarray__usbdevfs_ioctl_cmds.entries[nr] != NULL) |
---|
| 121 | + return scnprintf(bf, size, "USBDEVFS_%s", strarray__usbdevfs_ioctl_cmds.entries[nr]); |
---|
| 122 | + |
---|
| 123 | + return scnprintf(bf, size, "(%c, %#x, %#x)", 'U', nr, dir); |
---|
| 124 | +} |
---|
| 125 | + |
---|
| 126 | +static size_t ioctl__scnprintf_cmd(unsigned long cmd, char *bf, size_t size, bool show_prefix) |
---|
| 127 | +{ |
---|
| 128 | + const char *prefix = "_IOC_"; |
---|
117 | 129 | int dir = _IOC_DIR(cmd), |
---|
118 | 130 | type = _IOC_TYPE(cmd), |
---|
119 | 131 | nr = _IOC_NR(cmd), |
---|
.. | .. |
---|
143 | 155 | printed += scnprintf(bf + printed, size - printed, "%c", '('); |
---|
144 | 156 | |
---|
145 | 157 | if (dir == _IOC_NONE) { |
---|
146 | | - printed += scnprintf(bf + printed, size - printed, "%s", "NONE"); |
---|
| 158 | + printed += scnprintf(bf + printed, size - printed, "%s%s", show_prefix ? prefix : "", "NONE"); |
---|
147 | 159 | } else { |
---|
148 | 160 | if (dir & _IOC_READ) |
---|
149 | | - printed += scnprintf(bf + printed, size - printed, "%s", "READ"); |
---|
150 | | - if (dir & _IOC_WRITE) |
---|
151 | | - printed += scnprintf(bf + printed, size - printed, "%s%s", dir & _IOC_READ ? "|" : "", "WRITE"); |
---|
| 161 | + printed += scnprintf(bf + printed, size - printed, "%s%s", show_prefix ? prefix : "", "READ"); |
---|
| 162 | + if (dir & _IOC_WRITE) { |
---|
| 163 | + printed += scnprintf(bf + printed, size - printed, "%s%s%s", dir & _IOC_READ ? "|" : "", |
---|
| 164 | + show_prefix ? prefix : "", "WRITE"); |
---|
| 165 | + } |
---|
152 | 166 | } |
---|
153 | 167 | |
---|
154 | 168 | return printed + scnprintf(bf + printed, size - printed, ", %#x, %#x, %#x)", type, nr, sz); |
---|
155 | 169 | } |
---|
156 | 170 | |
---|
| 171 | +#ifndef USB_DEVICE_MAJOR |
---|
| 172 | +#define USB_DEVICE_MAJOR 189 |
---|
| 173 | +#endif // USB_DEVICE_MAJOR |
---|
| 174 | + |
---|
157 | 175 | size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg) |
---|
158 | 176 | { |
---|
159 | 177 | unsigned long cmd = arg->val; |
---|
| 178 | + int fd = syscall_arg__val(arg, 0); |
---|
| 179 | + struct file *file = thread__files_entry(arg->thread, fd); |
---|
160 | 180 | |
---|
161 | | - return ioctl__scnprintf_cmd(cmd, bf, size); |
---|
| 181 | + if (file != NULL) { |
---|
| 182 | + if (file->dev_maj == USB_DEVICE_MAJOR) |
---|
| 183 | + return ioctl__scnprintf_usbdevfs_cmd(_IOC_NR(cmd), _IOC_DIR(cmd), bf, size); |
---|
| 184 | + } |
---|
| 185 | + |
---|
| 186 | + return ioctl__scnprintf_cmd(cmd, bf, size, arg->show_string_prefix); |
---|
162 | 187 | } |
---|