| .. | .. |
|---|
| 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 | } |
|---|