genode/tool/run/boot_dir/nova
Martin Stein ede007c2dd Bender: Intel HWP mode configurable via RUN_OPT
The updated Bender version is configurable regarding the mode in which to run
the Intel HWP plugin. This can now be controlled via the new run option
'--bender-intel-hwp-mode' (only when running on NOVA). The option knows 4 valid
values 'off', 'performance', 'balanced', and 'power_saving'. When running on
NOVA, the default value applied by the run tool is 'performance'. when running
on any other kernel, the default value of Bender ('off') is used. Therefore,
when not setting the new '--bender-intel-hwp-mode' flag, the behavior is the
same as before this commit.

Fixes #4224
2022-09-19 14:00:34 +02:00

228 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-nova.lib.so" }
proc binary_name_core_a { } { return "core-nova.a" }
proc binary_name_timer { } { return "nova_timer_drv" }
proc kernel_files { } { return hypervisor }
proc kernel_output { } { return "novga serial" }
proc run_boot_string { } {
return "\nHypervisor NOVA "
}
proc apply_microcode { } { return false }
proc core_link_address { } { return "0x100000" }
proc core_ld_opts { } {
set ret { -Wl,-T }
lappend ret "-Wl,[genode_dir]/repos/base/src/ld/genode.ld"
lappend ret "-Wl,[genode_dir]/repos/base-nova/src/core/core-bss.ld"
return $ret
}
##
# Populate directory with binaries on NOVA
#
proc run_boot_dir {binaries} {
#
# Build kernel-specific targets if needed
#
# If the run scripts imports the base-nova binary archive, [run_dir] is
# already populated, so we can skip the build.
#
set kernel_arg ""
set core_arg ""
set ld_arg ""
if {![file exists [run_dir]/genode/hypervisor]} { set kernel_arg kernel }
if {![file exists [run_dir]/genode/core-nova.a]} { set core_arg core/nova }
if {![file exists [run_dir]/genode/ld.lib.so]} { set ld_arg lib/ld-nova }
set targets "$kernel_arg $core_arg $ld_arg"
if {[llength $targets]} { build $targets }
if {$kernel_arg != ""} { copy_file bin/hypervisor [run_dir]/genode/hypervisor }
if {$core_arg != ""} { copy_file bin/core-nova.a [run_dir]/genode/core-nova.a }
if {$ld_arg != ""} { copy_file bin/ld-nova.lib.so [run_dir]/genode/ld.lib.so }
#
# Collect contents of the boot image
#
build_core_image $binaries
exec mkdir -p [run_dir]/boot
exec [cross_dev_prefix]objcopy -O elf32-i386 [run_dir]/genode/hypervisor [run_dir]/boot/hypervisor
exec [cross_dev_prefix]strip [run_dir]/boot/hypervisor
remove_genode_dir
exec mv [run_dir]/image.elf [run_dir]/boot/image.elf
#
# Setup bender and plugins
#
set options_bender ""
#
# Apply Intel HWP mode
#
append options_bender " [bender_intel_hwp_mode_option]"
if {[apply_microcode]} {
exec cp bin/micro.code [run_dir]/boot/
append options_bender " microcode"
}
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"]} {
exec mkdir -p [run_dir]/boot/grub
exec cp [genode_dir]/tool/boot/bender [run_dir]/boot/bender
exec cp [genode_dir]/tool/boot/boot.png [run_dir]/boot/boot.png
if {[file exists /boot/grub/unicode.pf2]} {
# needed in graphical menu with non-scrampled characters
# exec cp /boot/grub/unicode.pf2 [run_dir]/boot/grub/unicode.pf2
}
}
if {[have_include "image/iso"]} {
install_iso_bootloader_to_run_dir
}
if {[have_include image/uefi]} {
set grub2_path [get_grub2_dir]
exec mkdir -p [run_dir]/efi/boot
exec cp $grub2_path/boot/grub2/grub2_32.efi [run_dir]/efi/boot/bootia32.efi
exec cp $grub2_path/boot/grub2/grub2_64.efi [run_dir]/efi/boot/bootx64.efi
exec mkdir -p [run_dir]/boot/grub
exec cp [genode_dir]/tool/boot/bender [run_dir]/boot/bender
exec cp [genode_dir]/tool/boot/boot.png [run_dir]/boot/boot.png
if {[file exists /boot/grub/unicode.pf2]} {
# needed in graphical menu with non-scrampled characters
# exec cp /boot/grub/unicode.pf2 [run_dir]/boot/grub/unicode.pf2
}
append options_bender " serial_fallback"
}
#
# Generate GRUB2 config file
#
set fh [open "[run_dir]/boot/grub/grub.cfg" "WRONLY CREAT TRUNC"]
# If timeout != 0 is used and gfxterm, enable and add unicode.pf2 (see above)
# puts $fh "loadfont /boot/grub/unicode.pf2"
puts $fh "set timeout=0"
# choose best graphic mode
# uncomment line to get vga console working in hypervisor
puts $fh "set gfxpayload=auto"
if {[have_include image/uefi]} {
puts $fh "insmod gfxterm"
puts $fh "terminal_output gfxterm"
puts $fh "insmod gfxterm_background"
puts $fh "insmod png"
puts $fh "background_image -m center /boot/boot.png"
}
# set this to get text console instead of graphical console
# puts $fh "terminal_input console"
# puts $fh "terminal_output console"
puts $fh "menuentry 'Genode on NOVA' {"
puts $fh " insmod multiboot2"
puts $fh " insmod gzio"
puts $fh " multiboot2 /boot/bender $options_bender"
if {[apply_microcode]} {
puts $fh " module2 /boot/micro.code micro.code"
}
puts $fh " module2 /boot/hypervisor hypervisor iommu novpid [kernel_output]"
puts $fh " module2 /boot/image.elf.gz image.elf"
puts $fh "}"
close $fh
}
#
# Build image
#
run_image
if {[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"
if {[apply_microcode]} {
puts $fh " load /boot/micro.code micro.code"
}
puts $fh " load /boot/hypervisor iommu novpid [kernel_output]"
puts $fh " load /boot/image.elf"
close $fh
generate_tftp_config
}
if {[have_include "load/ipxe"]} {
create_ipxe_config
update_ipxe_boot_dir
create_symlink_for_iso
}
}
##
# Base source archive within depot
#
proc base_src { } {
if {[have_spec x86]} { return base-nova }
global specs
puts stderr "Test requires base-nova kernel archive, which is missing for this build configuration"
puts stderr " SPECS=\"$specs\""
exit 0
}