# # \brief rudimentary x86 virtual-machine monitor interface test # \author Alexander Boettcher # \date 2018-08-26 # assert_spec x86 if { [get_cmd_switch --autopilot] } { # nightly x86 32bit test machine has no vmx support if {[have_spec x86_32] && ![have_include "power_on/qemu"]} { puts "\n Run script is not supported on this platform. \n"; exit 0 } if {[have_include "power_on/qemu"] && [have_spec sel4]} { puts "\n Run script is not supported on this platform. \n"; exit 0 } if {[have_spec nova] || [have_spec foc] || [have_spec sel4]} { } else { puts "\n Run script is not supported on this platform. \n"; exit 0 } } # ia32_tsc_aux with rdtscp set test_rdtscp [have_spec nova] build { core init timer lib/ld test/vmm_x86 } create_boot_directory install_config { } # # Generate artificial platform info to allow for executing the scenario on # base-linux # if {[have_spec linux]} { set fd [open [run_dir]/genode/platform_info w] puts $fd { } close $fd } build_boot_image [build_artifacts] append qemu_args " -cpu phenom -smp 2" append qemu_args " -nographic " #run_genode_until {.*vcpu 1 : 7\. vm exit -.*\n} 20 #run_genode_until forever run_genode_until "vmm test finished" 25 set output_saved $output grep_output {^\[init -> vmm\] vcpu 0 :.*} set output_0 $output unify_output {\[init -> vmm\] vcpu 0 : [0-9]+} "vcpu 0 : XX" # transform INTEL HLT to AMD HLT number unify_output "vcpu 0 : XX. vm exit - reason 0xc" "vcpu 0 : XX. vm exit - reason 0x78" # AMD with NPT unify_output "vcpu 0 : XX. vm exit - reason 0xfc handled by 'ep'" "" # AMD w/o NPT unify_output "vcpu 0 : XX. vm exit - reason 0x4e handled by 'ep'" "" # Intel with EPT unify_output "vcpu 0 : XX. vm exit - reason 0x30 handled by 'ep'" "" unify_output "vcpu 0 : XX. vm exit - guest fault address: 0xfffffff0" "" unify_output "vcpu 0 : XX. vm exit - resume vcpu" "" # remove rdtscp output from unified output, some kernel don't support tsc_aux unify_output {vcpu 0 : XX. vm exit - rdtscp.* host=0x[0-9]} "" trim_lines set output_0 $output set output $output_saved grep_output {^\[init -> vmm\] vcpu 1 :.*} unify_output {\[init -> vmm\] vcpu 1 : [0-9]+} "vcpu 1 : XX" # transform INTEL HLT to AMD HLT number unify_output "vcpu 1 : XX. vm exit - reason 0xc" "vcpu 1 : XX. vm exit - reason 0x78" # AMD with NPT unify_output "vcpu 1 : XX. vm exit - reason 0xfc handled by 'ep'" "" # AMD w/o NPT unify_output "vcpu 1 : XX. vm exit - reason 0x4e handled by 'ep'" "" # Intel with EPT unify_output "vcpu 1 : XX. vm exit - reason 0x30 handled by 'ep'" "" unify_output "vcpu 1 : XX. vm exit - guest fault address: 0xfffffff0" "" unify_output "vcpu 1 : XX. vm exit - resume vcpu" "" # remove rdtscp output from unified output, some kernel don't support tsc_aux unify_output {vcpu 1 : XX. vm exit - rdtscp.* host=0x[0-9]} "" trim_lines set output_1 $output set output $output_saved grep_output {^\[init -> vmm\] vcpu 2 :.*} unify_output {\[init -> vmm\] vcpu 2 : [0-9]+} "vcpu 2 : XX" # transform INTEL HLT to AMD HLT number unify_output "vcpu 2 : XX. vm exit - reason 0xc" "vcpu 2 : XX. vm exit - reason 0x78" # AMD with NPT unify_output "vcpu 2 : XX. vm exit - reason 0xfc handled by 'second ep'" "" # AMD w/o NPT unify_output "vcpu 2 : XX. vm exit - reason 0x4e handled by 'second ep'" "" # Intel with EPT unify_output "vcpu 2 : XX. vm exit - reason 0x30 handled by 'second ep'" "" unify_output "vcpu 2 : XX. vm exit - guest fault address: 0xfffffff0" "" unify_output "vcpu 2 : XX. vm exit - resume vcpu" "" # remove rdtscp output from unified output, some kernel don't support tsc_aux unify_output {vcpu 2 : XX. vm exit - rdtscp.* host=0x[0-9]} "" trim_lines set output_2 $output set output $output_saved grep_output {^\[init -> vmm\] vcpu 3 :.*} unify_output {\[init -> vmm\] vcpu 3 : [0-9]+} "vcpu 3 : XX" # transform INTEL HLT to AMD HLT number unify_output "vcpu 3 : XX. vm exit - reason 0xc" "vcpu 3 : XX. vm exit - reason 0x78" # AMD with NPT unify_output "vcpu 3 : XX. vm exit - reason 0xfc handled by 'second ep'" "" # AMD w/o NPT unify_output "vcpu 3 : XX. vm exit - reason 0x4e handled by 'second ep'" "" # Intel with EPT unify_output "vcpu 3 : XX. vm exit - reason 0x30 handled by 'second ep'" "" unify_output "vcpu 3 : XX. vm exit - guest fault address: 0xfffffff0" "" unify_output "vcpu 3 : XX. vm exit - resume vcpu" "" # remove rdtscp output from unified output, some kernel don't support tsc_aux unify_output {vcpu 3 : XX. vm exit - rdtscp.* host=0x[0-9]} "" trim_lines set output_3 $output if {$test_rdtscp} { set output $output_saved grep_output {^\[init -> vmm\] vcpu [0-9]+ :.*rdtscp cx.*} unify_output {\[init -> vmm\] vcpu 0 : [0-9]+} "vcpu 0 : XX" unify_output {\[init -> vmm\] vcpu 1 : [0-9]+} "vcpu 1 : XX" unify_output {\[init -> vmm\] vcpu 2 : [0-9]+} "vcpu 2 : XX" unify_output {\[init -> vmm\] vcpu 3 : [0-9]+} "vcpu 3 : XX" set output [lsort -stride 11 -index 1 $output] unify_output "vcpu" "\nvcpu" set output_rdtscp $output } puts "\ncomparing output ..." if {$test_rdtscp} { puts $output_rdtscp puts "" set output $output_rdtscp compare_output_to { vcpu 0 : XX. vm exit - rdtscp cx guest=0xaffe0000 host=0x0 vcpu 1 : XX. vm exit - rdtscp cx guest=0xaffe0001 host=0x0 vcpu 2 : XX. vm exit - rdtscp cx guest=0xaffe0002 host=0x1 vcpu 3 : XX. vm exit - rdtscp cx guest=0xaffe0003 host=0x1 } } puts $output_0 set output $output_0 compare_output_to { [init -> vmm] vcpu 0 : created vcpu 0 : XX. vm exit - reason 0xfe handled by 'ep' vcpu 0 : XX. vm exit - reason 0x78 handled by 'ep' vcpu 0 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff81 } puts $output_1 set output $output_1 compare_output_to { [init -> vmm] vcpu 1 : created vcpu 1 : XX. vm exit - reason 0xfe handled by 'ep' vcpu 1 : XX. vm exit - reason 0x78 handled by 'ep' vcpu 1 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff81 vcpu 1 : XX. vm exit - reason 0xff handled by 'ep' vcpu 1 : XX. vm exit - due to pause() request - ip=0xff81 vcpu 1 : XX. vm exit - reason 0x78 handled by 'ep' vcpu 1 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff81 vcpu 1 : XX. vm exit - reason 0xff handled by 'ep' vcpu 1 : XX. vm exit - due to pause() request - ip=0xff81 vcpu 1 : XX. vm exit - reason 0xff handled by 'ep' vcpu 1 : XX. vm exit - due to pause() request - ip=0xff83 vcpu 1 : XX. vm exit - reason 0x78 handled by 'ep' vcpu 1 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff85 vcpu 1 : XX. vm exit - reason 0xff handled by 'ep' vcpu 1 : XX. vm exit - due to pause() request - ip=0xff85 } puts $output_2 set output $output_2 compare_output_to { [init -> vmm] vcpu 2 : created vcpu 2 : XX. vm exit - reason 0xfe handled by 'second ep' vcpu 2 : XX. vm exit - reason 0x78 handled by 'second ep' vcpu 2 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff81 vcpu 2 : XX. vm exit - reason 0xff handled by 'second ep' vcpu 2 : XX. vm exit - due to pause() request - ip=0xff81 vcpu 2 : XX. vm exit - reason 0x78 handled by 'second ep' vcpu 2 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff81 vcpu 2 : XX. vm exit - reason 0xff handled by 'second ep' vcpu 2 : XX. vm exit - due to pause() request - ip=0xff81 vcpu 2 : XX. vm exit - reason 0x78 handled by 'second ep' vcpu 2 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff82 vcpu 2 : XX. vm exit - reason 0xff handled by 'second ep' vcpu 2 : XX. vm exit - due to pause() request - ip=0xff82 } puts $output_3 set output $output_3 compare_output_to { [init -> vmm] vcpu 3 : created vcpu 3 : XX. vm exit - reason 0xfe handled by 'second ep' vcpu 3 : XX. vm exit - reason 0x78 handled by 'second ep' vcpu 3 : XX. vm exit - halting vCPU - guest called HLT - ip=0xff81 } set output $output_saved grep_output {(Error)} compare_output_to {}