diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2020-12-13 08:00:00 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2020-12-13 08:00:00 +0000 |
commit | 33c7e6dab70d31147e73cd1bef1509a1a806883f (patch) | |
tree | ffe427cb9e842c429dec6ded3b32970dfceec897 | |
parent | ee98d4b5b2b9e9d159094c5688c3c8e669c7b72e (diff) | |
download | strace-33c7e6dab70d31147e73cd1bef1509a1a806883f.tar.gz |
tests: check decoding of clock_gettime64, clock_settime64, and clock_getres_time64 syscalls
* tests/clock_xettime-common.c: New file.
* tests/clock_xettime64.c: Likewise.
* tests/Makefile.am (EXTRA_DIST): Add clock_xettime-common.c.
* tests/clock_xettime.c: Turn into a wrapper around
clock_xettime-common.c.
* tests/pure_executables.list: Add clock_xettime64.
* tests/.gitignore: Likewise.
* tests/gen_tests.in (clock_xettime64): New entry.
* tests/clock.in (clock_xettime64): Likewise.
* tests/trace_clock.in (clock_xettime64): Likewise.
* tests/trace_personality_regex_32.in (clock_xettime64): Likewise.
* tests/trace_personality_regex_64.in (clock_xettime64): Likewise.
* tests/trace_personality_regex_x32.in (clock_xettime64): Likewise.
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/clock.in | 1 | ||||
-rw-r--r-- | tests/clock_xettime-common.c | 116 | ||||
-rw-r--r-- | tests/clock_xettime.c | 82 | ||||
-rw-r--r-- | tests/clock_xettime64.c | 34 | ||||
-rw-r--r-- | tests/gen_tests.in | 3 | ||||
-rwxr-xr-x | tests/pure_executables.list | 1 | ||||
-rw-r--r-- | tests/trace_clock.in | 3 | ||||
-rwxr-xr-x | tests/trace_personality_regex_32.in | 1 | ||||
-rwxr-xr-x | tests/trace_personality_regex_64.in | 1 | ||||
-rwxr-xr-x | tests/trace_personality_regex_x32.in | 1 |
12 files changed, 184 insertions, 61 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index 5a1ce95bd..1cea04ef6 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -44,6 +44,7 @@ clock_adjtime clock_adjtime64 clock_nanosleep clock_xettime +clock_xettime64 clone-flags clone3 clone3-Xabbrev diff --git a/tests/Makefile.am b/tests/Makefile.am index 072e3a99e..d5bbd02ad 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -517,6 +517,7 @@ EXTRA_DIST = \ caps.awk \ clock.in \ clock_adjtime-common.c \ + clock_xettime-common.c \ count-f.expected \ eventfd.expected \ fadvise.h \ diff --git a/tests/clock.in b/tests/clock.in index ccca08ac9..9929d7a0d 100755 --- a/tests/clock.in +++ b/tests/clock.in @@ -2,3 +2,4 @@ clock_adjtime -a37 clock_adjtime64 -a39 clock_nanosleep clock_xettime -a36 +clock_xettime64 -a39 diff --git a/tests/clock_xettime-common.c b/tests/clock_xettime-common.c new file mode 100644 index 000000000..54eb77775 --- /dev/null +++ b/tests/clock_xettime-common.c @@ -0,0 +1,116 @@ +/* + * This file is part of clock_xettime* strace tests. + * + * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org> + * Copyright (c) 2015-2020 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include <stdio.h> +#include <time.h> +#include <unistd.h> +#include "kernel_timespec.h" + +static const char *errstr; + +static long +k_syscall(const unsigned int scno, const unsigned int id, void *const ts) +{ + static const kernel_ulong_t bad = + (kernel_ulong_t) 0xbadc0dedbadc0dedULL; + static const kernel_ulong_t fill = + (kernel_ulong_t) 0xdefaced00000000ULL; + const kernel_ulong_t arg1 = id | fill; + const kernel_ulong_t arg2 = f8ill_ptr_to_kulong(ts); + const long rc = syscall(scno, arg1, arg2, bad, bad, bad, bad); + errstr = sprintrc(rc); + return rc; +} + +static long +k_getres(const unsigned int id, void *const ts) +{ + return k_syscall(SYSCALL_NR_getres, id, ts); +} + +static long +k_gettime(const unsigned int id, void *const ts) +{ + return k_syscall(SYSCALL_NR_gettime, id, ts); +} + +static long +k_settime(const unsigned int id, void *const ts) +{ + return k_syscall(SYSCALL_NR_settime, id, ts); +} + +int +main(void) +{ + TAIL_ALLOC_OBJECT_CONST_PTR(clock_timespec_t, ts); + void *const efault = (void *) (1 + (char *) ts); + + k_getres(CLOCK_MONOTONIC, NULL); + printf("%s(CLOCK_MONOTONIC, NULL) = %s\n", SYSCALL_NAME_getres, errstr); + + k_getres(CLOCK_REALTIME, efault); + printf("%s(CLOCK_REALTIME, %p) = %s\n", + SYSCALL_NAME_getres, efault, errstr); + + k_gettime(CLOCK_MONOTONIC, NULL); + printf("%s(CLOCK_MONOTONIC, NULL) = %s\n", SYSCALL_NAME_gettime, errstr); + + k_gettime(CLOCK_REALTIME, efault); + printf("%s(CLOCK_REALTIME, %p) = %s\n", + SYSCALL_NAME_gettime, efault, errstr); + + k_settime(CLOCK_MONOTONIC, NULL); + printf("%s(CLOCK_MONOTONIC, NULL) = %s\n", SYSCALL_NAME_settime, errstr); + + k_settime(CLOCK_REALTIME, efault); + printf("%s(CLOCK_REALTIME, %p) = %s\n", + SYSCALL_NAME_settime, efault, errstr); + + if (k_getres(CLOCK_MONOTONIC, ts)) + perror_msg_and_skip("clock_getres CLOCK_MONOTONIC"); + printf("%s(CLOCK_MONOTONIC, {tv_sec=%lld, tv_nsec=%llu}) = 0\n", + SYSCALL_NAME_getres, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec)); + + if (k_gettime(CLOCK_PROCESS_CPUTIME_ID, ts)) + perror_msg_and_skip("clock_gettime CLOCK_PROCESS_CPUTIME_ID"); + printf("%s(CLOCK_PROCESS_CPUTIME_ID, {tv_sec=%lld, tv_nsec=%llu})" + " = 0\n", + SYSCALL_NAME_gettime, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec)); + + ts->tv_sec = 0xdeface1; + ts->tv_nsec = 0xdeface2; + k_settime(CLOCK_THREAD_CPUTIME_ID, ts); + printf("%s(CLOCK_THREAD_CPUTIME_ID, {tv_sec=%lld, tv_nsec=%llu})" + " = %s\n", + SYSCALL_NAME_settime, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), errstr); + + ts->tv_sec = 0xdeadbeefU; + ts->tv_nsec = 0xfacefeedU; + k_settime(CLOCK_THREAD_CPUTIME_ID, ts); + printf("%s(CLOCK_THREAD_CPUTIME_ID, {tv_sec=%lld, tv_nsec=%llu})" + " = %s\n", + SYSCALL_NAME_settime, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), errstr); + + ts->tv_sec = (typeof(ts->tv_sec)) 0xcafef00ddeadbeefLL; + ts->tv_nsec = (typeof(ts->tv_nsec)) 0xbadc0dedfacefeedLL; + k_settime(CLOCK_THREAD_CPUTIME_ID, ts); + printf("%s(CLOCK_THREAD_CPUTIME_ID, {tv_sec=%lld, tv_nsec=%llu})" + " = %s\n", + SYSCALL_NAME_settime, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), errstr); + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/clock_xettime.c b/tests/clock_xettime.c index 345c3a42e..38c0ced6f 100644 --- a/tests/clock_xettime.c +++ b/tests/clock_xettime.c @@ -1,77 +1,41 @@ /* - * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org> - * Copyright (c) 2015-2019 The strace developers. + * Check decoding of clock_gettime, clock_settime, and + * clock_getres syscalls. + * + * Copyright (c) 2020 The strace developers. * All rights reserved. * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "tests.h" -#include <stdio.h> -#include <stdint.h> -#include <time.h> -#include <unistd.h> #include "scno.h" -#if defined __NR_clock_getres \ - && defined __NR_clock_gettime \ - && defined __NR_clock_settime - -int -main(void) -{ - struct { - struct timespec ts; - uint32_t pad[2]; - } t = { - .pad = { 0xdeadbeef, 0xbadc0ded } - }; - long rc; - - if (syscall(__NR_clock_getres, CLOCK_REALTIME, &t.ts)) - perror_msg_and_skip("clock_getres CLOCK_REALTIME"); - printf("clock_getres(CLOCK_REALTIME, {tv_sec=%lld, tv_nsec=%llu})" - " = 0\n", - (long long) t.ts.tv_sec, - zero_extend_signed_to_ull(t.ts.tv_nsec)); - - if (syscall(__NR_clock_gettime, CLOCK_PROCESS_CPUTIME_ID, &t.ts)) - perror_msg_and_skip("clock_gettime CLOCK_PROCESS_CPUTIME_ID"); - printf("clock_gettime(CLOCK_PROCESS_CPUTIME_ID" - ", {tv_sec=%lld, tv_nsec=%llu}) = 0\n", - (long long) t.ts.tv_sec, - zero_extend_signed_to_ull(t.ts.tv_nsec)); +#if defined __NR_clock_gettime \ + && defined __NR_clock_settime \ + && defined __NR_clock_getres - t.ts.tv_sec = 0xdeface1; - t.ts.tv_nsec = 0xdeface2; - rc = syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts); - printf("clock_settime(CLOCK_THREAD_CPUTIME_ID" - ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", - (long long) t.ts.tv_sec, - zero_extend_signed_to_ull(t.ts.tv_nsec), sprintrc(rc)); +# define SYSCALL_NR_gettime __NR_clock_gettime +# define SYSCALL_NR_settime __NR_clock_settime +# define SYSCALL_NR_getres __NR_clock_getres - t.ts.tv_sec = 0xdeadbeefU; - t.ts.tv_nsec = 0xfacefeedU; - rc = syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts); - printf("clock_settime(CLOCK_THREAD_CPUTIME_ID" - ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", - (long long) t.ts.tv_sec, - zero_extend_signed_to_ull(t.ts.tv_nsec), sprintrc(rc)); +# define SYSCALL_NAME_gettime "clock_gettime" +# define SYSCALL_NAME_settime "clock_settime" +# define SYSCALL_NAME_getres "clock_getres" - t.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL; - t.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL; - rc = syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts); - printf("clock_settime(CLOCK_THREAD_CPUTIME_ID" - ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", - (long long) t.ts.tv_sec, - zero_extend_signed_to_ull(t.ts.tv_nsec), sprintrc(rc)); +# if defined __NR_clock_gettime64 \ + || defined __NR_clock_settime64 \ + || defined __NR_clock_getres_time64 +# include "arch_defs.h" +# define clock_timespec_t kernel_timespec32_t +# else +# define clock_timespec_t kernel_timespec64_t +# endif - puts("+++ exited with 0 +++"); - return 0; -} +# include "clock_xettime-common.c" #else -SKIP_MAIN_UNDEFINED("__NR_clock_getres && __NR_clock_gettime && __NR_clock_settime") +SKIP_MAIN_UNDEFINED("__NR_clock_gettime && __NR_clock_settime && __NR_clock_getres") #endif diff --git a/tests/clock_xettime64.c b/tests/clock_xettime64.c new file mode 100644 index 000000000..e87cd5146 --- /dev/null +++ b/tests/clock_xettime64.c @@ -0,0 +1,34 @@ +/* + * Check decoding of clock_gettime64, clock_settime64, and + * clock_getres_time64 syscalls. + * + * Copyright (c) 2020 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "tests.h" +#include "scno.h" + +#if defined __NR_clock_gettime64 \ + && defined __NR_clock_settime64 \ + && defined __NR_clock_getres_time64 + +# define SYSCALL_NR_gettime __NR_clock_gettime64 +# define SYSCALL_NR_settime __NR_clock_settime64 +# define SYSCALL_NR_getres __NR_clock_getres_time64 + +# define SYSCALL_NAME_gettime "clock_gettime64" +# define SYSCALL_NAME_settime "clock_settime64" +# define SYSCALL_NAME_getres "clock_getres_time64" + +# define clock_timespec_t kernel_timespec64_t + +# include "clock_xettime-common.c" + +#else + +SKIP_MAIN_UNDEFINED("__NR_clock_gettime64 && __NR_clock_settime64 && __NR_clock_getres_time64") + +#endif diff --git a/tests/gen_tests.in b/tests/gen_tests.in index 36b81693e..d88a84576 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -31,7 +31,8 @@ clock test_trace_expr 'times|fcntl.*' -e/clock clock_adjtime -a37 clock_adjtime64 -a39 clock_nanosleep -e trace=clock_nanosleep,clock_gettime -clock_xettime -a36 -e trace=clock_getres,clock_gettime,clock_settime +clock_xettime -a36 -e trace=clock_gettime,clock_settime,clock_getres +clock_xettime64 -a39 -e trace=clock_gettime64,clock_settime64,clock_getres_time64 clone3 -a16 clone3-Xabbrev -a16 -Xabbrev -e trace=clone3 clone3-Xraw -a16 -Xraw -e trace=clone3 diff --git a/tests/pure_executables.list b/tests/pure_executables.list index c82cae651..29c7f79a9 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -28,6 +28,7 @@ clock_adjtime clock_adjtime64 clock_nanosleep clock_xettime +clock_xettime64 clone-flags clone3 clone3-Xabbrev diff --git a/tests/trace_clock.in b/tests/trace_clock.in index 55453bef0..b17fa8d89 100644 --- a/tests/trace_clock.in +++ b/tests/trace_clock.in @@ -1,6 +1,7 @@ adjtimex -a13 clock_adjtime -a37 clock_adjtime64 -a39 -clock_xettime -a21 +clock_xettime -a36 +clock_xettime64 -a39 xettimeofday -a20 time -a9 diff --git a/tests/trace_personality_regex_32.in b/tests/trace_personality_regex_32.in index ccca08ac9..9929d7a0d 100755 --- a/tests/trace_personality_regex_32.in +++ b/tests/trace_personality_regex_32.in @@ -2,3 +2,4 @@ clock_adjtime -a37 clock_adjtime64 -a39 clock_nanosleep clock_xettime -a36 +clock_xettime64 -a39 diff --git a/tests/trace_personality_regex_64.in b/tests/trace_personality_regex_64.in index ccca08ac9..9929d7a0d 100755 --- a/tests/trace_personality_regex_64.in +++ b/tests/trace_personality_regex_64.in @@ -2,3 +2,4 @@ clock_adjtime -a37 clock_adjtime64 -a39 clock_nanosleep clock_xettime -a36 +clock_xettime64 -a39 diff --git a/tests/trace_personality_regex_x32.in b/tests/trace_personality_regex_x32.in index ccca08ac9..9929d7a0d 100755 --- a/tests/trace_personality_regex_x32.in +++ b/tests/trace_personality_regex_x32.in @@ -2,3 +2,4 @@ clock_adjtime -a37 clock_adjtime64 -a39 clock_nanosleep clock_xettime -a36 +clock_xettime64 -a39 |