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 -n [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]" }