diff options
| -rw-r--r-- | tools/testing/selftests/timers/Makefile | 3 | ||||
| -rw-r--r-- | tools/testing/selftests/timers/set-tai.c | 79 | 
2 files changed, 81 insertions, 1 deletions
| diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile index d73332495c2e..7e2fba7fce1c 100644 --- a/tools/testing/selftests/timers/Makefile +++ b/tools/testing/selftests/timers/Makefile @@ -5,7 +5,7 @@ LDFLAGS += -lrt -lpthread  bins = posix_timers nanosleep inconsistency-check nsleep-lat raw_skew \  	set-timer-lat threadtest mqueue-lat valid-adjtimex \  	alarmtimer-suspend change_skew skew_consistency clocksource-switch \ -	leap-a-day leapcrash +	leap-a-day leapcrash set-tai  all: ${bins} @@ -32,6 +32,7 @@ run_destructive_tests: run_tests  	./clocksource-switch  	./leap-a-day -s -i 10  	./leapcrash +	./set-tai  clean:  	rm -f ${bins} diff --git a/tools/testing/selftests/timers/set-tai.c b/tools/testing/selftests/timers/set-tai.c new file mode 100644 index 000000000000..dc88dbc8831f --- /dev/null +++ b/tools/testing/selftests/timers/set-tai.c @@ -0,0 +1,79 @@ +/* Set tai offset + *              by: John Stultz <john.stultz@linaro.org> + *              (C) Copyright Linaro 2013 + *              Licensed under the GPLv2 + * + *   This program is free software: you can redistribute it and/or modify + *   it under the terms of the GNU General Public License as published by + *   the Free Software Foundation, either version 2 of the License, or + *   (at your option) any later version. + * + *   This program is distributed in the hope that it will be useful, + *   but WITHOUT ANY WARRANTY; without even the implied warranty of + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *   GNU General Public License for more details. + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <sys/time.h> +#include <sys/timex.h> +#include <string.h> +#include <signal.h> +#include <unistd.h> +#ifdef KTEST +#include "../kselftest.h" +#else +static inline int ksft_exit_pass(void) +{ +	exit(0); +} +static inline int ksft_exit_fail(void) +{ +	exit(1); +} +#endif + +int set_tai(int offset) +{ +	struct timex tx; + +	memset(&tx, 0, sizeof(tx)); + +	tx.modes = ADJ_TAI; +	tx.constant = offset; + +	return adjtimex(&tx); +} + +int get_tai(void) +{ +	struct timex tx; + +	memset(&tx, 0, sizeof(tx)); + +	adjtimex(&tx); +	return tx.tai; +} + +int main(int argc, char **argv) +{ +	int i, ret; + +	ret = get_tai(); +	printf("tai offset started at %i\n", ret); + +	printf("Checking tai offsets can be properly set: "); +	for (i = 1; i <= 60; i++) { +		ret = set_tai(i); +		ret = get_tai(); +		if (ret != i) { +			printf("[FAILED] expected: %i got %i\n", i, ret); +			return ksft_exit_fail(); +		} +	} +	printf("[OK]\n"); +	return ksft_exit_pass(); +} | 
