genode/tool/run/boot_dir/hw
Alexander Boettcher 76828f25c5 tool: bender with optional 'serial' UART discovery
By default, bender will not report any serial findings anymore, if not
explicitly asked for with the 'serial' option. Without this option, an
invalid ioport is reported, so that neither the kernel nor Genode core
will make serial output.
2023-02-27 08:22:47 +01:00

196 lines
5.3 KiB
Plaintext

proc binary_name_ld_lib_so { } { return "ld-hw.lib.so" }
proc binary_name_core_a { } { return "core-hw.a" }
proc binary_name_timer { } { return "hw_timer_drv" }
proc run_boot_string { } { return "\nkernel initialized" }
proc boot_output { } { return "serial" }
proc bootstrap_link_address { } {
set link_address_file [file join "board" [board] "image_link_address"]
set repo [repository_contains $link_address_file]
if {$repo == ""} {
puts stderr "\nError: unknown image link address\n"
puts stderr " File $link_address_file not present in any repository.\n"
exit -1
}
set fh [open [file join $repo $link_address_file] "RDONLY"]
set link_address [lindex [gets $fh] 0]
close $fh
return $link_address
}
proc core_link_address { } {
if {[have_spec "64bit"]} { return "0xffffffc000000000" }
if {[have_spec "32bit"]} { return "0x80000000" }
return 0;
}
##
# Populate boot directory with binaries on hw
#
proc run_boot_dir {binaries} {
#
# Build bootstrap, the core object, and the dynamic linker on demand
#
# If those parts were imported from the depot, the build step is skipped.
#
set bootstrap_arg ""
set core_arg ""
if {![file exists [run_dir]/genode/core-hw-[board].a]} { set core_arg core/hw }
if {![file exists [run_dir]/genode/bootstrap-hw-[board].o]} { set bootstrap_arg bootstrap/hw }
set build_args "$bootstrap_arg $core_arg"
if {[llength $build_args]} { build $build_args }
if {$core_arg != ""} { copy_file bin/core-hw-[board].a [run_dir]/genode/ }
if {$bootstrap_arg != ""} { copy_file bin/bootstrap-hw-[board].o [run_dir]/genode/ }
#
# Copy specified modules to the run directory, excluding core.
#
set idx [lsearch $binaries "core"]
set modules [lreplace $binaries $idx $idx]
copy_genode_binaries_to_run_dir $modules
puts "core link address is [core_link_address]"
set core_obj core-hw-[board].a
set bootstrap_obj bootstrap-hw-[board].o
# create core and bootstrap binary without modules for debugging
if {[file exists debug/core-hw-[board].a]} {
build_core debug/core-hw-[board].a {} [run_dir].core [core_link_address]
build_core [run_dir]/genode/$bootstrap_obj {} [run_dir].bootstrap [bootstrap_link_address]
}
# determine modules to be incorporated into the core image
set modules [glob -tails -directory [run_dir]/genode/ *]
set excluded_modules {}
lappend excluded_modules $core_obj $bootstrap_obj
foreach excluded $excluded_modules {
set modules [lsearch -inline -not -all $modules $excluded] }
# check syntax of all boot modules named *.config
foreach file [glob -nocomplain [run_dir]/genode/*.config] {
check_xml_syntax $file }
# create core binary containing the boot modules
build_core [run_dir]/genode/$core_obj $modules [run_dir]/genode/core.elf [core_link_address]
exec [cross_dev_prefix]strip [run_dir]/genode/core.elf
build_core [run_dir]/genode/$bootstrap_obj { core.elf } [run_dir]/image.elf [bootstrap_link_address]
# Save config part of the image.elf for easy inspection
exec cp -f [run_dir]/genode/config [run_dir].config
remove_genode_dir
exec [cross_dev_prefix]strip [run_dir]/image.elf
exec mkdir -p [run_dir]/boot
exec mv [run_dir]/image.elf [run_dir]/boot/image.elf
set options_bender "[boot_output] "
if {[have_include "image/iso"] || [have_include "image/disk"] || [have_include image/uefi]} {
#
# Compress Genode image, to be uncompressed by GRUB
#
exec gzip [run_dir]/boot/image.elf
if {[have_include "image/disk"]} {
install_disk_bootloader_to_run_dir
}
if {[have_include "image/iso"]} {
install_iso_bootloader_to_run_dir
}
if {[have_include image/uefi]} {
install_uefi_bootloader_to_run_dir
append options_bender " serial_fallback"
}
#
# Generate GRUB2 config file
#
set fh [create_header_grub2_config]
puts $fh "menuentry 'Genode on base-hw' {"
puts $fh " insmod multiboot2"
puts $fh " multiboot2 /boot/bender $options_bender"
puts $fh " module2 /boot/image.elf.gz image.elf"
puts $fh "}"
close $fh
}
run_image
# install image.elf file in TFTP directory for PXE boot
if {[expr [have_spec arm] || [have_spec arm_64]] && [have_include "load/tftp"]} {
exec {*}[load_tftp_inst_cmd] [pwd]/[run_dir]/boot/image.elf [load_tftp_base_dir][load_tftp_offset_dir]
if {[have_include "image/uboot"]} {
exec {*}[load_tftp_inst_cmd] \
[file join [pwd] [run_dir] boot uImage] \
[load_tftp_base_dir][load_tftp_offset_dir]
}
if {[have_include "image/uboot_fit"]} {
exec {*}[load_tftp_inst_cmd] \
[file join [pwd] [run_dir] boot image.itb] \
[load_tftp_base_dir][load_tftp_offset_dir]
}
}
if {[have_spec x86] && [have_include "load/tftp"]} {
#
# Install PXE bootloader pulsar
#
install_pxe_bootloader_to_run_dir
#
# Generate pulsar config file
#
set fh [open "[run_dir]/config-52-54-00-12-34-56" "WRONLY CREAT TRUNC"]
puts $fh " exec /boot/bender $options_bender"
puts $fh " load /boot/image.elf"
close $fh
generate_tftp_config
}
if {[have_spec x86] && [have_include "load/ipxe"]} {
#
# Generate iPXE config file
#
set fh [open "[run_dir]/boot.cfg" "WRONLY CREAT TRUNC"]
puts $fh "#!ipxe"
install_pxe_bootloader_to_run_dir
puts $fh "kernel boot/bender $options_bender"
puts $fh "module boot/image.elf"
puts $fh "boot"
close $fh
update_ipxe_boot_dir
}
}
##
# Base source archive within depot
#
proc base_src { } { return "base-hw-[board]" }