1 /*
2 * This file is part of time strace test.
3 *
4 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2015-2023 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "tests.h"
12 #include "scno.h"
13
14 #ifdef __NR_time
15
16 # include <errno.h>
17 # include <stdio.h>
18 # include <stdint.h>
19 # include <unistd.h>
20
21 typedef kernel_ulong_t kernel_time_t;
22
23 static kernel_long_t
24 k_time(void *p)
25 {
26 # if defined __x86_64__ && defined __ILP32__
27 register long arg asm("rdi") = (uintptr_t) p;
28 kernel_long_t rc;
29 asm volatile("syscall\n\t"
30 : "=a"(rc)
31 : "0"(__NR_time), "r"(arg)
32 : "memory", "cc", "r11", "cx");
33 if (rc < 0 && rc >= -4095) {
34 errno = -rc;
35 rc = (kernel_long_t) -1LL;
36 }
37 return rc;
38 # else
39 const kernel_ulong_t arg = (uintptr_t) p;
40 const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
41 return syscall(__NR_time, arg, bad, bad, bad, bad, bad);
42 # endif
43 }
44
45 int
46 main(void)
47 {
48 TAIL_ALLOC_OBJECT_CONST_PTR(kernel_time_t, p);
49
50 kernel_ulong_t t = k_time(NULL);
51 if (t == (kernel_ulong_t) -1ULL)
52 perror_msg_and_skip("time");
53 printf("time(NULL) = %llu (", (unsigned long long) t);
54 print_time_t_nsec(t, 0, 0);
55 puts(")");
56
57 t = k_time(p + 1);
58 printf("time(%p) = %s\n", p + 1, sprintrc(t));
59
60 t = k_time(p);
61 printf("time([%lld", (long long) *p);
62 print_time_t_nsec(*p, 0, 1),
63 printf("]) = %llu (", (unsigned long long) t);
64 print_time_t_nsec(t, 0, 0);
65 puts(")");
66
67 puts("+++ exited with 0 +++");
68 return 0;
69 }
70
71 #else
72
73 SKIP_MAIN_UNDEFINED("__NR_time")
74
75 #endif