mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-27 17:18:53 +00:00
ceaa02230e
With the update to sel4 and the gcc 12, assembly instructions are generated and used, like POPCNT. The instruction is available on our native hardware, but not emulated by the default cpu model necessarily, which leads to undefined opcode exceptions (Qemu 4.2.1 && seL4). Additionally, the features of the default Qemu cpu model may vary between Qemu releases and makes it harder to correlate effects.
171 lines
4.6 KiB
Plaintext
171 lines
4.6 KiB
Plaintext
#!/usr/bin/expect
|
|
|
|
##
|
|
# Reset the target machine or rather run the scenario with Qemu
|
|
#
|
|
|
|
|
|
##
|
|
#
|
|
#
|
|
proc board_qemu_args { } {
|
|
|
|
set qemu_args_file [file join "board" [board] "qemu_args"]
|
|
|
|
set repo [repository_contains $qemu_args_file]
|
|
|
|
if {$repo == ""} {
|
|
return ""
|
|
}
|
|
|
|
set fh [open [file join $repo $qemu_args_file] "RDONLY"]
|
|
set file_content [read $fh]
|
|
close $fh
|
|
|
|
##
|
|
# Each line is appended to qemu_args.
|
|
#
|
|
set qemu_args ""
|
|
foreach line [split $file_content "\n"] {
|
|
# general arguments
|
|
append qemu_args " $line"
|
|
}
|
|
|
|
return $qemu_args
|
|
}
|
|
|
|
##
|
|
# Execute scenario using Qemu
|
|
#
|
|
proc run_power_on { } {
|
|
global qemu_args
|
|
global qemu
|
|
global qemu_spawn_id
|
|
|
|
# save original qemu_args to support retrying
|
|
set original_qemu_args $qemu_args
|
|
|
|
#
|
|
# Back out on platforms w/o Qemu support
|
|
#
|
|
if {![is_qemu_available]} { return 0 }
|
|
|
|
if {[have_spec x86_32]} { set qemu "qemu-system-i386" }
|
|
if {[have_spec x86_64]} { set qemu "qemu-system-x86_64" }
|
|
if {[have_spec arm]} { set qemu "qemu-system-arm" }
|
|
if {[have_spec arm_64]} { set qemu "qemu-system-aarch64" }
|
|
if {[have_spec riscv]} { set qemu "qemu-system-riscv64" }
|
|
|
|
#
|
|
# Only the x86_64 variant of Qemu provides the emulation of hardware
|
|
# virtualization features used by NOVA. So let's always stick to this
|
|
# variant of Qemu when working with NOVA even when operating in 32bit.
|
|
#
|
|
if {[have_spec nova]} { set qemu "qemu-system-x86_64" }
|
|
|
|
#
|
|
# Redirect serial output to stdio, but only when no explicit configuration
|
|
# of serial interfaces is specified in the run script.
|
|
# The 'mon' prefix enables the access to the qemu console.
|
|
#
|
|
if {![regexp -- {-serial} $qemu_args dummy]} {
|
|
|
|
#
|
|
# In the raspi3 model the first UART is never used as
|
|
# log output, but the second
|
|
#
|
|
if {[have_board rpi3]} { append qemu_args " -serial null " }
|
|
append qemu_args " -serial mon:stdio "
|
|
}
|
|
|
|
# on x86, we support booting via pxe or iso/disk image
|
|
if {[have_board pc]} {
|
|
|
|
if {[regexp -- {-m\s+} $qemu_args dummy]} {
|
|
# can be -m 1024 or -m 1024G or -m size=1024G
|
|
set qemu_ram [regexp -inline {\-m\s+\S+} $qemu_args]
|
|
if {![regexp {([0-9]+)([MG]?)} $qemu_ram dummy qemu_ram ram_unit]} {
|
|
puts "Cannot parse memory argument ($qemu_ram)\n"
|
|
exit 1
|
|
}
|
|
|
|
if { $ram_unit == "G" } {
|
|
set qemu_ram [expr {$qemu_ram*1024}] }
|
|
|
|
if {[have_spec okl4]} {
|
|
if {$qemu_ram < 800} {
|
|
puts "Configured memory ($qemu_ram) for OKL4 on Qemu must be at least 800M\n"
|
|
exit 1
|
|
}
|
|
}
|
|
} else {
|
|
##
|
|
# append memory argument if not present, 800M is a sane default because:
|
|
# - 800M is minimum for OKL4
|
|
# - 768M is required for certain test cases (#3387)
|
|
#
|
|
append qemu_args " -m 800 "
|
|
}
|
|
|
|
if {[have_include "load/tftp"]} {
|
|
append qemu_args " -boot n -tftp [run_dir] -bootp boot/pulsar -no-reboot -no-shutdown "
|
|
} else {
|
|
if {[have_include "image/iso"]} {
|
|
append qemu_args " -cdrom [run_dir].iso "
|
|
} else {
|
|
if {[have_include "image/disk"]} {
|
|
append qemu_args " -drive format=raw,file=[run_dir].img "
|
|
} else {
|
|
if {[have_include "image/uefi"]} {
|
|
set uefi_firmware "/usr/share/ovmf/OVMF.fd"
|
|
if {![file exists $uefi_firmware]} {
|
|
puts "'$uefi_firmware' uefi image missing. Please install a ovmf package matching your qemu version."
|
|
exit -3
|
|
}
|
|
append qemu_args " --bios $uefi_firmware -net none -drive format=raw,file=[run_dir].img "
|
|
|
|
# limit boot resolution in Qemu to 1920x1080
|
|
append qemu_args " -device VGA,vgamem_mb=8 "
|
|
} else {
|
|
puts "Aborting, cannot execute Qemu without a ISO or disk image"
|
|
exit -4
|
|
} } } }
|
|
}
|
|
|
|
# on ARM/RISC-V, we supply the boot image as kernel
|
|
if {[have_spec arm] || [have_spec arm_v8] || [have_spec riscv]} {
|
|
append qemu_args " -kernel [run_dir]/boot/image.elf " }
|
|
|
|
set board_qemu_args [board_qemu_args]
|
|
|
|
##
|
|
# remove any -m arguments from qemu args if specified by board_qemu_args
|
|
# note, that we must not match/remove -machine, but allow -m size=1G,slots=3,maxmem=4G
|
|
if {[regexp -- {-m\s+} $board_qemu_args dummy]} {
|
|
regsub -all {\-m\s+\S+} $qemu_args "" qemu_args }
|
|
|
|
##
|
|
# let user override any netdev
|
|
#
|
|
if {[regexp -- {-netdev\s+user,id=(\w+)} $qemu_args dummy netdev]} {
|
|
regsub -all "\\-netdev\\s+user,id=$netdev\\S*" $board_qemu_args "" board_qemu_args }
|
|
|
|
##
|
|
# If -cpu is specified by qemu_args, remove -cpu from board_qemu_args to
|
|
# support overwriting it, e.g. used for virtualization scenarios
|
|
#
|
|
if {[regexp -- {-cpu\s+} $qemu_args dummy]} {
|
|
regsub -all {\-cpu\s+\S*} $board_qemu_args "" board_qemu_args }
|
|
|
|
# append custom board-specific qemu_args
|
|
append qemu_args " $board_qemu_args"
|
|
|
|
eval spawn $qemu $qemu_args
|
|
set qemu_spawn_id $spawn_id
|
|
|
|
# restore original qemu_args to support retrying
|
|
set qemu_args $original_qemu_args
|
|
|
|
return true
|
|
}
|