genode/repos/ports/run/vbox_win.inc
Norman Feske 5a1cef6381 Make label prefixing more strict
This patch unconditionally applies the labeling of sessions and thereby
removes the most common use case of 'Child_policy::filter_session_args'.
Furthermore, the patch removes an ambiguity of the session labels of
sessions created by the parent of behalf of its child, e.g., the PD
session created as part of 'Child' now has the label "<child-name>"
whereas an unlabeled PD-session request originating from the child
has the label "<child-name> -> ". This way, the routing-policy of
'Child_policy::resolve_session_request' can differentiate both cases.

As a consequence, the stricter labeling must now be considered wherever
a precise label was specified as a key for a session route or a server-
side policy selection. The simplest way to adapt those cases is to use a
'label_prefix' instead of the 'label' attribute. Alternatively, the
'label' attribute may used by appending " -> " (note the whitespace).

Fixes #2171
2016-11-30 13:37:07 +01:00

336 lines
9.5 KiB
HTML

# Tested for nova and hw_x86_64_muen.
if {(![have_spec nova] && ![have_spec hw_x86_64_muen])} {
puts "Platform is unsupported."
exit 0
}
if {[have_include "power_on/qemu"]} {
puts "\nRun script does not support Qemu.\n"
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"
set overlay_image "overlay_${flavor}.vdi"
set build_components {
server/input_merger
drivers/nic
drivers/audio
server/nitpicker
app/vbox_pointer
server/nit_fb
server/report_rom
server/dynamic_rom
}
set boot_modules {
input_merger
nic_drv
audio_drv
nitpicker
vbox_pointer
nit_fb
report_rom
dynamic_rom
}
set config_of_app {
<start name="input_merger">
<resource name="RAM" quantum="1M" />
<provides>
<service name="Input" />
</provides>
<config>}
append_if [expr $use_ps2] config_of_app {
<input label="ps2" /> }
append_if [expr $use_usb] config_of_app {
<input label="usb_hid" />}
append config_of_app {
</config>
<route> }
append_if [expr $use_ps2] config_of_app {
<service name="Input">
<if-arg key="label" value="ps2" /> <child name="ps2_drv" />
</service> }
append_if [expr $use_usb] config_of_app {
<service name="Input">
<if-arg key="label" value="usb_hid" /> <child name="usb_drv" />
</service> }
append config_of_app {
<any-service> <parent /> <any-child /> </any-service>
</route>
</start>
<!--
Note: to get network access in the VM, the virtual network adapter
needs to be enabled in the .vbox file (disabled by default)
-->
<start name="nic_drv" priority="-1">
<resource name="RAM" quantum="8M" />
<provides>
<service name="Nic" />
</provides>
</start>
<!--
Note: to use audio in the VM, the virtual audio adapter
needs to be enabled in the .vbox file (disabled by default).
(Recording is configured to use the external mic.)
-->
<start name="audio_drv" priority="-1">
<resource name="RAM" quantum="9M"/>
<provides>
<service name="Audio_out"/>
<service name="Audio_in"/>
</provides>
<config recording="yes">
<mixer field="outputs.master" value="255"/>
<mixer field="record.adc-0:1_source" value="sel2"/>
<mixer field="record.adc-0:1" value="255"/>
</config>
</start>
<start name="report_rom">
<resource name="RAM" quantum="1M"/>
<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"/>}
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="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>
<start name="nitpicker" priority="-1">
<resource name="RAM" quantum="4M"/>
<provides><service name="Nitpicker"/></provides>
<route>
<service name="Framebuffer"> <child name="fb_drv" /> </service>
<service name="Input"> <child name="input_merger" /> </service>
<service name="Report"> <child name="report_rom" /> </service>
<any-service> <parent/> <any-child /> </any-service>
</route>
<config>
<report focus="yes" hover="yes" xray="yes" />
<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_prefix="vbox_pointer" domain="pointer"/>
<policy label_prefix="cpu_load_display" domain="cpu_load"/>
<default-policy domain=""/>
</config>
</start>
<start name="vbox_pointer" priority="-1">
<resource name="RAM" quantum="1200K"/>
<config>}
for { set i 1} { $i <= $use_vms } { incr i} {
append config_of_app "
<policy label_prefix=\"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>}
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" />
<provides>
<service name="Framebuffer" />
<service name="Input" />
</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>}
}
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>}
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="500000" />}
append config_of_app {
</rom>}
}
append config_of_app {
</config>
<route>
<service name="RM"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="Timer"> <child name="timer"/> </service>
</route>
</start>}
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 {
<binary name="virtualbox5" />}
append config_of_app {
<resource name="RAM" quantum="1280M"/>}
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 {
<block name="sda3" label="raw" block_buffer_count="128" />}
append config_of_app {
</dir>}
append_if [expr $use_ram_fs] config_of_app {
<dir name="ram"> <fs label="from_ram_fs"/> </dir>}
append config_of_app "
<rom name=\"${vbox_file}\"/>"
append_if [expr !$use_rumpfs] config_of_app "
<rom name=\"${raw_image}\"/>"
append_if [expr $use_rumpfs || $use_ram_fs] config_of_app {
<fs />}
append config_of_app {
</vfs>
</libc>
</config>
<route>}
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${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>}
}
source ${genode_dir}/repos/ports/run/virtualbox_auto.inc
# copy vbox configuration to bin directory
exec cp ${genode_dir}/repos/ports/run/${vbox_file} bin/.
if {!$use_rumpfs} {
exec cp ${genode_dir}/repos/ports/run/${raw_image} bin/.
}
append boot_modules " ${vbox_file} "
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 forever 0 [output_spawn_id]
if {$use_rumpfs} {
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 "vbox1" exited with exit value 0} 60 [output_spawn_id]
# give block driver bit time to write data to disk
sleep 5
}
# cleanup bin directory - remove vbox file
exec rm bin/${vbox_file}
if {!$use_rumpfs} {
exec rm bin/${raw_image}
}