genode/tool/run/boot_dir/hw
Alexander Boettcher 4da68e11b6 tool: support to set menuentry of GRUB
manually to self chosen value, by overwritting the tcl procedure
grub_menuentry, e.g.:

proc grub_menuentry { } { return "'My OS' --option_of_your_choice " }

Fix #5398
2024-12-10 14:12:24 +01:00

218 lines
6.3 KiB
Plaintext

#
# Return Bender option that configures Bender's Intel HWP plugin
#
# \param --bender-intel-hwp-mode Run the Intel HWP plugin of Bender in the
# given mode. Valid argument values are
# "off",
# "performance",
# "balanced", and
# "power_saving"
# The argument value defaults to
# "performance".
#
proc bender_intel_hwp_mode_option { } {
set opt [get_cmd_arg_first --bender-intel-hwp-mode "performance"]
if {$opt == "off"} {
return "intel_hwp_off"
} elseif {$opt == "performance"} {
return "intel_hwp_performance"
} elseif {$opt == "balanced"} {
return "intel_hwp_balanced"
} elseif {$opt == "power_saving"} {
return "intel_hwp_power_saving"
} else {
return "intel_hwp_performance"
}
}
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" }
proc binary_name_image_elf { } { return "image-hw.elf" }
proc run_boot_string { } { return "\nkernel initialized" }
proc boot_output { } { return "serial" }
proc grub_menuentry { } { return "'Genode on base-hw'" }
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]
exec [cross_dev_prefix]objcopy --only-keep-debug [run_dir].core [run_dir].core.debug
}
# 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-hw.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-hw.elf
exec mkdir -p [run_dir]/boot
exec mv [run_dir]/image-hw.elf [run_dir]/boot/image-hw.elf
set options_bender "[boot_output] [bender_intel_hwp_mode_option]"
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-hw.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 [grub_menuentry] {"
puts $fh " insmod multiboot2"
puts $fh " multiboot2 /boot/bender $options_bender"
puts $fh " module2 /boot/image-hw.elf.gz image-hw.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"]} {
if {[have_include "image/uboot"]} {
if {[image_uboot_use_fit]} {
exec {*}[load_tftp_inst_cmd] \
[file join [pwd] [run_dir] boot image.itb] \
[load_tftp_base_dir][load_tftp_offset_dir]
} else {
exec {*}[load_tftp_inst_cmd] \
[file join [pwd] [run_dir] boot uImage] \
[load_tftp_base_dir][load_tftp_offset_dir]
}
} else {
exec {*}[load_tftp_inst_cmd] [pwd]/[run_dir]/boot/image-hw.elf [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-hw.elf"
close $fh
generate_tftp_config
}
if {[have_spec x86] && [have_include "load/ipxe"]} {
create_ipxe_config
update_ipxe_boot_dir
create_symlink_for_iso
}
}
##
# Base source archive within depot
#
proc base_src { } { return "base-hw-[board]" }