33
35
# define MADV_UNMERGEABLE 13
41
u64 (*integer)(struct tp_field *field, struct perf_sample *sample);
42
void *(*pointer)(struct tp_field *field, struct perf_sample *sample);
46
#define TP_UINT_FIELD(bits) \
47
static u64 tp_field__u##bits(struct tp_field *field, struct perf_sample *sample) \
49
return *(u##bits *)(sample->raw_data + field->offset); \
57
#define TP_UINT_FIELD__SWAPPED(bits) \
58
static u64 tp_field__swapped_u##bits(struct tp_field *field, struct perf_sample *sample) \
60
u##bits value = *(u##bits *)(sample->raw_data + field->offset); \
61
return bswap_##bits(value);\
64
TP_UINT_FIELD__SWAPPED(16);
65
TP_UINT_FIELD__SWAPPED(32);
66
TP_UINT_FIELD__SWAPPED(64);
68
static int tp_field__init_uint(struct tp_field *field,
69
struct format_field *format_field,
72
field->offset = format_field->offset;
74
switch (format_field->size) {
76
field->integer = tp_field__u8;
79
field->integer = needs_swap ? tp_field__swapped_u16 : tp_field__u16;
82
field->integer = needs_swap ? tp_field__swapped_u32 : tp_field__u32;
85
field->integer = needs_swap ? tp_field__swapped_u64 : tp_field__u64;
94
static void *tp_field__ptr(struct tp_field *field, struct perf_sample *sample)
96
return sample->raw_data + field->offset;
99
static int tp_field__init_ptr(struct tp_field *field, struct format_field *format_field)
101
field->offset = format_field->offset;
102
field->pointer = tp_field__ptr;
109
struct tp_field args, ret;
113
static int perf_evsel__init_tp_uint_field(struct perf_evsel *evsel,
114
struct tp_field *field,
117
struct format_field *format_field = perf_evsel__field(evsel, name);
119
if (format_field == NULL)
122
return tp_field__init_uint(field, format_field, evsel->needs_swap);
125
#define perf_evsel__init_sc_tp_uint_field(evsel, name) \
126
({ struct syscall_tp *sc = evsel->priv;\
127
perf_evsel__init_tp_uint_field(evsel, &sc->name, #name); })
129
static int perf_evsel__init_tp_ptr_field(struct perf_evsel *evsel,
130
struct tp_field *field,
133
struct format_field *format_field = perf_evsel__field(evsel, name);
135
if (format_field == NULL)
138
return tp_field__init_ptr(field, format_field);
141
#define perf_evsel__init_sc_tp_ptr_field(evsel, name) \
142
({ struct syscall_tp *sc = evsel->priv;\
143
perf_evsel__init_tp_ptr_field(evsel, &sc->name, #name); })
145
static void perf_evsel__delete_priv(struct perf_evsel *evsel)
149
perf_evsel__delete(evsel);
152
static int perf_evsel__init_syscall_tp(struct perf_evsel *evsel, void *handler)
154
evsel->priv = malloc(sizeof(struct syscall_tp));
155
if (evsel->priv != NULL) {
156
if (perf_evsel__init_sc_tp_uint_field(evsel, id))
159
evsel->handler = handler;
171
static struct perf_evsel *perf_evsel__syscall_newtp(const char *direction, void *handler)
173
struct perf_evsel *evsel = perf_evsel__newtp("raw_syscalls", direction);
176
if (perf_evsel__init_syscall_tp(evsel, handler))
183
perf_evsel__delete_priv(evsel);
187
#define perf_evsel__sc_tp_uint(evsel, name, sample) \
188
({ struct syscall_tp *fields = evsel->priv; \
189
fields->name.integer(&fields->name, sample); })
191
#define perf_evsel__sc_tp_ptr(evsel, name, sample) \
192
({ struct syscall_tp *fields = evsel->priv; \
193
fields->name.pointer(&fields->name, sample); })
195
static int perf_evlist__add_syscall_newtp(struct perf_evlist *evlist,
196
void *sys_enter_handler,
197
void *sys_exit_handler)
200
struct perf_evsel *sys_enter, *sys_exit;
202
sys_enter = perf_evsel__syscall_newtp("sys_enter", sys_enter_handler);
203
if (sys_enter == NULL)
206
if (perf_evsel__init_sc_tp_ptr_field(sys_enter, args))
207
goto out_delete_sys_enter;
209
sys_exit = perf_evsel__syscall_newtp("sys_exit", sys_exit_handler);
210
if (sys_exit == NULL)
211
goto out_delete_sys_enter;
213
if (perf_evsel__init_sc_tp_uint_field(sys_exit, ret))
214
goto out_delete_sys_exit;
216
perf_evlist__add(evlist, sys_enter);
217
perf_evlist__add(evlist, sys_exit);
224
perf_evsel__delete_priv(sys_exit);
225
out_delete_sys_enter:
226
perf_evsel__delete_priv(sys_enter);
233
struct thread *thread;
243
const char **entries;
246
#define DEFINE_STRARRAY(array) struct strarray strarray__##array = { \
247
.nr_entries = ARRAY_SIZE(array), \
251
#define DEFINE_STRARRAY_OFFSET(array, off) struct strarray strarray__##array = { \
253
.nr_entries = ARRAY_SIZE(array), \
257
static size_t __syscall_arg__scnprintf_strarray(char *bf, size_t size,
259
struct syscall_arg *arg)
261
struct strarray *sa = arg->parm;
262
int idx = arg->val - sa->offset;
264
if (idx < 0 || idx >= sa->nr_entries)
265
return scnprintf(bf, size, intfmt, arg->val);
267
return scnprintf(bf, size, "%s", sa->entries[idx]);
270
static size_t syscall_arg__scnprintf_strarray(char *bf, size_t size,
271
struct syscall_arg *arg)
273
return __syscall_arg__scnprintf_strarray(bf, size, "%d", arg);
276
#define SCA_STRARRAY syscall_arg__scnprintf_strarray
278
static size_t syscall_arg__scnprintf_strhexarray(char *bf, size_t size,
279
struct syscall_arg *arg)
281
return __syscall_arg__scnprintf_strarray(bf, size, "%#x", arg);
284
#define SCA_STRHEXARRAY syscall_arg__scnprintf_strhexarray
286
static size_t syscall_arg__scnprintf_fd(char *bf, size_t size,
287
struct syscall_arg *arg);
289
#define SCA_FD syscall_arg__scnprintf_fd
291
static size_t syscall_arg__scnprintf_fd_at(char *bf, size_t size,
292
struct syscall_arg *arg)
297
return scnprintf(bf, size, "CWD");
299
return syscall_arg__scnprintf_fd(bf, size, arg);
302
#define SCA_FDAT syscall_arg__scnprintf_fd_at
304
static size_t syscall_arg__scnprintf_close_fd(char *bf, size_t size,
305
struct syscall_arg *arg);
307
#define SCA_CLOSE_FD syscall_arg__scnprintf_close_fd
36
309
static size_t syscall_arg__scnprintf_hex(char *bf, size_t size,
38
u8 arg_idx __maybe_unused,
39
u8 *arg_mask __maybe_unused)
310
struct syscall_arg *arg)
41
return scnprintf(bf, size, "%#lx", arg);
312
return scnprintf(bf, size, "%#lx", arg->val);
44
315
#define SCA_HEX syscall_arg__scnprintf_hex
46
static size_t syscall_arg__scnprintf_whence(char *bf, size_t size,
48
u8 arg_idx __maybe_unused,
49
u8 *arg_mask __maybe_unused)
54
#define P_WHENCE(n) case SEEK_##n: return scnprintf(bf, size, #n)
68
return scnprintf(bf, size, "%#x", whence);
71
#define SCA_WHENCE syscall_arg__scnprintf_whence
73
317
static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
75
u8 arg_idx __maybe_unused,
76
u8 *arg_mask __maybe_unused)
318
struct syscall_arg *arg)
78
int printed = 0, prot = arg;
320
int printed = 0, prot = arg->val;
80
322
if (prot == PROT_NONE)
81
323
return scnprintf(bf, size, "NONE");
235
505
#define SCA_FUTEX_OP syscall_arg__scnprintf_futex_op
507
static const char *epoll_ctl_ops[] = { "ADD", "DEL", "MOD", };
508
static DEFINE_STRARRAY_OFFSET(epoll_ctl_ops, 1);
510
static const char *itimers[] = { "REAL", "VIRTUAL", "PROF", };
511
static DEFINE_STRARRAY(itimers);
513
static const char *whences[] = { "SET", "CUR", "END",
521
static DEFINE_STRARRAY(whences);
523
static const char *fcntl_cmds[] = {
524
"DUPFD", "GETFD", "SETFD", "GETFL", "SETFL", "GETLK", "SETLK",
525
"SETLKW", "SETOWN", "GETOWN", "SETSIG", "GETSIG", "F_GETLK64",
526
"F_SETLK64", "F_SETLKW64", "F_SETOWN_EX", "F_GETOWN_EX",
529
static DEFINE_STRARRAY(fcntl_cmds);
531
static const char *rlimit_resources[] = {
532
"CPU", "FSIZE", "DATA", "STACK", "CORE", "RSS", "NPROC", "NOFILE",
533
"MEMLOCK", "AS", "LOCKS", "SIGPENDING", "MSGQUEUE", "NICE", "RTPRIO",
536
static DEFINE_STRARRAY(rlimit_resources);
538
static const char *sighow[] = { "BLOCK", "UNBLOCK", "SETMASK", };
539
static DEFINE_STRARRAY(sighow);
541
static const char *clockid[] = {
542
"REALTIME", "MONOTONIC", "PROCESS_CPUTIME_ID", "THREAD_CPUTIME_ID",
543
"MONOTONIC_RAW", "REALTIME_COARSE", "MONOTONIC_COARSE",
545
static DEFINE_STRARRAY(clockid);
547
static const char *socket_families[] = {
548
"UNSPEC", "LOCAL", "INET", "AX25", "IPX", "APPLETALK", "NETROM",
549
"BRIDGE", "ATMPVC", "X25", "INET6", "ROSE", "DECnet", "NETBEUI",
550
"SECURITY", "KEY", "NETLINK", "PACKET", "ASH", "ECONET", "ATMSVC",
551
"RDS", "SNA", "IRDA", "PPPOX", "WANPIPE", "LLC", "IB", "CAN", "TIPC",
552
"BLUETOOTH", "IUCV", "RXRPC", "ISDN", "PHONET", "IEEE802154", "CAIF",
553
"ALG", "NFC", "VSOCK",
555
static DEFINE_STRARRAY(socket_families);
557
#ifndef SOCK_TYPE_MASK
558
#define SOCK_TYPE_MASK 0xf
561
static size_t syscall_arg__scnprintf_socket_type(char *bf, size_t size,
562
struct syscall_arg *arg)
566
flags = type & ~SOCK_TYPE_MASK;
568
type &= SOCK_TYPE_MASK;
570
* Can't use a strarray, MIPS may override for ABI reasons.
573
#define P_SK_TYPE(n) case SOCK_##n: printed = scnprintf(bf, size, #n); break;
578
P_SK_TYPE(SEQPACKET);
583
printed = scnprintf(bf, size, "%#x", type);
586
#define P_SK_FLAG(n) \
587
if (flags & SOCK_##n) { \
588
printed += scnprintf(bf + printed, size - printed, "|%s", #n); \
589
flags &= ~SOCK_##n; \
597
printed += scnprintf(bf + printed, size - printed, "|%#x", flags);
602
#define SCA_SK_TYPE syscall_arg__scnprintf_socket_type
605
#define MSG_PROBE 0x10
607
#ifndef MSG_WAITFORONE
608
#define MSG_WAITFORONE 0x10000
610
#ifndef MSG_SENDPAGE_NOTLAST
611
#define MSG_SENDPAGE_NOTLAST 0x20000
614
#define MSG_FASTOPEN 0x20000000
617
static size_t syscall_arg__scnprintf_msg_flags(char *bf, size_t size,
618
struct syscall_arg *arg)
620
int printed = 0, flags = arg->val;
623
return scnprintf(bf, size, "NONE");
624
#define P_MSG_FLAG(n) \
625
if (flags & MSG_##n) { \
626
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
632
P_MSG_FLAG(DONTROUTE);
637
P_MSG_FLAG(DONTWAIT);
644
P_MSG_FLAG(ERRQUEUE);
645
P_MSG_FLAG(NOSIGNAL);
647
P_MSG_FLAG(WAITFORONE);
648
P_MSG_FLAG(SENDPAGE_NOTLAST);
649
P_MSG_FLAG(FASTOPEN);
650
P_MSG_FLAG(CMSG_CLOEXEC);
654
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
659
#define SCA_MSG_FLAGS syscall_arg__scnprintf_msg_flags
661
static size_t syscall_arg__scnprintf_access_mode(char *bf, size_t size,
662
struct syscall_arg *arg)
667
if (mode == F_OK) /* 0 */
668
return scnprintf(bf, size, "F");
670
if (mode & n##_OK) { \
671
printed += scnprintf(bf + printed, size - printed, "%s", #n); \
681
printed += scnprintf(bf + printed, size - printed, "|%#x", mode);
686
#define SCA_ACCMODE syscall_arg__scnprintf_access_mode
237
688
static size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size,
239
u8 arg_idx, u8 *arg_mask)
689
struct syscall_arg *arg)
241
int printed = 0, flags = arg;
691
int printed = 0, flags = arg->val;
243
693
if (!(flags & O_CREAT))
244
*arg_mask |= 1 << (arg_idx + 1); /* Mask the mode parm */
694
arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */
247
697
return scnprintf(bf, size, "RDONLY");
292
742
#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
744
static size_t syscall_arg__scnprintf_eventfd_flags(char *bf, size_t size,
745
struct syscall_arg *arg)
747
int printed = 0, flags = arg->val;
750
return scnprintf(bf, size, "NONE");
752
if (flags & EFD_##n) { \
753
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
763
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
768
#define SCA_EFD_FLAGS syscall_arg__scnprintf_eventfd_flags
770
static size_t syscall_arg__scnprintf_pipe_flags(char *bf, size_t size,
771
struct syscall_arg *arg)
773
int printed = 0, flags = arg->val;
776
if (flags & O_##n) { \
777
printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
786
printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
791
#define SCA_PIPE_FLAGS syscall_arg__scnprintf_pipe_flags
793
static size_t syscall_arg__scnprintf_signum(char *bf, size_t size, struct syscall_arg *arg)
798
#define P_SIGNUM(n) case SIG##n: return scnprintf(bf, size, #n)
833
return scnprintf(bf, size, "%#x", sig);
836
#define SCA_SIGNUM syscall_arg__scnprintf_signum
838
#define TCGETS 0x5401
840
static const char *tioctls[] = {
841
"TCGETS", "TCSETS", "TCSETSW", "TCSETSF", "TCGETA", "TCSETA", "TCSETAW",
842
"TCSETAF", "TCSBRK", "TCXONC", "TCFLSH", "TIOCEXCL", "TIOCNXCL",
843
"TIOCSCTTY", "TIOCGPGRP", "TIOCSPGRP", "TIOCOUTQ", "TIOCSTI",
844
"TIOCGWINSZ", "TIOCSWINSZ", "TIOCMGET", "TIOCMBIS", "TIOCMBIC",
845
"TIOCMSET", "TIOCGSOFTCAR", "TIOCSSOFTCAR", "FIONREAD", "TIOCLINUX",
846
"TIOCCONS", "TIOCGSERIAL", "TIOCSSERIAL", "TIOCPKT", "FIONBIO",
847
"TIOCNOTTY", "TIOCSETD", "TIOCGETD", "TCSBRKP", [0x27] = "TIOCSBRK",
848
"TIOCCBRK", "TIOCGSID", "TCGETS2", "TCSETS2", "TCSETSW2", "TCSETSF2",
849
"TIOCGRS485", "TIOCSRS485", "TIOCGPTN", "TIOCSPTLCK",
850
"TIOCGDEV||TCGETX", "TCSETX", "TCSETXF", "TCSETXW", "TIOCSIG",
851
"TIOCVHANGUP", "TIOCGPKT", "TIOCGPTLCK", "TIOCGEXCL",
852
[0x50] = "FIONCLEX", "FIOCLEX", "FIOASYNC", "TIOCSERCONFIG",
853
"TIOCSERGWILD", "TIOCSERSWILD", "TIOCGLCKTRMIOS", "TIOCSLCKTRMIOS",
854
"TIOCSERGSTRUCT", "TIOCSERGETLSR", "TIOCSERGETMULTI", "TIOCSERSETMULTI",
855
"TIOCMIWAIT", "TIOCGICOUNT", [0x60] = "FIOQSIZE",
858
static DEFINE_STRARRAY_OFFSET(tioctls, 0x5401);
860
#define STRARRAY(arg, name, array) \
861
.arg_scnprintf = { [arg] = SCA_STRARRAY, }, \
862
.arg_parm = { [arg] = &strarray__##array, }
294
864
static struct syscall_fmt {
295
865
const char *name;
296
866
const char *alias;
297
size_t (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg, u8 arg_idx, u8 *arg_mask);
867
size_t (*arg_scnprintf[6])(char *bf, size_t size, struct syscall_arg *arg);
301
872
} syscall_fmts[] = {
302
{ .name = "access", .errmsg = true, },
873
{ .name = "access", .errmsg = true,
874
.arg_scnprintf = { [1] = SCA_ACCMODE, /* mode */ }, },
303
875
{ .name = "arch_prctl", .errmsg = true, .alias = "prctl", },
304
876
{ .name = "brk", .hexret = true,
305
877
.arg_scnprintf = { [0] = SCA_HEX, /* brk */ }, },
306
{ .name = "mmap", .hexret = true, },
878
{ .name = "clock_gettime", .errmsg = true, STRARRAY(0, clk_id, clockid), },
879
{ .name = "close", .errmsg = true,
880
.arg_scnprintf = { [0] = SCA_CLOSE_FD, /* fd */ }, },
307
881
{ .name = "connect", .errmsg = true, },
308
{ .name = "fstat", .errmsg = true, .alias = "newfstat", },
309
{ .name = "fstatat", .errmsg = true, .alias = "newfstatat", },
882
{ .name = "dup", .errmsg = true,
883
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
884
{ .name = "dup2", .errmsg = true,
885
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
886
{ .name = "dup3", .errmsg = true,
887
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
888
{ .name = "epoll_ctl", .errmsg = true, STRARRAY(1, op, epoll_ctl_ops), },
889
{ .name = "eventfd2", .errmsg = true,
890
.arg_scnprintf = { [1] = SCA_EFD_FLAGS, /* flags */ }, },
891
{ .name = "faccessat", .errmsg = true,
892
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
893
{ .name = "fadvise64", .errmsg = true,
894
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
895
{ .name = "fallocate", .errmsg = true,
896
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
897
{ .name = "fchdir", .errmsg = true,
898
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
899
{ .name = "fchmod", .errmsg = true,
900
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
901
{ .name = "fchmodat", .errmsg = true,
902
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
903
{ .name = "fchown", .errmsg = true,
904
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
905
{ .name = "fchownat", .errmsg = true,
906
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
907
{ .name = "fcntl", .errmsg = true,
908
.arg_scnprintf = { [0] = SCA_FD, /* fd */
909
[1] = SCA_STRARRAY, /* cmd */ },
910
.arg_parm = { [1] = &strarray__fcntl_cmds, /* cmd */ }, },
911
{ .name = "fdatasync", .errmsg = true,
912
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
913
{ .name = "flock", .errmsg = true,
914
.arg_scnprintf = { [0] = SCA_FD, /* fd */
915
[1] = SCA_FLOCK, /* cmd */ }, },
916
{ .name = "fsetxattr", .errmsg = true,
917
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
918
{ .name = "fstat", .errmsg = true, .alias = "newfstat",
919
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
920
{ .name = "fstatat", .errmsg = true, .alias = "newfstatat",
921
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
922
{ .name = "fstatfs", .errmsg = true,
923
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
924
{ .name = "fsync", .errmsg = true,
925
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
926
{ .name = "ftruncate", .errmsg = true,
927
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
310
928
{ .name = "futex", .errmsg = true,
311
929
.arg_scnprintf = { [1] = SCA_FUTEX_OP, /* op */ }, },
930
{ .name = "futimesat", .errmsg = true,
931
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
932
{ .name = "getdents", .errmsg = true,
933
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
934
{ .name = "getdents64", .errmsg = true,
935
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
936
{ .name = "getitimer", .errmsg = true, STRARRAY(0, which, itimers), },
937
{ .name = "getrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
312
938
{ .name = "ioctl", .errmsg = true,
313
.arg_scnprintf = { [2] = SCA_HEX, /* arg */ }, },
939
.arg_scnprintf = { [0] = SCA_FD, /* fd */
940
[1] = SCA_STRHEXARRAY, /* cmd */
941
[2] = SCA_HEX, /* arg */ },
942
.arg_parm = { [1] = &strarray__tioctls, /* cmd */ }, },
943
{ .name = "kill", .errmsg = true,
944
.arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
945
{ .name = "linkat", .errmsg = true,
946
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
314
947
{ .name = "lseek", .errmsg = true,
315
.arg_scnprintf = { [2] = SCA_WHENCE, /* whence */ }, },
948
.arg_scnprintf = { [0] = SCA_FD, /* fd */
949
[2] = SCA_STRARRAY, /* whence */ },
950
.arg_parm = { [2] = &strarray__whences, /* whence */ }, },
316
951
{ .name = "lstat", .errmsg = true, .alias = "newlstat", },
317
952
{ .name = "madvise", .errmsg = true,
318
953
.arg_scnprintf = { [0] = SCA_HEX, /* start */
319
954
[2] = SCA_MADV_BHV, /* behavior */ }, },
955
{ .name = "mkdirat", .errmsg = true,
956
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
957
{ .name = "mknodat", .errmsg = true,
958
.arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
959
{ .name = "mlock", .errmsg = true,
960
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
961
{ .name = "mlockall", .errmsg = true,
962
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
320
963
{ .name = "mmap", .hexret = true,
321
964
.arg_scnprintf = { [0] = SCA_HEX, /* addr */
322
965
[2] = SCA_MMAP_PROT, /* prot */
323
[3] = SCA_MMAP_FLAGS, /* flags */ }, },
966
[3] = SCA_MMAP_FLAGS, /* flags */
967
[4] = SCA_FD, /* fd */ }, },
324
968
{ .name = "mprotect", .errmsg = true,
325
969
.arg_scnprintf = { [0] = SCA_HEX, /* start */
326
970
[2] = SCA_MMAP_PROT, /* prot */ }, },
327
971
{ .name = "mremap", .hexret = true,
328
972
.arg_scnprintf = { [0] = SCA_HEX, /* addr */
329
973
[4] = SCA_HEX, /* new_addr */ }, },
974
{ .name = "munlock", .errmsg = true,
975
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
330
976
{ .name = "munmap", .errmsg = true,
331
977
.arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
978
{ .name = "name_to_handle_at", .errmsg = true,
979
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
980
{ .name = "newfstatat", .errmsg = true,
981
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
332
982
{ .name = "open", .errmsg = true,
333
983
.arg_scnprintf = { [1] = SCA_OPEN_FLAGS, /* flags */ }, },
334
984
{ .name = "open_by_handle_at", .errmsg = true,
335
.arg_scnprintf = { [2] = SCA_OPEN_FLAGS, /* flags */ }, },
985
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
986
[2] = SCA_OPEN_FLAGS, /* flags */ }, },
336
987
{ .name = "openat", .errmsg = true,
337
.arg_scnprintf = { [2] = SCA_OPEN_FLAGS, /* flags */ }, },
988
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
989
[2] = SCA_OPEN_FLAGS, /* flags */ }, },
990
{ .name = "pipe2", .errmsg = true,
991
.arg_scnprintf = { [1] = SCA_PIPE_FLAGS, /* flags */ }, },
338
992
{ .name = "poll", .errmsg = true, .timeout = true, },
339
993
{ .name = "ppoll", .errmsg = true, .timeout = true, },
340
{ .name = "pread", .errmsg = true, .alias = "pread64", },
341
{ .name = "pwrite", .errmsg = true, .alias = "pwrite64", },
342
{ .name = "read", .errmsg = true, },
343
{ .name = "recvfrom", .errmsg = true, },
994
{ .name = "pread", .errmsg = true, .alias = "pread64",
995
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
996
{ .name = "preadv", .errmsg = true, .alias = "pread",
997
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
998
{ .name = "prlimit64", .errmsg = true, STRARRAY(1, resource, rlimit_resources), },
999
{ .name = "pwrite", .errmsg = true, .alias = "pwrite64",
1000
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
1001
{ .name = "pwritev", .errmsg = true,
1002
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
1003
{ .name = "read", .errmsg = true,
1004
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
1005
{ .name = "readlinkat", .errmsg = true,
1006
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
1007
{ .name = "readv", .errmsg = true,
1008
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
1009
{ .name = "recvfrom", .errmsg = true,
1010
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
1011
{ .name = "recvmmsg", .errmsg = true,
1012
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
1013
{ .name = "recvmsg", .errmsg = true,
1014
.arg_scnprintf = { [2] = SCA_MSG_FLAGS, /* flags */ }, },
1015
{ .name = "renameat", .errmsg = true,
1016
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
1017
{ .name = "rt_sigaction", .errmsg = true,
1018
.arg_scnprintf = { [0] = SCA_SIGNUM, /* sig */ }, },
1019
{ .name = "rt_sigprocmask", .errmsg = true, STRARRAY(0, how, sighow), },
1020
{ .name = "rt_sigqueueinfo", .errmsg = true,
1021
.arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
1022
{ .name = "rt_tgsigqueueinfo", .errmsg = true,
1023
.arg_scnprintf = { [2] = SCA_SIGNUM, /* sig */ }, },
344
1024
{ .name = "select", .errmsg = true, .timeout = true, },
345
{ .name = "socket", .errmsg = true, },
1025
{ .name = "sendmmsg", .errmsg = true,
1026
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
1027
{ .name = "sendmsg", .errmsg = true,
1028
.arg_scnprintf = { [2] = SCA_MSG_FLAGS, /* flags */ }, },
1029
{ .name = "sendto", .errmsg = true,
1030
.arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
1031
{ .name = "setitimer", .errmsg = true, STRARRAY(0, which, itimers), },
1032
{ .name = "setrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
1033
{ .name = "shutdown", .errmsg = true,
1034
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
1035
{ .name = "socket", .errmsg = true,
1036
.arg_scnprintf = { [0] = SCA_STRARRAY, /* family */
1037
[1] = SCA_SK_TYPE, /* type */ },
1038
.arg_parm = { [0] = &strarray__socket_families, /* family */ }, },
1039
{ .name = "socketpair", .errmsg = true,
1040
.arg_scnprintf = { [0] = SCA_STRARRAY, /* family */
1041
[1] = SCA_SK_TYPE, /* type */ },
1042
.arg_parm = { [0] = &strarray__socket_families, /* family */ }, },
346
1043
{ .name = "stat", .errmsg = true, .alias = "newstat", },
1044
{ .name = "symlinkat", .errmsg = true,
1045
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
1046
{ .name = "tgkill", .errmsg = true,
1047
.arg_scnprintf = { [2] = SCA_SIGNUM, /* sig */ }, },
1048
{ .name = "tkill", .errmsg = true,
1049
.arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
347
1050
{ .name = "uname", .errmsg = true, .alias = "newuname", },
1051
{ .name = "unlinkat", .errmsg = true,
1052
.arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
1053
{ .name = "utimensat", .errmsg = true,
1054
.arg_scnprintf = { [0] = SCA_FDAT, /* dirfd */ }, },
1055
{ .name = "write", .errmsg = true,
1056
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
1057
{ .name = "writev", .errmsg = true,
1058
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
350
1061
static int syscall_fmt__cmp(const void *name, const void *fmtp)