[PATCH v3] tests: check decoding of readahead syscall
* tests/readahead.c: New file. * tests/readahead.test: New test. * tests/.gitignore: Add readahead. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add readahead.test. --- Changes since v2: * Added workaround for an old glibc bug (https://sourceware.org/bugzilla/show_bug.cgi?id=5208) which is still present in RHEL 5. tests/.gitignore |1 + tests/Makefile.am|2 ++ tests/readahead.c| 89 ++ tests/readahead.test |6 4 files changed, 98 insertions(+) create mode 100644 tests/readahead.c create mode 100755 tests/readahead.test diff --git a/tests/.gitignore b/tests/.gitignore index 5c5d092..8c41bea 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -185,6 +185,7 @@ pselect6 ptrace pwritev read-write +readahead readdir readlink readlinkat diff --git a/tests/Makefile.am b/tests/Makefile.am index 2cf9674..0b3b818 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -242,6 +242,7 @@ check_PROGRAMS = \ ptrace \ pwritev \ read-write \ + readahead \ readdir \ readlink \ readlinkat \ @@ -569,6 +570,7 @@ DECODER_TESTS = \ ptrace.test \ pwritev.test \ read-write.test \ + readahead.test \ readdir.test \ readlink.test \ readlinkat.test \ diff --git a/tests/readahead.c b/tests/readahead.c new file mode 100644 index 000..6f50e38 --- /dev/null +++ b/tests/readahead.c @@ -0,0 +1,89 @@ +#include "tests.h" +#include + +#ifdef __NR_readahead + +# include +# include +# include + +# if !defined(STRACE_READAHEAD_USE_SYSCALL) +# if defined(__GNU_LIBRARY__) +/* Check for glibc readahead off64_t argument passing bug, + * see https://sourceware.org/bugzilla/show_bug.cgi?id=5208 */ +# if defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \ + (__GLIBC__ * 1000 + __GLIBC_MINOR__ > 2007) +#define STRACE_READAHEAD_USE_SYSCALL 0 +# else +#define STRACE_READAHEAD_USE_SYSCALL 1 +# endif +# else /* !defined(__GNU_LIBRARY__) */ +# define STRACE_READAHEAD_USE_SYSCALL 0 +# endif /* defined(__GNU_LIBRARY__) */ +# endif /* !defined(READAHED_USE_SYSCALL) */ + +static const int fds[] = { + -0x8000, + -100, + -1, + 0, + 1, + 2, + 0x7fff, +}; + +static const off64_t offsets[] = { + -0x8000LL, + -0x5060708090a0b0c0LL, + -1LL, +0, +1, +0xbadfaced, +0x7fffLL, +}; + +static const unsigned long counts[] = { + 0UL, + 0xdeadca75, + (unsigned long)0xface1e55beeff00dULL, + (unsigned long)0xULL, +}; + +static inline ssize_t +do_readahead(int fd, off64_t offset, size_t count) +{ +#if STRACE_READAHEAD_USE_SYSCALL + return syscall(__NR_readahead, fd, offset, count); +#else + return readahead(fd, offset, count); +#endif +} + +int +main(void) +{ + unsigned i; + unsigned j; + unsigned k; + ssize_t rc; + + for (i = 0; i < ARRAY_SIZE(fds); i++) + for (j = 0; j < ARRAY_SIZE(offsets); j++) + for (k = 0; k < ARRAY_SIZE(counts); k++) { + rc = do_readahead(fds[i], offsets[j], + counts[k]); + + printf("readahead(%d, %lld, %lu) = %s\n", + fds[i], (long long)offsets[j], + counts[k], sprintrc(rc)); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_readahead") + +#endif diff --git a/tests/readahead.test b/tests/readahead.test new file mode 100755 index 000..397c690 --- /dev/null +++ b/tests/readahead.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check readahead syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a1 -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH v3.1] tests: check decoding of readahead syscall
* tests/readahead.c: New file. * tests/readahead.test: New test. * tests/.gitignore: Add readahead. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add readahead.test. --- Changes from v3: * Scraping incorrect attempt to work around glibc bug, now just skipping the test. tests/.gitignore |1 + tests/Makefile.am|2 ++ tests/readahead.c| 79 ++ tests/readahead.test |6 4 files changed, 88 insertions(+) create mode 100644 tests/readahead.c create mode 100755 tests/readahead.test diff --git a/tests/.gitignore b/tests/.gitignore index 5c5d092..8c41bea 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -185,6 +185,7 @@ pselect6 ptrace pwritev read-write +readahead readdir readlink readlinkat diff --git a/tests/Makefile.am b/tests/Makefile.am index 2cf9674..0b3b818 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -242,6 +242,7 @@ check_PROGRAMS = \ ptrace \ pwritev \ read-write \ + readahead \ readdir \ readlink \ readlinkat \ @@ -569,6 +570,7 @@ DECODER_TESTS = \ ptrace.test \ pwritev.test \ read-write.test \ + readahead.test \ readdir.test \ readlink.test \ readlinkat.test \ diff --git a/tests/readahead.c b/tests/readahead.c new file mode 100644 index 000..f5972af --- /dev/null +++ b/tests/readahead.c @@ -0,0 +1,79 @@ +#include "tests.h" +#include + +#if !defined(STRACE_READAHEAD_BROKEN) +# if defined(__GNU_LIBRARY__) +/* Check for glibc readahead off64_t argument passing bug, + * see https://sourceware.org/bugzilla/show_bug.cgi?id=5208 */ +# if defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \ + (__GLIBC__ * 1000 + __GLIBC_MINOR__ <= 2007) +# define STRACE_READAHEAD_BROKEN 1 +# endif +# endif /* defined(__GNU_LIBRARY__) */ +#endif /* !defined(STRACE_READAHEAD_BROKEN) */ + +#if defined(STRACE_READAHEAD_BROKEN) && STRACE_READAHEAD_BROKEN && \ + defined(__NR_readahead) +# undef __NR_readahead +#endif + +#ifdef __NR_readahead + +# include +# include +# include + +static const int fds[] = { + -0x8000, + -100, + -1, + 0, + 1, + 2, + 0x7fff, +}; + +static const off64_t offsets[] = { + -0x8000LL, + -0x5060708090a0b0c0LL, + -1LL, +0, +1, +0xbadfaced, +0x7fffLL, +}; + +static const unsigned long counts[] = { + 0UL, + 0xdeadca75, + (unsigned long)0xface1e55beeff00dULL, + (unsigned long)0xULL, +}; + +int +main(void) +{ + unsigned i; + unsigned j; + unsigned k; + ssize_t rc; + + for (i = 0; i < ARRAY_SIZE(fds); i++) + for (j = 0; j < ARRAY_SIZE(offsets); j++) + for (k = 0; k < ARRAY_SIZE(counts); k++) { + rc = readahead(fds[i], offsets[j], counts[k]); + + printf("readahead(%d, %lld, %lu) = %s\n", + fds[i], (long long)offsets[j], + counts[k], sprintrc(rc)); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_readahead") + +#endif diff --git a/tests/readahead.test b/tests/readahead.test new file mode 100755 index 000..397c690 --- /dev/null +++ b/tests/readahead.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check readahead syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a1 -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 0/9] Minor decoder fixes and various tests amendments
Hello. This is quite inconsistent collection of patches for various decoder test in attempt to make them more thorough. Eugene Syromyatnikov (9): tests: check decoding of perf_event_open syscall tests: Use sprintrc for return code output in sched_xetscheduler test tests: Additional decoder tests in sched_xetscheduler tests: Use sprintrc for return code output in sched_rr_get_interval test tests: Additional decoder tests in sched_rr_get_interval aio: Use printfd for fd printing tests: Use sprintrc for return code output in aio test tests: min_nr and nr arguments in io_getevents should be long tests: Some additional aio checks aio.c | 21 tests/.gitignore |1 + tests/Makefile.am |2 + tests/aio.c | 120 ++--- tests/perf_event_open.c | 83 tests/perf_event_open.test|6 +++ tests/sched_rr_get_interval.c | 22 ++-- tests/sched_xetscheduler.c| 23 +++- 8 files changed, 258 insertions(+), 20 deletions(-) create mode 100644 tests/perf_event_open.c create mode 100755 tests/perf_event_open.test -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 1/9] tests: check decoding of perf_event_open syscall
* tests/perf_event_open.c: New file. * tests/perf_event_open.test: New test. * tests/.gitignore: Add perf_event_open. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add perf_event_open.test. --- tests/.gitignore |1 + tests/Makefile.am |2 ++ tests/perf_event_open.c| 83 tests/perf_event_open.test |6 4 files changed, 92 insertions(+) create mode 100644 tests/perf_event_open.c create mode 100755 tests/perf_event_open.test diff --git a/tests/.gitignore b/tests/.gitignore index 8c41bea..84a795d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -170,6 +170,7 @@ open openat pause pc +perf_event_open personality pipe poll diff --git a/tests/Makefile.am b/tests/Makefile.am index 0b3b818..3e3d073 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -227,6 +227,7 @@ check_PROGRAMS = \ openat \ pause \ pc \ + perf_event_open \ personality \ pipe \ poll \ @@ -555,6 +556,7 @@ DECODER_TESTS = \ open.test \ openat.test \ pause.test \ + perf_event_open.test \ personality.test \ pipe.test \ poll.test \ diff --git a/tests/perf_event_open.c b/tests/perf_event_open.c new file mode 100644 index 000..afdd71d --- /dev/null +++ b/tests/perf_event_open.c @@ -0,0 +1,83 @@ +#include "tests.h" +#include + +#ifdef __NR_perf_event_open + +# include +# include +# include + +# include +# include + +#if ULONG_MAX > UINT_MAX +#define LONG_STR_PREFIX "" +#else +#define LONG_STR_PREFIX "" +#endif + +static const char *printaddr(void *ptr) +{ + static char buf[sizeof("0x") + sizeof(void *) * 2]; + + if (ptr == NULL) + return "NULL"; + + snprintf(buf, sizeof(buf), "%#lx", (unsigned long)ptr); + + return buf; +} + +int +main(void) +{ + struct perf_event_attr *attr = tail_alloc(sizeof(*attr)); + + attr->type = PERF_TYPE_HARDWARE; + attr->size = sizeof(*attr); + + struct { + struct perf_event_attr *attr; + pid_t pid; + int cpu; + int group_fd; + unsigned long flags; + const char *flags_str; + } args[] = { + { NULL, 0xfacef00d, 0xbadabba7, -1, + (unsigned long)0xLLU, + "PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|" + "PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC|" + "0x" LONG_STR_PREFIX "fff0" + }, + { attr + 1, 0, 0, 0, + 0, "0" }, + { attr, -1, -1, 1, + PERF_FLAG_FD_CLOEXEC, "PERF_FLAG_FD_CLOEXEC" }, + { attr - 1, -100, 100,0xface1e55, + PERF_FLAG_FD_NO_GROUP | PERF_FLAG_FD_OUTPUT | + PERF_FLAG_PID_CGROUP | PERF_FLAG_FD_CLOEXEC, + "PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|" + "PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC" }, + }; + size_t i; + int rc; + + for (i = 0; i < ARRAY_SIZE(args); i++) { + rc = syscall(__NR_perf_event_open, args[i].attr, args[i].pid, + args[i].cpu, args[i].group_fd, args[i].flags); + printf("perf_event_open(%s, %d, %d, %d, %s) = %s\n", + printaddr(args[i].attr), args[i].pid, args[i].cpu, + args[i].group_fd, args[i].flags_str, sprintrc(rc)); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_perf_event_open") + +#endif + diff --git a/tests/perf_event_open.test b/tests/perf_event_open.test new file mode 100755 index 000..af3860a --- /dev/null +++ b/tests/perf_event_open.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check perf_event_open syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a1 -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 3/9] tests: Additional decoder tests in sched_xetscheduler
Some additional syscall parser tests: * Incorrect (negative) PID in sched_getscheduler, sched_setscheduler * Incorrect address of sched_param structure. * Incorrect policy value. * tests/sched_xetscheduler.c: additional tests. --- tests/sched_xetscheduler.c | 19 +++ 1 file changed, 19 insertions(+) diff --git a/tests/sched_xetscheduler.c b/tests/sched_xetscheduler.c index ffb3307..7faee8c 100644 --- a/tests/sched_xetscheduler.c +++ b/tests/sched_xetscheduler.c @@ -46,7 +46,26 @@ main(void) printf("sched_getscheduler(0) = %ld (%s)\n", rc, scheduler); + rc = syscall(__NR_sched_getscheduler, -1); + printf("sched_getscheduler(-1) = %s\n", sprintrc(rc)); + param->sched_priority = -1; + + rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, NULL); + printf("sched_setscheduler(0, SCHED_FIFO, NULL) = %s\n", sprintrc(rc)); + + rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, param + 1); + printf("sched_setscheduler(0, SCHED_FIFO, %p) = %s\n", param + 1, + sprintrc(rc)); + + rc = syscall(__NR_sched_setscheduler, 0, 0xfaceda7a, param); + printf("sched_setscheduler(0, %#x /* SCHED_??? */, [%d]) = %s\n", + 0xfaceda7a, param->sched_priority, sprintrc(rc)); + + rc = syscall(__NR_sched_setscheduler, -1, SCHED_FIFO, param); + printf("sched_setscheduler(-1, SCHED_FIFO, [%d]) = %s\n", + param->sched_priority, sprintrc(rc)); + rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, param); printf("sched_setscheduler(0, SCHED_FIFO, [%d]) = %s\n", param->sched_priority, sprintrc(rc)); -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 4/9] tests: Use sprintrc for return code output in sched_rr_get_interval test
* tests/sched_rr_get_interval.c: Use sprintrc for return code output. --- tests/sched_rr_get_interval.c |3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/sched_rr_get_interval.c b/tests/sched_rr_get_interval.c index 8501346..73e2d39 100644 --- a/tests/sched_rr_get_interval.c +++ b/tests/sched_rr_get_interval.c @@ -12,8 +12,7 @@ main(void) { struct timespec *const tp = tail_alloc(sizeof(struct timespec)); long rc = syscall(__NR_sched_rr_get_interval, -1, tp); - printf("sched_rr_get_interval(-1, %p) = %ld %s (%m)\n", - tp, rc, errno2name()); + printf("sched_rr_get_interval(-1, %p) = %s\n", sprintrc(rc)); puts("+++ exited with 0 +++"); return 0; -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 5/9] tests: Additional decoder tests in sched_rr_get_interval
Some additional syscall parser tests: * Incorrect timespec pointer. * Successful call. * tests/sched_rr_get_interval.c: Additional tests. --- tests/sched_rr_get_interval.c | 21 +++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/sched_rr_get_interval.c b/tests/sched_rr_get_interval.c index 73e2d39..99943e7 100644 --- a/tests/sched_rr_get_interval.c +++ b/tests/sched_rr_get_interval.c @@ -3,6 +3,7 @@ #ifdef __NR_sched_rr_get_interval +# include # include # include # include @@ -11,8 +12,24 @@ int main(void) { struct timespec *const tp = tail_alloc(sizeof(struct timespec)); - long rc = syscall(__NR_sched_rr_get_interval, -1, tp); - printf("sched_rr_get_interval(-1, %p) = %s\n", sprintrc(rc)); + long rc; + + rc = syscall(__NR_sched_rr_get_interval, 0, NULL); + printf("sched_rr_get_interval(0, NULL) = %s\n", sprintrc(rc)); + + rc = syscall(__NR_sched_rr_get_interval, 0, tp + 1); + printf("sched_rr_get_interval(0, %p) = %s\n", tp + 1, sprintrc(rc)); + + rc = syscall(__NR_sched_rr_get_interval, -1, tp); + printf("sched_rr_get_interval(-1, %p) = %s\n", tp, sprintrc(rc)); + + rc = syscall(__NR_sched_rr_get_interval, 0, tp); + if (rc == 0) + printf("sched_rr_get_interval(0, {%jd, %jd}) = 0\n", + (intmax_t)tp->tv_sec, (intmax_t)tp->tv_nsec); + else + printf("sched_rr_get_interval(-1, %p) = %s\n", tp, + sprintrc(rc)); puts("+++ exited with 0 +++"); return 0; -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 6/9] aio: Use printfd for fd printing
struct iocb contains two fields with fd semantics: aio_fildes and aio_resfd. It is quite reasonable to use appropriate function for printing them (apart from just "%d"). * aio.c (print_common_flags): Add struct tcb pointer to parameter list; use printfd for printing aio_resfd field. (print_iocb_header): Add struct tcb pointer to parameter list; use printfd for printing aio_fildes field. (print_iocb): provide tcp argument to print_iocb_header and print_common_flags. (SYS_FUNC(io_cancel)): Likewise. --- aio.c | 21 - 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/aio.c b/aio.c index 29562d2..7b908d4 100644 --- a/aio.c +++ b/aio.c @@ -78,12 +78,14 @@ tprint_lio_opcode(unsigned cmd) } static void -print_common_flags(const struct iocb *cb) +print_common_flags(struct tcb *tcp, const struct iocb *cb) { /* IOCB_FLAG_RESFD is available since v2.6.22-rc1~47 */ #ifdef IOCB_FLAG_RESFD - if (cb->aio_flags & IOCB_FLAG_RESFD) - tprintf(", resfd=%d", cb->aio_resfd); + if (cb->aio_flags & IOCB_FLAG_RESFD) { + tprints(", resfd="); + printfd(tcp, cb->aio_resfd); + } if (cb->aio_flags & ~IOCB_FLAG_RESFD) tprintf(", flags=%x", cb->aio_flags); #endif @@ -98,7 +100,7 @@ iocb_is_valid(const struct iocb *cb) } static enum iocb_sub -print_iocb_header(const struct iocb *cb) +print_iocb_header(struct tcb *tcp, const struct iocb *cb) { enum iocb_sub sub; @@ -113,7 +115,8 @@ print_iocb_header(const struct iocb *cb) if (cb->aio_reqprio) tprintf(", reqprio=%hd", cb->aio_reqprio); - tprintf(", fildes=%d", cb->aio_fildes); + tprints(", fildes="); + printfd(tcp, cb->aio_fildes); return sub; } @@ -121,7 +124,7 @@ print_iocb_header(const struct iocb *cb) static void print_iocb(struct tcb *tcp, const struct iocb *cb) { - enum iocb_sub sub = print_iocb_header(cb); + enum iocb_sub sub = print_iocb_header(tcp, cb); switch (sub) { case SUB_COMMON: @@ -134,7 +137,7 @@ print_iocb(struct tcb *tcp, const struct iocb *cb) } tprintf(", nbytes=%" PRIu64 ", offset=%" PRId64, (uint64_t) cb->aio_nbytes, (int64_t) cb->aio_offset); - print_common_flags(cb); + print_common_flags(tcp, cb); break; case SUB_VECTOR: if (iocb_is_valid(cb)) { @@ -149,7 +152,7 @@ print_iocb(struct tcb *tcp, const struct iocb *cb) (uint64_t) cb->aio_nbytes); } tprintf(", offset=%" PRId64, (int64_t) cb->aio_offset); - print_common_flags(cb); + print_common_flags(tcp, cb); break; case SUB_NONE: break; @@ -214,7 +217,7 @@ SYS_FUNC(io_cancel) if (!umove_or_printaddr(tcp, tcp->u_arg[1], &cb)) { tprints("{"); - print_iocb_header(&cb); + print_iocb_header(tcp, &cb); tprints("}"); } tprints(", "); -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 9/9] tests: Some additional aio checks
* aio.c: Additional checks added. --- tests/aio.c | 108 +++ 1 file changed, 108 insertions(+) diff --git a/tests/aio.c b/tests/aio.c index 8c5bfa7..00de5ae 100644 --- a/tests/aio.c +++ b/tests/aio.c @@ -111,6 +111,33 @@ main(void) }; const struct iocb *cbv = tail_memdup(proto_cbv, sizeof(proto_cbv)); + /* For additional decoder testing */ + const struct iocb proto_cbv2[] = { + { + .aio_data = 0xbadfacedc0ffeeed, + .aio_key = 0xdefaced0, + .aio_lio_opcode = 0xf00d, + .aio_reqprio = 0xbeef, + .aio_fildes = 0xdefaced1, + .aio_buf = 0, + }, + { + .aio_data = 0xbadfacedc0ffeeed, + .aio_key = 0xdefaced0, + .aio_lio_opcode = 1, + .aio_reqprio = 0xbeef, + .aio_fildes = 0xdefaced1, + .aio_buf = 0, + .aio_nbytes = 0x1020304050607080, + .aio_offset = 0xdeadda7abadc0ded, +# ifdef IOCB_FLAG_RESFD + .aio_flags = 0xfacef157, + .aio_resfd = 0xded1ca7e, +# endif + }, + }; + const struct iocb *cbv2 = tail_memdup(proto_cbv2, sizeof(proto_cbv2)); + const struct iocb proto_cbc = { .aio_data = 0xdeadbeefbadc0ded, .aio_reqprio = 99, @@ -128,6 +155,11 @@ main(void) }; const long *cbvs = tail_memdup(proto_cbvs, sizeof(proto_cbvs)); + const long proto_cbvs2[] = { + (long) &cbv2[0], (long) &cbv2[1], + }; + const long *cbvs2 = tail_memdup(proto_cbvs2, sizeof(proto_cbvs2)); + unsigned long *ctx = tail_alloc(sizeof(unsigned long)); *ctx = 0; @@ -142,10 +174,26 @@ main(void) if (open("/dev/zero", O_RDONLY)) perror_msg_and_skip("open: %s", "/dev/zero"); + assert(syscall(__NR_io_setup, 0xdeadbeef, NULL) == -1); + printf("io_setup(%u, NULL) = %s\n", 0xdeadbeef, sprintrc(-1)); + + assert(syscall(__NR_io_setup, lnr, ctx + 1) == -1); + printf("io_setup(%u, %p) = %s\n", nr, ctx + 1, sprintrc(-1)); + if (syscall(__NR_io_setup, lnr, ctx)) perror_msg_and_skip("io_setup"); printf("io_setup(%u, [%lu]) = 0\n", nr, *ctx); + assert(syscall(__NR_io_submit, (aio_context_t) 0xface1e55deadbeef, + (long) 0xca7faceddeadf00d, NULL) == -1); + printf("io_submit(%lu, %ld, NULL) = %s\n", + (aio_context_t) 0xface1e55deadbeef, (long) 0xca7faceddeadf00d, + sprintrc(-1)); + + assert(syscall(__NR_io_submit, *ctx, nr, cbs + nr) == -1); + printf("io_submit(%lu, %u, %p) = %s\n", + *ctx, nr, cbs + nr, sprintrc(-1)); + assert(syscall(__NR_io_submit, *ctx, -1L, cbs) == -1); printf("io_submit(%lu, -1, %p) = %s\n", *ctx, cbs, sprintrc(-1)); @@ -165,6 +213,22 @@ main(void) sizeof_data1, (long long) cb[1].aio_offset, nr); + assert(syscall(__NR_io_getevents, (aio_context_t) 0xface1e55deadbeef, + (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0, ev + 1, + NULL) == -1); + printf("io_getevents(%lu, %ld, %ld, %p, NULL) = %s\n", + (aio_context_t) 0xface1e55deadbeef, + (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0, + ev + 1, sprintrc(-1)); + + assert(syscall(__NR_io_getevents, (aio_context_t) 0xface1e55deadbeef, + (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0, NULL, + ts + 1) == -1); + printf("io_getevents(%lu, %ld, %ld, NULL, %p) = %s\n", + (aio_context_t) 0xface1e55deadbeef, + (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0, + ts + 1, sprintrc(-1)); + assert(syscall(__NR_io_getevents, *ctx, nr, nr + 1, ev, ts) == (long) nr); printf("io_getevents(%lu, %ld, %ld, [" "{data=%#llx, obj=%p, res=%u, res2=0}, " @@ -175,11 +239,50 @@ main(void) (unsigned long long) cb[1].aio_data, &cb[1], sizeof_data1, nr); + assert(syscall(__NR_io_cancel, *ctx, NULL, NULL) == -1); + printf("io_cancel(%lu, NULL, NULL) = %s\n", *ctx, sprintrc(-1)); + + assert(syscall(__NR_io_cancel, *ctx, cbc + 1, ev) == -1); + printf("io_cancel(%lu, %p, %p) = %s\n", *ctx, cbc + 1, ev, + sprintrc(-1)); + assert(syscall(__NR_io_cancel, *ctx, cbc, ev) == -1); printf("io_cancel(%lu, {data=%#llx, pread, reqprio=99, fildes=-42}, %p) " "= %s\n", *ctx, (unsigned long long) cbc->aio_data, ev, sprintrc(-1)); + assert(syscall(__NR_io_submit, (unsigned long)0xfacef157beeff00dULL, +
[PATCH 7/9] tests: Use sprintrc for return code output in aio test
* tests/aio.c: Use sprintrc for return code output. --- tests/aio.c |8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/aio.c b/tests/aio.c index a6a3b9c..5a023cf 100644 --- a/tests/aio.c +++ b/tests/aio.c @@ -147,8 +147,8 @@ main(void) printf("io_setup(%u, [%lu]) = 0\n", nr, *ctx); assert(syscall(__NR_io_submit, *ctx, -1L, cbs) == -1); - printf("io_submit(%lu, -1, %p) = -1 %s (%m)\n", - *ctx, cbs, errno2name()); + printf("io_submit(%lu, -1, %p) = %s\n", + *ctx, cbs, sprintrc(-1)); if (syscall(__NR_io_submit, *ctx, nr, cbs) != (long) nr) perror_msg_and_skip("io_submit"); @@ -177,8 +177,8 @@ main(void) assert(syscall(__NR_io_cancel, *ctx, cbc, ev) == -1); printf("io_cancel(%lu, {data=%#llx, pread, reqprio=99, fildes=-42}, %p) " - "= -1 %s (%m)\n", - *ctx, (unsigned long long) cbc->aio_data, ev, errno2name()); + "= %s\n", + *ctx, (unsigned long long) cbc->aio_data, ev, sprintrc(-1)); if (syscall(__NR_io_submit, *ctx, nr, cbvs) != (long) nr) perror_msg_and_skip("io_submit"); -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 2/9] tests: Use sprintrc for return code output in sched_xetscheduler test
* tests/sched_xetscheduler.c: Use sprintrc for return code output. --- tests/sched_xetscheduler.c |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/sched_xetscheduler.c b/tests/sched_xetscheduler.c index d3b7759..ffb3307 100644 --- a/tests/sched_xetscheduler.c +++ b/tests/sched_xetscheduler.c @@ -48,8 +48,8 @@ main(void) param->sched_priority = -1; rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, param); - printf("sched_setscheduler(0, SCHED_FIFO, [%d]) = %ld %s (%m)\n", - param->sched_priority, rc, errno2name()); + printf("sched_setscheduler(0, SCHED_FIFO, [%d]) = %s\n", + param->sched_priority, sprintrc(rc)); puts("+++ exited with 0 +++"); return 0; -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 8/9] tests: min_nr and nr arguments in io_getevents should be long
* aio.c (main): change output format for min_nr and nr arguments in io_getevents check to %ld, cast arguments to long. --- tests/aio.c |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/aio.c b/tests/aio.c index 5a023cf..8c5bfa7 100644 --- a/tests/aio.c +++ b/tests/aio.c @@ -166,11 +166,11 @@ main(void) nr); assert(syscall(__NR_io_getevents, *ctx, nr, nr + 1, ev, ts) == (long) nr); - printf("io_getevents(%lu, %u, %u, [" + printf("io_getevents(%lu, %ld, %ld, [" "{data=%#llx, obj=%p, res=%u, res2=0}, " "{data=%#llx, obj=%p, res=%u, res2=0}" "], {0, 123456789}) = %u\n", - *ctx, nr, nr + 1, + *ctx, (long) nr, (long) (nr + 1), (unsigned long long) cb[0].aio_data, &cb[0], sizeof_data0, (unsigned long long) cb[1].aio_data, &cb[1], sizeof_data1, nr); -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel