• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) Crackerjack Project., 2007
4  * Porting from Crackerjack to LTP is done by:
5  *	Manas Kumar Nayak <maknayak@in.ibm.com>
6  * Copyright (c) 2013 Cyril Hrubis <chrubis@suse.cz>
7  */
8 
9 #include <time.h>
10 #include <signal.h>
11 #include <sys/syscall.h>
12 #include <stdio.h>
13 #include <errno.h>
14 
15 #include "time64_variants.h"
16 #include "tst_timer.h"
17 
18 static struct time64_variants variants[] = {
19 #if (__NR_timer_gettime != __LTP__NR_INVALID_SYSCALL)
20 	{ .timer_gettime = sys_timer_gettime, .ts_type = TST_KERN_OLD_TIMESPEC, .desc = "syscall with old kernel spec"},
21 #endif
22 
23 #if (__NR_timer_gettime64 != __LTP__NR_INVALID_SYSCALL)
24 	{ .timer_gettime = sys_timer_gettime64, .ts_type = TST_KERN_TIMESPEC, .desc = "syscall time64 with kernel spec"},
25 #endif
26 };
27 
28 static kernel_timer_t timer;
29 
setup(void)30 static void setup(void)
31 {
32 	struct sigevent ev;
33 
34 	tst_res(TINFO, "Testing variant: %s", variants[tst_variant].desc);
35 
36 	ev.sigev_value = (union sigval) 0;
37 	ev.sigev_signo = SIGALRM;
38 	ev.sigev_notify = SIGEV_SIGNAL;
39 
40 	TEST(tst_syscall(__NR_timer_create, CLOCK_REALTIME, &ev, &timer));
41 
42 	if (TST_RET) {
43 		tst_res(TFAIL | TTERRNO, "timer_create() failed");
44 		return;
45 	}
46 }
47 
verify(void)48 static void verify(void)
49 {
50 	struct time64_variants *tv = &variants[tst_variant];
51 	struct tst_its spec = {.type = tv->ts_type, };
52 
53 	TEST(tv->timer_gettime(timer, tst_its_get(&spec)));
54 	if (TST_RET == 0) {
55 		if (tst_its_get_interval_sec(spec) ||
56 		    tst_its_get_interval_nsec(spec) ||
57 		    tst_its_get_value_sec(spec) ||
58 		    tst_its_get_value_nsec(spec))
59 			tst_res(TFAIL, "timespec should have been zeroed");
60 		else
61 			tst_res(TPASS, "timer_gettime() Passed");
62 	} else {
63 		tst_res(TFAIL | TTERRNO, "timer_gettime() Failed");
64 	}
65 
66 	TEST(tv->timer_gettime((kernel_timer_t)-1, tst_its_get(&spec)));
67 	if (TST_RET == -1 && TST_ERR == EINVAL)
68 		tst_res(TPASS, "timer_gettime(-1) Failed: EINVAL");
69 	else
70 		tst_res(TFAIL | TTERRNO, "timer_gettime(-1) = %li", TST_RET);
71 
72 	TEST(tv->timer_gettime(timer, NULL));
73 	if (TST_RET == -1 && TST_ERR == EFAULT)
74 		tst_res(TPASS, "timer_gettime(NULL) Failed: EFAULT");
75 	else
76 		tst_res(TFAIL | TTERRNO, "timer_gettime(-1) = %li", TST_RET);
77 }
78 
79 static struct tst_test test = {
80 	.test_all = verify,
81 	.test_variants = ARRAY_SIZE(variants),
82 	.setup = setup,
83 	.needs_tmpdir = 1,
84 };
85