genode/base-mb/run/env
2011-12-22 16:19:25 +01:00

212 lines
4.8 KiB
Plaintext
Executable File

#
# \brief Environment for executing Genode on Microblaze
# \author Norman Feske
# \author Martin Stein
# \date 2010-09-01
#
# For the documentation of the implemented API functions,
# please refer to the comments in 'tool/run'.
#
proc create_boot_directory { } {
catch {
exec rm -rf [run_dir]
exec mkdir -p [run_dir]
}
}
proc build {targets {build_core 0}} {
if {[get_cmd_switch --skip-build]} return
regsub -all {\s\s+} $targets " " targets
# Save building 'core' until last
if {$build_core == 0} {
regsub -all {\mcore\M} $targets "" targets
}
puts "building targets: $targets"
set timeout 10000
set pid [eval "spawn make $targets"]
expect { eof { } }
if {[lindex [wait $pid] end] != 0} {
puts "Error: Genode build failed"
exit -4
}
puts "genode build completed"
}
proc stripped_copy {binary} {
exec mkdir -p bin/stripped/
exec rm -rf bin/stripped/$binary
exec cp bin/${binary} bin/stripped/${binary}
catch {exec [cross_dev_prefix]strip bin/stripped/${binary}}
}
#
# Microblaze needs a single boot image, thus this function creates an temporary assembly file that
# includes all images wich are needed by the boot image to be included by it
#
proc build_boot_modules {} {
global boot_modules
global boot_modules_s
set boot_modules_s "[genode_dir]/base-mb/src/core/boot_modules.s"
exec echo -e \
"\n/**"\
"\n * This file was generated by the expect procedure"\
"\n * 'build_boot_modules' in 'run/env'"\
"\n */"\
"\n\n"\
"\n.global _boot_modules_meta_start" \
"\n.global _boot_modules_meta_end" \
"\n\n" \
"\n.section .data" \
"\n.string \"GROM\"" \
"\n.long header_end" \
"\n.align 4" \
"\n_boot_modules_meta_start:" > $boot_modules_s
# Header, pointers part
set i 1
foreach module $boot_modules {
exec echo -e \
"\n.long mod${i}_name" \
"\n.long mod${i}_start" \
"\n.long mod${i}_end - mod${i}_start" >> $boot_modules_s
incr i
}
exec echo -e \
"\n.align 4"\
"\n_boot_modules_meta_end:" >> $boot_modules_s
# Header, names part
set i 1
foreach module $boot_modules {
exec echo -e \
"\nmod${i}_name:" \
"\n.string \"${module}\"" \
"\n.byte 0" >> $boot_modules_s
incr i
}
exec echo -e "header_end:" >> $boot_modules_s
# Modulecontents
set i 1
foreach module $boot_modules {
exec echo -e ".align 12" >> $boot_modules_s
# Stripped images the boot image depends on are not enabled because 'mb-strip' destroys
# the file offset alignments and Genode needs a specific minimum file offset alignment
#
# if { [catch {exec [cross_dev_prefix]readelf -h bin/${module}}] } {
exec echo -e "mod${i}_start: .incbin \"../bin/${module}\"" >> $boot_modules_s
# } else {
# exec echo -e "mod${i}_start: .incbin \"../bin/stripped/${module}\"" >> $boot_modules_s
# }
exec echo -e "mod${i}_end:" >> $boot_modules_s
incr i
}
exec echo -e ".align 12" >> $boot_modules_s
}
proc build_boot_image {images} {
global boot_modules
global boot_modules_s
foreach image $images {
if {$image != "core"} {
# Stripped images the boot image depends on are not enabled because 'mb-strip' destroys
# the file offset alignments and Genode needs a specific minimum file offset alignment
#
# if { [catch {exec [cross_dev_prefix]readelf -h bin/${image}}] == 0 } {
# stripped_copy $image
# }
append boot_modules "${image}" " "
}
}
build_boot_modules
build "core" 1
stripped_copy "core"
catch {
exec ln -sf ../../../bin/stripped/core [run_dir]/image.elf
}
exec rm -f $boot_modules_s
}
proc run_genode_until {{wait_for_re forever} {timeout_value 0}} {
set image [pwd]/[run_dir]/image.elf
set target [get_cmd_arg --target "qemu"]
if { $target == "jtag" } {
# try to run on device via jtag
spawn make -C [genode_dir]/base-mb/platform/[hardware] upload IMAGE=$image VERBOSE=
interact
} elseif { $target == "qemu" } {
# run on qemu
global output
set timeout $timeout_value
set pid [spawn [qemu] -kernel $image -serial stdio]
if {$wait_for_re == "forever"} { interact $pid }
expect {
-re $wait_for_re { }
timeout { puts stderr "Error: Test execution timed out"; exit -2 }
}
set output $expect_out(buffer)
} else {
puts stderr "Error: Target '${target}' is not supported"
puts stderr " Supported targets are: 'jtag' and 'qemu'"; exit -3
}
}
proc install_config {config} {
global boot_modules
append boot_modules "config" " "
set fh [open "bin/config" "WRONLY CREAT TRUNC"]
puts $fh $config
close $fh
exec touch [genode_dir]/base-mb/src/core/boot_modules.s
}
proc qemu { } {
global _qemu
set _qemu [get_cmd_arg --qemu "qemu-system-microblaze"]
return $_qemu
}
proc hardware { } {
global _hardware
#
# Test on all supported platforms
#
if { [have_spec {mb_s3a_starter_kit}] } {
set _hardware mb_s3a_starter_kit
return $_hardware
}
if { [have_spec {mb_ml507}] } {
set _hardware mb_ml507
return $_hardware
}
}