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