#
# \brief OKL4-specific test-environment supplements
# \author Norman Feske
# \date 2010-08-16
#
# This file is meant to be used as '--include' argument for 'tool/run'.
#
##
# Install files needed to boot via PXE
#
proc install_pxe_bootloader_to_run_dir { } {
exec cp [genode_dir]/tool/boot/pulsar [run_dir]/boot/pulsar
exec cp [genode_dir]/tool/boot/bender [run_dir]/boot/bender
}
##
# Get the base-okl4 repository
#
proc base_okl4_dir {} { return [repository_contains mk/spec-okl4.mk] }
##
# Read the location of the OKL4 directory from 'etc/okl4.conf'
#
proc okl4_dir { } {
global _okl4_dir
if {![info exists _okl4_dir]} {
if {[file exists etc/okl4.conf]} {
set _okl4_dir [exec sed -n "/^OKL4_DIR/s/^.*=\\s*//p" etc/okl4.conf]
if {[file exists $_okl4_dir]} { return $_okl4_dir }
}
set _okl4_dir [base_okl4_dir]/contrib/okl4
}
return $_okl4_dir
}
##
# Return the location of the OKL4 kernel
#
proc okl4 { } {
if {[okl4_external]} { return [okl4_dir]/build/pistachio/bin/kernel }
return bin/kernel
}
##
# Return whether okl4 kernel is provided from the outside
#
proc okl4_external { } {
if {"[okl4_dir]" == "[base_okl4_dir]/contrib/okl4"} { return 0 }
return 1
}
##################################
## Test framework API functions ##
##################################
proc create_boot_directory { } {
exec rm -rf [run_dir]
exec mkdir -p [run_dir]/genode
}
set weaver_xml_template {
}
proc build_boot_image {binaries} {
global weaver_xml_template
#
# Strip binaries
#
copy_and_strip_genode_binaries_to_run_dir $binaries
#
# Build kernel if needed
#
# Once the kernel is exists, it gets never revisited automatically.
# Consequently, when changing the kernel sources, the kernel build must be
# issued explicitly via 'make kernel'. This way, the rare case of changing
# the kernel does not stand in the way of the everyday's work flow of
# executing run scripts as quick as possible.
#
if {![okl4_external] && ![file exists [okl4]]} { build { kernel } }
exec cp [okl4] [run_dir]/kernel
#
# Generate ELF weaver config
#
set fh [open "[run_dir].weaver.xml" "WRONLY CREAT TRUNC"]
puts $fh {}
puts $fh {}
puts $fh {}
regsub okl4_kernel $weaver_xml_template "[run_dir]/kernel" weaver_xml_template
regsub core $weaver_xml_template "[run_dir]/genode/core" weaver_xml_template
puts $fh $weaver_xml_template
puts $fh { }
puts $fh " "
foreach binary $binaries {
if {$binary != "core"} {
puts $fh " " }
}
puts $fh { }
puts $fh {}
close $fh
#
# Run ELF Weaver to create a boot image
#
set ret [exec "[okl4_dir]/tools/pyelf/elfweaver" merge --output "[run_dir]/image.elf" "[run_dir].weaver.xml"]
if {[regexp "error" $ret dummy]} {
puts stderr "Elfweaver failed: $ret"
exit -6
}
exec [cross_dev_prefix]strip [run_dir]/image.elf
exec cp [run_dir]/image.elf [run_dir].elf
#
# Keep only the ELF boot image, but remove stripped binaries
#
exec rm -r [run_dir]/genode
#
# Install GRUB
#
install_iso_bootloader_to_run_dir
#
# Install PXE bootloader pulsar
#
install_pxe_bootloader_to_run_dir
#
# Generate grub config file
#
# The core binary is part of the 'binaries' list but it must
# appear right after 'sigma0' as boot module. Hence the special case.
#
set fh [open "[run_dir]/boot/grub/menu.lst" "WRONLY CREAT TRUNC"]
puts $fh "timeout 0"
puts $fh "default 0"
puts $fh "hiddenmenu"
puts $fh "\ntitle Genode on OKL4"
puts $fh "kernel /image.elf"
puts $fh "vbeset 0x117"
close $fh
create_iso_image_from_run_dir
#
# Generate pulsar config file
#
set fh [open "[run_dir]/config-52-54-00-12-34-56" "WRONLY CREAT TRUNC"]
# load okl4 at 256M to avoid overwritting binary, adjust by need
puts $fh " addr 0x10000000"
puts $fh " exec /boot/bender"
puts $fh " load /image.elf"
close $fh
#
# Generate pulsar config file pointing to the config file above.
#
if {[info exists ::env(PXE_TFTP_DIR_BASE)] && [info exists ::env(PXE_TFTP_DIR_OFFSET)]} {
exec ln -nfs "[pwd]" "$::env(PXE_TFTP_DIR_BASE)$::env(PXE_TFTP_DIR_OFFSET)"
set tftp_base ""
if {[get_cmd_switch --tftp-absolute]} {
set tftp_base $::env(PXE_TFTP_DIR_BASE)
}
set fh [open "$::env(PXE_TFTP_DIR_BASE)$::env(PXE_TFTP_DIR_OFFSET)/config-00-00-00-00-00-00" "WRONLY CREAT TRUNC"]
puts $fh " root $tftp_base$::env(PXE_TFTP_DIR_OFFSET)/[run_dir]"
puts $fh " config config-52-54-00-12-34-56"
close $fh
}
}
proc run_genode_until {{wait_for_re forever} {timeout_value 0} {running_spawn_id -1}} {
#
# If a running_spawn_id is specified, wait for the expected output
#
if {$running_spawn_id != -1} {
wait_for_output $wait_for_re $timeout_value $running_spawn_id
return
}
#
# Try to use one of the supported backends for running the scripts
#
if {[is_amt_available]} {
spawn_amt $wait_for_re $timeout_value
return
}
if {[is_qemu_available]} {
spawn_qemu $wait_for_re $timeout_value
return
}
global run_target
puts stderr "Error: Can't execute automatically on target '$run_target'"
exit -1
}