From d006185d90973277410b9fe97c941b9aab09384b Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Sun, 21 Sep 2014 10:20:20 +0200 Subject: [PATCH] seoul: add script turning Genode scenario into VM Related to issue #1261 --- repos/ports/run/seoul-auto.run | 1 + repos/ports/run/seoul-disc.run | 12 +-- repos/ports/run/seoul-fancy.run | 1 + repos/ports/run/seoul-genode.run | 75 +++++++++++++++++++ repos/ports/run/seoul-kernelbuild.run | 1 + repos/ports/run/seoul-net.run | 1 + repos/ports/run/seoul.inc | 62 +++++++++++---- .../src/app/seoul/boot_module_provider.h | 11 ++- .../src/app/seoul/device_model_registry.cc | 3 +- 9 files changed, 144 insertions(+), 23 deletions(-) create mode 100644 repos/ports/run/seoul-genode.run diff --git a/repos/ports/run/seoul-auto.run b/repos/ports/run/seoul-auto.run index 5e6d81b35..0339bfd4c 100644 --- a/repos/ports/run/seoul-auto.run +++ b/repos/ports/run/seoul-auto.run @@ -10,6 +10,7 @@ assert_spec nova set use_multiboot 1 +set use_genode_iso 0 set use_block_ide 0 set use_block_sata 0 diff --git a/repos/ports/run/seoul-disc.run b/repos/ports/run/seoul-disc.run index dfe31a435..f0ea1ada4 100644 --- a/repos/ports/run/seoul-disc.run +++ b/repos/ports/run/seoul-disc.run @@ -8,9 +8,10 @@ # set use_multiboot 0 +set use_genode_iso 0 -set use_block_ide 1 -set use_block_sata 0 +set use_block_ide 0 +set use_block_sata 1 set use_nic_session 0 set use_nic_bridge 0 @@ -20,7 +21,7 @@ set use_usb 0 set use_framebuffer 1 set use_fancy_stuff 0 -set memory_vmm_vm "128M" +set memory_vmm_vm "512M" set vcpus_to_be_used 1 @@ -33,9 +34,10 @@ if {[is_qemu_available]} { exit 1 } - append qemu_args " -m 128 " + append qemu_args " -m 1024 " append qemu_args " -cpu phenom" - append qemu_args " -boot d -hda bin/seoul-disc.raw " + append_if $use_block_ide qemu_args " -boot d -hda bin/seoul-disc.raw " + append_if $use_block_sata qemu_args " -drive id=disk,file=bin/seoul-disc.raw,if=none -device ahci,id=ahci -device ide-drive,drive=disk,bus=ahci.0 -boot d" } run_genode_until forever diff --git a/repos/ports/run/seoul-fancy.run b/repos/ports/run/seoul-fancy.run index ba9efb60c..c9b0960d6 100644 --- a/repos/ports/run/seoul-fancy.run +++ b/repos/ports/run/seoul-fancy.run @@ -11,6 +11,7 @@ # set use_multiboot 1 +set use_genode_iso 0 set use_block_ide 0 set use_block_sata 0 diff --git a/repos/ports/run/seoul-genode.run b/repos/ports/run/seoul-genode.run new file mode 100644 index 000000000..a4af22bc6 --- /dev/null +++ b/repos/ports/run/seoul-genode.run @@ -0,0 +1,75 @@ +# +# \brief Turn a Genode setup(run script) into a VM to be bootable in Seoul +# \author Alexander Boettcher +# \date 2014-09-21 +# +# This run script starts the Seoul VMM booting from a multiboot Genode setup +# created by another Genode run script. The referenced run script can be +# adapted by tuning the variables run_script and build_dir below accordingly. +# + +set use_multiboot 1 +set use_genode_iso 1 + +set use_block_ide 0 +set use_block_sata 0 + +set use_nic_session 1 +set use_nic_bridge 0 + +set use_usb 0 + +set use_framebuffer 1 +set use_fancy_stuff 0 + +set memory_vmm_vm "128M" + +set vcpus_to_be_used 1 + +# Put the multiboot data structure out of the way of Nova's bss. +set use_multiboot_modaddr 0x2800000 + +# Use a Genode run script and turn it into a bootable setup for Seoul +set run_script "printf" +set build_dir "." +set run_script_path "$build_dir/var/run/$run_script" +set genode_iso "$build_dir/var/run/$run_script.iso" + +if {[catch {exec cp $genode_iso bin/genode.iso}]} { + puts "Run scenario '$run_script' is not present. Please run it before\ + invoking this run script." + exit 1 +} + +set files_vm [exec cat $run_script_path/boot/grub/menu.lst] + +set vm [split $files_vm "\n"] +set guest_os_binaries {} +foreach line $vm { + if {[regexp "module\.*" $line] || [regexp "kernel\.*" $line]} { + set label_file [lindex $line 1] + set binary_cmdline [lrange $line 2 end] + regsub -all "/fiasco/" $label_file "" binary_file + regsub -all "/boot/" $binary_file "" binary_file + regsub -all "/genode/" $binary_file "" binary_file + + # skip bender to speed up booting + if {$binary_file == "bender"} { + continue + } + + if {$binary_cmdline eq ""} { + append multiboot_files "\n" + } else { + append multiboot_files "\n" + } + } +} +# Seoul VM setup done + +source ${genode_dir}/repos/ports/run/seoul.inc + +append qemu_args " -m 1024 " +append qemu_args " -cpu phenom " + +run_genode_until forever diff --git a/repos/ports/run/seoul-kernelbuild.run b/repos/ports/run/seoul-kernelbuild.run index 9a20f0535..4ebc537d5 100644 --- a/repos/ports/run/seoul-kernelbuild.run +++ b/repos/ports/run/seoul-kernelbuild.run @@ -15,6 +15,7 @@ if {[is_qemu_available]} { } set use_multiboot 1 +set use_genode_iso 0 set use_block_ide 0 set use_block_sata 0 diff --git a/repos/ports/run/seoul-net.run b/repos/ports/run/seoul-net.run index f23a910db..fb5688183 100644 --- a/repos/ports/run/seoul-net.run +++ b/repos/ports/run/seoul-net.run @@ -8,6 +8,7 @@ # set use_multiboot 1 +set use_genode_iso 0 set use_block_ide 0 set use_block_sata 0 diff --git a/repos/ports/run/seoul.inc b/repos/ports/run/seoul.inc index 7233ca2a0..0f681b8da 100644 --- a/repos/ports/run/seoul.inc +++ b/repos/ports/run/seoul.inc @@ -37,11 +37,13 @@ lappend_if $use_fancy_stuff build_components server/nitpicker lappend_if $use_fancy_stuff build_components server/liquid_framebuffer lappend_if $use_fancy_stuff build_components app/launchpad lappend_if $use_fancy_stuff build_components server/nitlog +lappend_if $use_genode_iso build_components server/iso9660 +lappend_if $use_genode_iso build_components server/rom_blk build $build_components # write Seoul config file -set vm_cfg_fd [open "bin/vm_linux.cfg" w] +set vm_cfg_fd [open "bin/vm_seoul.cfg" w] puts $vm_cfg_fd { @@ -73,8 +75,10 @@ if {!$use_multiboot} { } if {$use_multiboot} { - puts $vm_cfg_fd { - + if {[info exists use_multiboot_modaddr]} { + puts $vm_cfg_fd " " + } else { + puts $vm_cfg_fd { } } } @@ -171,6 +175,22 @@ append_if $use_block_ide config { } +append_if $use_genode_iso config { + + + + + + + + + + + + + + } + append_if [have_spec acpi] config { @@ -239,11 +259,21 @@ append_if [expr $use_nic_session && !$use_nic_bridge] config { } append_if $use_framebuffer config { } +append_if $use_genode_iso config { + + + + + + + + + } append config { - + } } @@ -331,7 +361,7 @@ if {$use_fancy_stuff} { - + } @@ -352,7 +382,7 @@ set boot_modules { timer rtc_drv seoul - vm_linux.cfg + vm_seoul.cfg } lappend_if [have_spec acpi] boot_modules acpi_drv @@ -369,7 +399,9 @@ lappend_if $use_fancy_stuff boot_modules liquid_fb lappend_if $use_fancy_stuff boot_modules launchpad lappend_if $use_fancy_stuff boot_modules nitlog lappend_if $use_fancy_stuff boot_modules launchpad-config - +lappend_if $use_genode_iso boot_modules rom_blk +lappend_if $use_genode_iso boot_modules iso9660 +lappend_if $use_genode_iso boot_modules genode.iso # # Add OS binaries of guest @@ -384,12 +416,14 @@ if {$use_multiboot} { set guest_os_binary_missing 1 } - set sha1 [exec sha1sum bin/$binary] - set sha1 [regexp -inline {[0-9a-h]+} $sha1] - if {[string compare $sha1 [lindex $sha1_os_binaries $binary_counter]]} { - puts "SHA1 sum of binary does not match with expected one - abort" - puts "$binary $sha1 != [lindex $sha1_os_binaries $binary_counter]" - set guest_os_binary_missing 1 + if {[info exists sha1_os_binaries]} { + set sha1 [exec sha1sum bin/$binary] + set sha1 [regexp -inline {[0-9a-h]+} $sha1] + if {[string compare $sha1 [lindex $sha1_os_binaries $binary_counter]]} { + puts "SHA1 sum of binary does not match with expected one - abort" + puts "$binary $sha1 != [lindex $sha1_os_binaries $binary_counter]" + set guest_os_binary_missing 1 + } } incr binary_counter 1 } @@ -406,4 +440,4 @@ if {$use_usb} { build_boot_image $boot_modules # A copy of the config is placed in the run folder. -exec rm -f bin/vm_linux.cfg +exec rm -f bin/vm_seoul.cfg diff --git a/repos/ports/src/app/seoul/boot_module_provider.h b/repos/ports/src/app/seoul/boot_module_provider.h index d503bff33..a26baf19f 100644 --- a/repos/ports/src/app/seoul/boot_module_provider.h +++ b/repos/ports/src/app/seoul/boot_module_provider.h @@ -80,11 +80,16 @@ class Boot_module_provider if (mod_node.has_type("rom")) { /* - * Determine ROM file name, which is specified as 'name' - * attribute of the 'rom' node. + * Determine ROM file name, which is specified as 'label' + * attribute of the 'rom' node. If no 'label' argument is + * provided, use the 'name' attribute as file name. */ char name[MODULE_NAME_MAX_LEN]; - mod_node.attribute("name").value(name, sizeof(name)); + try { + mod_node.attribute("label").value(name, sizeof(name)); + } catch (Xml_node::Nonexistent_attribute) { + mod_node.attribute("name").value(name, sizeof(name)); + } /* * Open ROM session diff --git a/repos/ports/src/app/seoul/device_model_registry.cc b/repos/ports/src/app/seoul/device_model_registry.cc index 3d1a7fc4d..ff5f9edca 100644 --- a/repos/ports/src/app/seoul/device_model_registry.cc +++ b/repos/ports/src/app/seoul/device_model_registry.cc @@ -85,12 +85,13 @@ MODEL_INFO(intel82576vf, "promisc", "mem_mmio", "mem_msix", "txpoll_us", "rx_map MODEL_INFO(ahci, "mem", "irq", "bdf") MODEL_INFO(drive, "sigma0drive", "controller", "port") +MODEL_INFO(vbios_multiboot, "modaddr", "lowmem") + MODEL_INFO_NO_ARG(vbios_disk) MODEL_INFO_NO_ARG(vbios_keyboard) MODEL_INFO_NO_ARG(vbios_mem) MODEL_INFO_NO_ARG(vbios_time) MODEL_INFO_NO_ARG(vbios_reset) -MODEL_INFO_NO_ARG(vbios_multiboot) MODEL_INFO_NO_ARG(msi) MODEL_INFO_NO_ARG(ioapic) MODEL_INFO_NO_ARG(vcpu)