mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-22 06:57:51 +00:00
212 lines
4.8 KiB
Plaintext
Executable File
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
|
|
}
|
|
}
|