diff --git a/base-nova/run/env b/base-nova/run/env index 1a55be8c86..31fe477cf3 100644 --- a/base-nova/run/env +++ b/base-nova/run/env @@ -119,42 +119,9 @@ proc build_boot_image {binaries} { proc run_genode_until {{wait_for_re forever} {timeout_value 0}} { - # run qemu if no AMT information are found - if {![info exists ::env(AMT_TEST_MACHINE_IP)] || - ![info exists ::env(AMT_TEST_MACHINE_PWD)] } { + if {[is_amt_available]} { + spawn_amt $wait_for_re $timeout_value; + } else { spawn_qemu $wait_for_re $timeout_value; - return } - - # - # amttool expects in the environment variable AMT_PASSWORD the password - # - set ::env(AMT_PASSWORD) $::env(AMT_TEST_MACHINE_PWD) - - # - # reset the box - # - spawn amttool $::env(AMT_TEST_MACHINE_IP) reset - set timeout 10 - expect { - "host" { send "y\r" } - eof { puts stderr "Error: amttool died unexpectedly"; exit -4 } - timeout { puts stderr "Error: amttool timed out"; exit -5 } - } - sleep 5 - - # - # grab output - # - set amtterm "amtterm -u admin -p $::env(AMT_TEST_MACHINE_PWD) -v $::env(AMT_TEST_MACHINE_IP)" - set timeout [expr $timeout_value + 30] - set pid [eval "spawn $amtterm"] - if {$wait_for_re == "forever"} { interact $pid } - expect { - -re $wait_for_re { } - eof { puts stderr "Error: amtterm died unexpectedly"; exit -3 } - timeout { puts stderr "Error: Test execution timed out"; exit -2 } - } - global output - set output $expect_out(buffer) } diff --git a/tool/run b/tool/run index ac29ca73f0..e863ce1f37 100755 --- a/tool/run +++ b/tool/run @@ -471,6 +471,98 @@ proc spawn_qemu { wait_for_re timeout_value } { } +## +# Check whether AMT support is available +# +proc is_amt_available { } { + if {![have_spec x86]} { return false } + + if {[info exists ::env(AMT_TEST_MACHINE_IP)] && + [info exists ::env(AMT_TEST_MACHINE_PWD)] && + [have_installed amtterm] && + [have_installed amttool]} { + return true; + } + puts "No support for Intel's AMT detected." + return false; +} + + +## +# Execute scenario using Intel's AMT +# +proc spawn_amt { wait_for_re timeout_value } { + if {![is_amt_available]} { + return } + + # + # amttool expects in the environment variable AMT_PASSWORD the password + # + set ::env(AMT_PASSWORD) $::env(AMT_TEST_MACHINE_PWD) + + # + # reset the box + # + set timeout 10 + set exit_result 1 + + while { $exit_result != 0 } { + set time_start [ clock seconds ] + spawn amttool $::env(AMT_TEST_MACHINE_IP) reset + expect { + "host" { send "y\r"; } + eof { puts "Error: amttool died unexpectedly"; exit -4 } + timeout { puts "Error: amttool timed out"; exit -5 } + } + catch wait result + set time_end [ clock seconds ] + if {[expr $time_end - $time_start] <= 1} { + incr timeout -1 + } else { + incr timeout [expr -1 * ($time_end - $time_start)] + } + if {$timeout < 0} { + set timeout 0 + } + set exit_result [lindex $result 3] + } + sleep 5 + + # + # grab output + # + set amtterm "amtterm -u admin -p $::env(AMT_TEST_MACHINE_PWD) -v $::env(AMT_TEST_MACHINE_IP)" + if {$wait_for_re == "forever"} { + set timeout -1 + } else { + set timeout [expr $timeout_value + 30] + } + set exit_result 1 + + while { $exit_result != 0 } { + set time_start [ clock seconds ] + set pid [eval "spawn $amtterm"] + expect { + -re $wait_for_re { break } + eof { continue } + timeout { puts "Error: Test execution timed out"; exit -2 } + } + catch wait result + set time_end [ clock seconds ] + if {[expr $time_end - $time_start] <= 1} { + incr timeout -1 + } else { + incr timeout [expr -1 * ($time_end - $time_start)] + } + if {$timeout < 0} { + set timeout 0 + } + set exit_result [lindex $result 3] + } + global output + set output $expect_out(buffer) +} + ## # Determine terminal program #