diff --git a/repos/os/run/timeout.run b/repos/os/run/timeout.run index 9cdde2ee8..38262de20 100644 --- a/repos/os/run/timeout.run +++ b/repos/os/run/timeout.run @@ -3,24 +3,18 @@ # # -# Do not run on QEMU as its time emulation is not precise enough +# Do not high precision time on ARM with kernels other than HW and on QEMU # -if {[get_cmd_switch --autopilot] && [have_include "power_on/qemu"]} { - puts "\nRunning timeout test in autopilot on Qemu is not recommended.\n" - exit 0 -} - +# On ARM, we do not have a component-local hardware time-source. The ARM +# performance counter has no reliable frequency as the ARM idle command +# halts the counter. Thus, we do not do local time interpolation on ARM. +# Except we're on the HW kernel. In this case we can read out the kernel +# time instead. On QEMU, the time emulation is not precise enough. # -# Do not run on ARM with kernels other than HW -# -# The ARM performance counter has no reliable frequency as the ARM idle command -# (often called on idle) halts the counter. Only on the HW kernel we have a syscall -# that enables us to avoid the use of the performance counter by reading the kernel -# time instead. -# -if {[expr [have_spec arm] && ![have_spec hw]]} { - puts "\n Run script is not supported on this platform.\n"; - exit 0 +proc high_precision_time { } { + if {[get_cmd_switch --autopilot] && [have_include "power_on/qemu"]} { return false } + if {[expr [have_spec arm] && ![have_spec hw]]} { return false } + return true } build "core init drivers/platform drivers/timer test/timeout test/cpufreq" @@ -31,7 +25,7 @@ build "core init drivers/platform drivers/timer test/timeout test/cpufreq" create_boot_directory -install_config { +append config { @@ -54,10 +48,13 @@ install_config { + } +install_config $config + build_boot_image "core ld.lib.so init timer test-timeout" # diff --git a/repos/os/src/test/timeout/main.cc b/repos/os/src/test/timeout/main.cc index d9c79be82..d8ad9897e 100644 --- a/repos/os/src/test/timeout/main.cc +++ b/repos/os/src/test/timeout/main.cc @@ -17,18 +17,20 @@ #include #include #include +#include using namespace Genode; struct Test { - Env &env; - unsigned &error_cnt; - Signal_transmitter done; - unsigned id; - Timer::Connection timer_connection { env }; - Timer::Connection timer { env }; + Env &env; + unsigned &error_cnt; + Signal_transmitter done; + unsigned id; + Timer::Connection timer_connection { env }; + Timer::Connection timer { env }; + Attached_rom_dataspace config { env, "config" }; Test(Env &env, unsigned &error_cnt, @@ -525,7 +527,12 @@ struct Fast_polling : Test main_ep(env, STACK_SIZE, "fast_polling_ep"), main_handler(main_ep, *this, &Fast_polling::main) { - Signal_transmitter(main_handler).submit(); + if (config.xml().attribute_value("high_precision_time", true)) { + Signal_transmitter(main_handler).submit(); + } else { + log("... skip test because it requires high precision time"); + Test::done.submit(); + } } };