diff --git a/repos/os/run/timer_accuracy.run b/repos/os/run/timer_accuracy.run new file mode 100644 index 0000000000..bec295d8ce --- /dev/null +++ b/repos/os/run/timer_accuracy.run @@ -0,0 +1,69 @@ +# build program images +build { core init drivers/timer test/timer_accuracy } + +# create directory where boot files are written to +create_boot_directory + +# define XML configuration for init +install_config { + + + + + + + + + + + + + + + + + + + + + + + +} +# build boot files from source binaries +build_boot_image { core ld.lib.so init timer test-timer_accuracy } + +# configure Qemu +append qemu_args " -m 64 -nographic" + +set err_cnt 0 +set test_timeout 20 +set rounds 9 + +# wait for initial tic +run_genode_until {\[init -> test-timer_accuracy\].*\n} $test_timeout +set serial_id [output_spawn_id] + +# measure the delays between the following tics +for {set i 1} {$i <= $rounds} {incr i} { + set start_time($i) [clock milliseconds] + run_genode_until {\[init -> test-timer_accuracy\].*\n} $test_timeout $serial_id + set end_time($i) [clock milliseconds] +} +# print results and count errors +foreach i [lsort [array names start_time]] { + set class "Good:" + set test_result [expr $end_time($i) - $start_time($i)] + set host_result [expr $i * 1000] + set result_diff [expr abs($test_result - $host_result)] + if {[expr $result_diff > 500]} { + set class "Bad: " + set err_cnt [expr $err_cnt + 1] + } + puts "$class round $i, host measured $host_result ms, test measured $test_result ms" +} +# check the error count +if {[expr $err_cnt > 0]} { + puts "Test failed because of $err_cnt errors" + exit -1 +} diff --git a/repos/os/src/test/timer_accuracy/main.cc b/repos/os/src/test/timer_accuracy/main.cc index 700621f128..b4bf177900 100644 --- a/repos/os/src/test/timer_accuracy/main.cc +++ b/repos/os/src/test/timer_accuracy/main.cc @@ -1,11 +1,12 @@ /* - * \brief Timer accuracy test for Linux + * \brief Timer accuracy test * \author Norman Feske + * \author Martin Stein * \date 2010-03-09 */ /* - * Copyright (C) 2010-2013 Genode Labs GmbH + * Copyright (C) 2010-2017 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. @@ -13,45 +14,30 @@ /* Genode includes */ #include -#include - -/* Linux includes */ -#include -#include - -inline int lx_gettimeofday(struct timeval *tv, struct timeval *tz) -{ - return lx_syscall(SYS_gettimeofday, tv, tz); -} - +#include using namespace Genode; -int main(int, char **) + +struct Main { - printf("--- timer accuracy test ---\n"); + Timer::Connection timer; + Signal_handler
timer_handler; + unsigned duration_us { 0 }; - static Timer::Connection timer; - - static struct timeval old_tv; - static struct timeval new_tv; - - enum { ROUNDS = 10 }; - - for (unsigned i = 0; i < ROUNDS; ++i) { - printf("Round [%d/%d] - calling msleep for 5 seconds...\n", i + 1, ROUNDS); - - lx_gettimeofday(&old_tv, 0); - - timer.msleep(5*1000); - - lx_gettimeofday(&new_tv, 0); - - printf("old: %ld seconds %ld microseconds\n", old_tv.tv_sec, old_tv.tv_usec); - printf("new: %ld seconds %ld microseconds\n", new_tv.tv_sec, new_tv.tv_usec); - printf("diff is about %ld seconds\n", new_tv.tv_sec - old_tv.tv_sec); + void handle_timer() + { + duration_us += 1000 * 1000; + timer.trigger_once(duration_us); + log(""); } - printf("--- finished timer accuracy test ---\n"); - return 0; -} + Main(Env &env) : timer(env), timer_handler(env.ep(), *this, &Main::handle_timer) + { + timer.sigh(timer_handler); + handle_timer(); + } +}; + + +void Component::construct(Env &env) { static Main main(env); } diff --git a/repos/os/src/test/timer_accuracy/target.mk b/repos/os/src/test/timer_accuracy/target.mk index 432ef55bec..bef37b4e1b 100644 --- a/repos/os/src/test/timer_accuracy/target.mk +++ b/repos/os/src/test/timer_accuracy/target.mk @@ -1,4 +1,3 @@ TARGET = test-timer_accuracy -REQUIRES = linux SRC_CC = main.cc -LIBS = base syscall-linux +LIBS = base