mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-22 15:02:25 +00:00
67fc1ec42b
Ref #2400
106 lines
2.8 KiB
Plaintext
106 lines
2.8 KiB
Plaintext
#
|
|
# Build
|
|
#
|
|
|
|
#
|
|
# Wether the platform allows for timeouts that trigger with a precision < 50 milliseconds
|
|
#
|
|
proc precise_timeouts { } {
|
|
|
|
#
|
|
# On QEMU, NOVA uses the pretty unstable TSC emulation as primary time source.
|
|
#
|
|
if {[have_include "power_on/qemu"] && [have_spec nova]} { return false }
|
|
return true
|
|
}
|
|
|
|
#
|
|
# Wether the platform allows for a timestamp that has a precision < 1 millisecond
|
|
#
|
|
proc precise_time { } {
|
|
|
|
#
|
|
# On QEMU, timing is not stable enough for microseconds precision
|
|
#
|
|
if {[have_include "power_on/qemu"]} { return false }
|
|
|
|
#
|
|
# On ARM, we do not have a component-local time source in hardware. The ARM
|
|
# performance counter has no reliable frequency as the ARM idle command
|
|
# halts the counter. Thus, we do not use local time interpolation on ARM.
|
|
# Except we're on the HW kernel. In this case we can read out the kernel
|
|
# time instead.
|
|
#
|
|
if {[expr [have_spec arm] && ![have_spec hw]]} { return false }
|
|
return true
|
|
}
|
|
|
|
#
|
|
# Wether the platform allows for a 'Timer::Connection::elapsed_ms'
|
|
# implementation that has a precision < 2 ms
|
|
#
|
|
proc precise_ref_time { } {
|
|
|
|
#
|
|
# On platforms that use the PIT timer driver, 'elapsed_ms' is pretty
|
|
# inprecise/unsteady (up to 3 ms deviation) for a reason that is not
|
|
# clearly determined yet. On Fiasco and Fiasco.OC, that use kernel timing,
|
|
# it is the same. So, on these platforms, our locally interpolated time
|
|
# seems to be fine but the reference time is bad.
|
|
#
|
|
if {[have_spec sel4] || [have_spec pistachio] || [have_spec okl4] || [have_spec foc] || [have_spec fiasco]} { return false }
|
|
return true
|
|
}
|
|
|
|
build "core init drivers/platform drivers/timer test/timeout test/cpufreq"
|
|
|
|
#
|
|
# Boot image
|
|
#
|
|
|
|
create_boot_directory
|
|
|
|
append config {
|
|
<config prio_levels="2">
|
|
<parent-provides>
|
|
<service name="ROM"/>
|
|
<service name="IRQ"/>
|
|
<service name="IO_MEM"/>
|
|
<service name="IO_PORT"/>
|
|
<service name="PD"/>
|
|
<service name="RM"/>
|
|
<service name="CPU"/>
|
|
<service name="LOG"/>
|
|
</parent-provides>
|
|
<default-route>
|
|
<any-service><parent/><any-child/></any-service>
|
|
</default-route>
|
|
<default caps="100"/>
|
|
<start name="timer">
|
|
<resource name="RAM" quantum="10M"/>
|
|
<provides><service name="Timer"/></provides>
|
|
</start>
|
|
<start name="test" priority="-1">
|
|
<binary name="test-timeout"/>
|
|
<resource name="RAM" quantum="250M"/>
|
|
<config precise_time="} [precise_time] {"
|
|
precise_ref_time="} [precise_ref_time] {"/>
|
|
precise_timeouts="} [precise_timeouts] {"/>
|
|
</start>
|
|
</config>
|
|
}
|
|
|
|
install_config $config
|
|
|
|
build_boot_image "core ld.lib.so init timer test-timeout"
|
|
|
|
#
|
|
# Execution
|
|
#
|
|
|
|
append qemu_args "-nographic "
|
|
|
|
run_genode_until "child \"test\" exited with exit value.*\n" 900
|
|
grep_output {\[init\] child "test" exited with exit value}
|
|
compare_output_to {[init] child "test" exited with exit value 0}
|