run: support multiple VMs in vbox* run scripts

Issue #2143
This commit is contained in:
Alexander Boettcher 2016-10-19 14:52:59 +02:00 committed by Christian Helmuth
parent 844174918b
commit 878abc7edb
8 changed files with 203 additions and 80 deletions

View File

@ -16,4 +16,7 @@ set use_overlay_from_disk 1
set use_usb 1
set use_ps2 [have_spec ps2]
set use_vms 1
set use_cpu_load 0
source ${genode_dir}/repos/ports/run/vbox_win.inc

View File

@ -18,4 +18,7 @@ set use_overlay_from_disk 1
set use_usb 1
set use_ps2 [have_spec ps2]
set use_vms 1
set use_cpu_load 0
source ${genode_dir}/repos/ports/run/vbox_win.inc

View File

@ -17,4 +17,7 @@ set use_overlay_from_disk 0
set use_usb 1
set use_ps2 [have_spec ps2]
set use_vms 1
set use_cpu_load 0
source ${genode_dir}/repos/ports/run/vbox_win.inc

View File

@ -83,6 +83,9 @@ set use_rumpfs 1
set use_usb 0
set use_ps2 [have_spec ps2]
set use_vms 1
set use_cpu_load 0
#
# Create .bat file to be executed by Win VM
#

View File

@ -19,4 +19,7 @@ set use_overlay_from_disk 1
set use_usb 1
set use_ps2 [have_spec ps2]
set use_vms 1
set use_cpu_load 0
source ${genode_dir}/repos/ports/run/vbox_win.inc

View File

@ -18,4 +18,7 @@ set use_overlay_from_disk 1
set use_usb 1
set use_ps2 [have_spec ps2]
set use_vms 1
set use_cpu_load 0
source ${genode_dir}/repos/ports/run/vbox_win.inc

View File

@ -9,6 +9,11 @@ if {[have_include "power_on/qemu"]} {
exit 0
}
if {[expr !$use_rumpfs && $use_vms > 1] } {
puts "\nConfiguration bug - have only one raw block partition.\n"
exit 1
}
set vdi_image "${flavor}.vdi"
set raw_image "${flavor}.vmdk"
set vbox_file "vm_${flavor}.vbox"
@ -98,11 +103,21 @@ append config_of_app {
<provides> <service name="Report"/> <service name="ROM"/> </provides>
<config>
<policy label="vbox_pointer -> hover" report="nitpicker -> hover"/>
<policy label="vbox_pointer -> xray" report="nitpicker -> xray"/>
<policy label="vbox_pointer -> shape" report="vbox -> shape"/>
<policy label="vbox_pointer -> xray" report="nitpicker -> xray"/>}
for { set i 1} { $i <= $use_vms } { incr i} {
append config_of_app "
<policy label=\"vbox_pointer -> shape$i\" report=\"vbox$i -> shape\"/>"
}
append config_of_app {
<policy label="usb_report_filter -> devices" report="usb_drv -> devices"/>
<policy label="usb_report_filter -> usb_drv_config" report="usb_drv -> config"/>
<policy label="vbox -> usb_devices" report="usb_report_filter -> usb_devices"/>
<policy label="vbox1 -> usb_devices" report="usb_report_filter -> usb_devices"/>}
append_if [expr $use_cpu_load] config_of_app {
<policy label="cpu_load_display -> trace_subjects"
report="trace_subject_reporter -> trace_subjects"/>}
append config_of_app {
</config>
</start>
@ -118,127 +133,170 @@ append config_of_app {
<config>
<report focus="yes" hover="yes" xray="yes" />
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="vbox" layer="2" content="client" focus="click" hover="always" />
<domain name="" layer="2" content="client" focus="click" hover="always" />
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="cpu_load" layer="2" content="client" label="no" />
<domain name="" layer="3" content="client" focus="click" hover="always" />
<policy label="vbox_pointer" domain="pointer"/>
<policy label="nit_fb" domain="vbox"/>
<policy label="vbox_pointer" domain="pointer"/>
<policy label="cpu_load_display" domain="cpu_load"/>
<default-policy domain=""/>
</config>
</start>
<start name="vbox_pointer" priority="-1">
<resource name="RAM" quantum="1200K"/>
<config>
<policy label="nit_fb" rom="shape"/>
<config>}
for { set i 1} { $i <= $use_vms } { incr i} {
append config_of_app "
<policy label=\"nit_fb$i\" rom=\"shape$i\"/>"
}
append config_of_app {
</config>
<route>
<service name="Nitpicker"> <child name="nitpicker"/> </service>
<service name="ROM"> <child name="report_rom"/> </service>
<any-service> <parent/> <any-child/> </any-service>
</route>
</start>
</start>}
<start name="nit_fb" priority="-1">
for { set i 1} { $i <= $use_vms } { incr i} {
append config_of_app "
<start name=\"nit_fb${i}\" priority=\"-1\">"
append config_of_app {
<binary name="nit_fb"/>
<resource name="RAM" quantum="8M" />
<configfile name="nit_fb.config"/>
<provides>
<service name="Framebuffer" />
<service name="Input" />
</provides>
<route>
<service name="ROM" label="nit_fb.config"> <child name="nit_fb-config"/> </service>
</provides>}
append config_of_app "
<configfile name=\"nit_fb${i}.config\"/>"
append config_of_app {
<route>}
append config_of_app "
<service name=\"ROM\" label=\"nit_fb${i}.config\"> <child name=\"nit_fb-config\"/> </service>"
append config_of_app {
<service name="LOG"> <parent/> </service>
<service name="Nitpicker"> <child name="nitpicker"/> </service>
</route>
</start>
</start>}
}
append config_of_app {
<start name="nit_fb-config" priority="-1">
<binary name="dynamic_rom"/>
<resource name="RAM" quantum="1M"/>
<provides> <service name="ROM"/> </provides>
<config>
<rom name="nit_fb.config">
<inline description="standard">
<config/>
</inline>
<sleep milliseconds="60000" />}
<config>}
append_if [expr !$use_rumpfs] config_of_app {
for { set i 1} { $i <= $use_vms } { incr i} {
append config_of_app "
<rom name=\"nit_fb${i}.config\">"
append config_of_app {
<inline description="standard">}
if { $use_vms > 1 } {
append config_of_app "
<config xpos=\"[expr ${i} * 50]\" ypos=\"[expr (${i} - 1) * 5 + 2]\" width=\"1024\" height=\"768\"/>"
} else {
append config_of_app {
<config/>}
}
append config_of_app {
</inline>
<sleep milliseconds="50000" />}
append_if [expr !$use_rumpfs] config_of_app {
<inline description="shutdown">
<config width="0" height="0"/>
</inline>
<sleep milliseconds="600000" />}
<sleep milliseconds="500000" />}
append config_of_app {
</rom>}
}
append config_of_app {
</rom>
</config>
<route>
<service name="RM"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="RM"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="Timer"> <child name="timer"/> </service>
</route>
</start>
</start>}
<start name="vbox" priority="-2">}
append_if [expr $use_vbox4] config_of_app {
for { set i 1} { $i <= $use_vms } { incr i} {
append config_of_app "
<start name=\"vbox${i}\" priority=\"-2\">"
append_if [expr $use_vbox4] config_of_app {
<binary name="virtualbox" />}
append_if [expr $use_vbox5] config_of_app {
append_if [expr $use_vbox5] config_of_app {
<binary name="virtualbox5" />}
append config_of_app {
append config_of_app {
<resource name="RAM" quantum="1280M"/>}
append config_of_app "
<config ld_verbose=\"yes\" vbox_file=\"${vbox_file}\" vm_name=\"${flavor}\" xhci=\"yes\">"
append config_of_app {
if { $use_vms eq 1 } {
append config_of_app "
<config ld_verbose=\"yes\" vbox_file=\"${vbox_file}\" vm_name=\"${flavor}\" xhci=\"yes\">"
} else {
append config_of_app "
<affinity xpos=\"[expr $i]\" width=\"2\" />
<config ld_verbose=\"yes\" vbox_file=\"${vbox_file}\" vm_name=\"${flavor}\" xhci=\"no\">"
}
append config_of_app {
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc">
<vfs>
<dir name="dev">
<log/> <rtc/>}
append_if [expr !$use_rumpfs] config_of_app {
append_if [expr !$use_rumpfs] config_of_app {
<block name="sda3" label="raw" block_buffer_count="128" />}
append config_of_app {
append config_of_app {
</dir>}
append_if [expr $use_ram_fs] config_of_app {
append_if [expr $use_ram_fs] config_of_app {
<dir name="ram"> <fs label="from_ram_fs"/> </dir>}
append config_of_app "
append config_of_app "
<rom name=\"${vbox_file}\"/>"
append_if [expr !$use_rumpfs] config_of_app "
append_if [expr !$use_rumpfs] config_of_app "
<rom name=\"${raw_image}\"/>"
append_if [expr $use_rumpfs || $use_ram_fs] config_of_app {
append_if [expr $use_rumpfs || $use_ram_fs] config_of_app {
<fs />}
append config_of_app {
append config_of_app {
</vfs>
</libc>
</config>
<route>}
append_if [expr $use_ram_fs] config_of_app {
<service name="File_system">
<if-arg key="label" value="from_ram_fs" />
<child name="ram_fs"/>
</service>}
append_if [expr $use_ram_fs] config_of_app {
<service name="File_system" label="from_ram_fs"> <child name="ram_fs"/> </service>}
append_if [expr $use_rumpfs] config_of_app {
<service name="File_system"> <child name="rump_fs"/> </service>}
append_if [expr !$use_rumpfs] config_of_app {
<service name="Block"> <child name="part_blk"/> </service>}
append config_of_app {
<service name="Framebuffer"> <child name="nit_fb" /> </service>
<service name="Input"> <child name="nit_fb" /> </service>
append_if [expr $use_rumpfs] config_of_app {
<service name="File_system"> <child name="rump_fs"/> </service>}
append_if [expr !$use_rumpfs] config_of_app {
<service name="Block"> <child name="part_blk"/> </service>}
append config_of_app "
<service name=\"Framebuffer\"> <child name=\"nit_fb${i}\" /> </service>
<service name=\"Input\"> <child name=\"nit_fb${i}\" /> </service>"
append config_of_app {
<service name="Report"><child name="report_rom" /></service>
<service name="ROM">
<if-arg key="label" value="usb_devices"/> <child name="report_rom"/>
</service>
<any-service> <parent/> <any-child /> </any-service>
</route>
</start>
</start>}
}
source ${genode_dir}/repos/ports/run/virtualbox_auto.inc
@ -255,11 +313,17 @@ append_if [expr !$use_rumpfs] boot_modules " ${raw_image} "
build_boot_image $boot_modules
run_genode_until {\[init -\> vbox\].*Guest Additions capability report:.*seamless: no, hostWindowMapping: no, graphics: no} 70
run_genode_until {\[init -\> vbox.*].*Guest Additions capability report:.*seamless: no, hostWindowMapping: no, graphics: no} 70
# run_genode_until forever 0 [output_spawn_id]
if {$use_rumpfs} {
run_genode_until {\[init -\> vbox\].*Guest Additions capability report:.*seamless: yes, hostWindowMapping: no, graphics: yes} 170 [output_spawn_id]
set wait_timeout 170
for { set i 1 } { $i <= $use_vms } { incr i } {
run_genode_until {\[init -\> vbox.*].*Guest Additions capability report:.*seamless: yes, hostWindowMapping: no, graphics: yes} $wait_timeout [output_spawn_id]
set wait_timeout 25
}
} else {
run_genode_until {\[init\] child "vbox" exited with exit value 0} 60 [output_spawn_id]
run_genode_until {\[init\] child "vbox1" exited with exit value 0} 60 [output_spawn_id]
# give block driver bit time to write data to disk
sleep 5
}

View File

@ -25,6 +25,8 @@ lappend_if [expr $use_usb] build_components drivers/usb
lappend_if [expr $use_usb] build_components app/usb_report_filter
lappend_if [have_spec x86] build_components drivers/rtc
lappend_if [expr $use_ram_fs || $use_usb] build_components server/ram_fs
lappend_if [expr $use_cpu_load] build_components app/trace_subject_reporter
lappend_if [expr $use_cpu_load] build_components app/cpu_load_display
source ${genode_dir}/repos/base/run/platform_drv.inc
# override defaults of platform_drv.inc
@ -37,7 +39,14 @@ build $build_components
create_boot_directory
set config {
<config verbose="yes" prio_levels="4">
<config verbose="yes" prio_levels="4">}
if {$use_vms > 1} {
append config "
<affinity-space width=\"${affinity_space_width}\" height=\"1\"/>"
}
append config {
<parent-provides>
<service name="ROM"/>
<service name="RAM"/>
@ -52,6 +61,9 @@ set config {
append_if [have_spec muen] config {
<service name="VM"/>}
append_if [expr $use_cpu_load] config {
<service name="TRACE"/>}
append config {
</parent-provides>
<default-route>
@ -67,10 +79,6 @@ append config {
<config>
<policy label="part_blk" device="0"/>
</config>
<route>
<service name="IRQ"><child name="acpi_drv"/></service>
<any-service> <parent/> <any-child/></any-service>
</route>
</start>
<start name="part_blk" priority="-1">
<resource name="RAM" quantum="10M"/>
@ -82,7 +90,7 @@ append config {
append_if [expr $use_rumpfs] config {
<policy label="rump_fs" partition="4"/>}
append_if [expr !$use_rumpfs] config {
<policy label="vbox -> raw" partition="3"/>}
<policy label="vbox1 -> raw" partition="3"/>}
append config {
</config>
</start>}
@ -91,7 +99,8 @@ append_if [expr $use_rumpfs] config {
<start name="rump_fs" priority="-1">
<resource name="RAM" quantum="32M"/>
<provides><service name="File_system"/></provides>
<config fs="ext2fs">}
<config ld_verbose="yes" fs="ext2fs">}
append_if [expr $use_rumpfs && $use_ram_fs && $use_overlay_from_disk] config {
<policy label="overlay_from_disk" root="/ram" writeable="yes"/>}
append_if [expr $use_rumpfs] config {
@ -103,18 +112,27 @@ append_if [expr $use_rumpfs] config {
</start>}
append_if [expr $use_ram_fs] config {
<start name="ram_fs" priority="-1">
<resource name="RAM" quantum="512M"/>
<start name="ram_fs" priority="-1">}
append_if [expr $use_ram_fs] config "
<resource name=\"RAM\" quantum=\"[expr $use_vms * 3 * 128]M\"/>"
append_if [expr $use_ram_fs] config {
<provides><service name="File_system"/></provides>
<config>
<content>
<dir name="ram"> }
append_if [expr $use_ram_fs] config "<rom name=\"${overlay_image}\"/>"
<content>}
for { set i 1} { $i <= ${use_vms} } { incr i} {
append_if [expr $use_ram_fs] config "
<dir name=\"ram${i}\">
<rom name=\"${overlay_image}\"/>
</dir>"
}
append_if [expr $use_ram_fs] config {
</dir>
</content>
<!-- constrain sessions according to their labels -->
<policy label="vbox -> from_ram_fs" root="/ram" writeable="yes"/>
<!-- constrain sessions according to their labels -->}
for { set i 1} { $i <= ${use_vms} } { incr i} {
append_if [expr $use_ram_fs] config "
<policy label=\"vbox${i} -> from_ram_fs\" root=\"/ram${i}\" writeable=\"yes\"/>"
}
append_if [expr $use_ram_fs] config {
</config>
<route>}
append_if [expr $use_ram_fs && $use_overlay_from_disk] config "<service name=\"ROM\" label=\"${overlay_image}\">"
@ -128,7 +146,7 @@ append_if [expr $use_ram_fs] config {
append_if [expr $use_ram_fs && $use_overlay_from_disk] config {
<start name="overlay_from_disk" priority="-1">
<binary name="fs_rom"/>
<resource name="RAM" quantum="256M"/>
<resource name="RAM" quantum="32M"/>
<provides><service name="ROM"/></provides>
<route>}
append_if [expr $use_rumpfs && $use_ram_fs && $use_overlay_from_disk] config {
@ -144,9 +162,31 @@ append_if [expr $use_ps2] config {
<start name="ps2_drv" priority="-1">
<resource name="RAM" quantum="1M"/>
<provides><service name="Input"/></provides>
<config/>
</start>}
append_if [expr $use_cpu_load] config {
<start name="trace_subject_reporter" priority="-1">
<resource name="RAM" quantum="6M"/>
<config period_ms="500">
<report activity="yes" affinity="yes"/>
</config>
<route>
<service name="IRQ"><child name="acpi_drv"/></service>
<any-service> <parent/> <any-child/></any-service>
<service name="TRACE"><parent/></service>
<service name="LOG"><parent/></service>
<service name="Timer"><child name="timer"/></service>
<service name="Report"><child name="report_rom"/></service>
</route>
</start>
<start name="cpu_load_display" priority="-1">
<resource name="RAM" quantum="6M"/>
<config/>
<route>
<service name="LOG"><parent/></service>
<service name="Timer"><child name="timer"/></service>
<service name="ROM" label="trace_subjects"><child name="report_rom"/></service>
<service name="Nitpicker"><child name="nitpicker"/></service>
</route>
</start>}
@ -175,7 +215,7 @@ append_if [expr $use_usb] config {
<inline name="usb_report_filter.config">
<config>
<!-- USB device whitelist -->
<client label="vbox"/>
<client label="vbox1"/>
<device vendor_id="0x13fe" product_id="0x5200"/> <!-- platinum stick -->
<device vendor_id="0x148f" product_id="0x2573"/> <!-- ralink wifi -->
<device vendor_id="0x1f75" product_id="0x0917"/> <!-- intenso stick -->
@ -242,7 +282,6 @@ append_if [expr $use_usb] config {
</provides>
<configfile name="usb_drv.config"/>
<route>
<service name="IRQ"><child name="acpi_drv"/></service>
<service name="Report"><child name="report_rom"/></service>
<service name="ROM" label="usb_drv.config"><child name="usb_config_rom"/></service>
<any-service><parent/><any-child/></any-service>
@ -289,6 +328,8 @@ lappend_if [expr $use_vbox4] boot_modules virtualbox
lappend_if [expr $use_vbox5] boot_modules virtualbox5
lappend_if [expr $use_ram_fs || $use_usb] boot_modules ram_fs
lappend_if [expr $use_ram_fs && !$use_overlay_from_disk] boot_modules ${overlay_image}
lappend_if [expr $use_cpu_load] boot_modules trace_subject_reporter
lappend_if [expr $use_cpu_load] boot_modules cpu_load_display
# platform-specific modules
lappend_if [expr $use_ps2] boot_modules ps2_drv