summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2020-12-13 08:00:00 +0000
committerDmitry V. Levin <ldv@altlinux.org>2020-12-13 08:00:00 +0000
commit33c7e6dab70d31147e73cd1bef1509a1a806883f (patch)
treeffe427cb9e842c429dec6ded3b32970dfceec897
parentee98d4b5b2b9e9d159094c5688c3c8e669c7b72e (diff)
downloadstrace-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/.gitignore1
-rw-r--r--tests/Makefile.am1
-rwxr-xr-xtests/clock.in1
-rw-r--r--tests/clock_xettime-common.c116
-rw-r--r--tests/clock_xettime.c82
-rw-r--r--tests/clock_xettime64.c34
-rw-r--r--tests/gen_tests.in3
-rwxr-xr-xtests/pure_executables.list1
-rw-r--r--tests/trace_clock.in3
-rwxr-xr-xtests/trace_personality_regex_32.in1
-rwxr-xr-xtests/trace_personality_regex_64.in1
-rwxr-xr-xtests/trace_personality_regex_x32.in1
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