genode/tool/run/power_on/qemu
Reto Buerki 47724c68c2 platform_drv/x86: Switch to ECAM/MMCONF
Switch port I/O based PCI config space access to memory-mapped IO.  The
base address of the PCI configuration space is acquired by mapping the
ACPI ROM and reading the first <bdf> node. An exception is thrown if the
first <bdf> node is not for PCI domain zero or if multiple <bdf> nodes
exist. This is to reduce complexity and also because multiple PCI
domains are rare.

The PCI configuration space is accessed via I/O mem dataspace which is
created in the platform_drv root and then passed on to the PCI session,
device components and finally to the actual PCI config access instances.

The memory access code is implemented in a way to make it work with Muen
subject monitor (SM) device emulation and also general x86 targets. On
Muen, the simplified device emulation code (which works also for Linux)
always returns 0xffff in EAX to indicate a non-existing device.
Therefore, EAX is enforced in the assembly templates.

Fixes #2547
2018-03-29 14:59:04 +02:00

139 lines
4.4 KiB
Plaintext

#!/usr/bin/expect
##
# Reset the target machine or rather run the scenario with Qemu
#
source [genode_dir]/tool/run/qemu.inc
proc check_version {qemu_version qemu_min qemu_max} {
set version_min_list [split $qemu_min ".-"]
set version_min_list_len [llength $version_min_list]
set version_max_list [split $qemu_max ".-"]
set version_max_list_len [llength $version_max_list]
set version_list [split $qemu_version ".-"]
set version_list_len [llength $version_list]
set cmp 0
set cmp_min 0
set cmp_max 0
set i 0
foreach number $version_list {
set min 0
set max 0
if { $i < $version_min_list_len } { set min [lindex $version_min_list $i] }
if { $i < $version_max_list_len } { set max [lindex $version_max_list $i] }
set cmp [expr {$cmp + $number * pow(1000, $version_list_len - $i) }]
set cmp_min [expr {$cmp_min + $min * pow(1000, $version_list_len - $i) }]
set cmp_max [expr {$cmp_max + $max * pow(1000, $version_list_len - $i) }]
incr i
}
return [expr {($cmp_min < $cmp) && ($cmp < $cmp_max)}]
}
##
# Execute scenario using Qemu
#
proc run_power_on { } {
global qemu_args
global qemu
global qemu_spawn_id
#
# 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" }
#
# 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 in graphics mode and no
# explicit configuration of serial interfaces is specified in the run
# script. The 'mon' prefix enables the access to the qemu console.
#
if {![regexp -- {-nographic} $qemu_args dummy] &&
![regexp -- {-serial} $qemu_args dummy]} {
append qemu_args " -serial mon:stdio " }
# SVM virtualization is broken after $qemu_good_old and until before $qemu_good_new
# We use "-cpu phenom" when using VMs in Qemu
if {[regexp -- {-cpu phenom} $qemu_args dummy]} {
catch {exec $qemu --version} qemu_version
set qemu_version [regexp -inline {version[ ][0-9]+\.[0-9]+[\.0-9]*} $qemu_version]
set qemu_version [regexp -inline {[0-9]+\.[0-9]+[\.0-9]*} $qemu_version]
set qemu_good_old "2.4.1"
set qemu_good_new "2.8.1"
if {[check_version $qemu_version $qemu_good_old $qemu_good_new]} {
puts "\nYour Qemu version '$qemu_version' is not working with AMD SVM virtualisation"
puts "Known good Qemu versions are until $qemu_good_old and starting with $qemu_good_new\n"
exit
}
}
# tweak emulated platform for specific platforms
if {[have_spec pbxa9]} {
#
# For PBXA9 qemu adjusts provided RAM chips to the -m arg. Thus we
# filter user values and force value that enables all chips that Genode
# expects to be available. Not doing so leads to inexplicable errors.
#
regsub -all {\-m ([0-9])+} $qemu_args "" qemu_args
append qemu_args " -m 768"
append qemu_args " -M realview-pbx-a9"
}
if {[have_spec vpb926]} { append qemu_args " -M versatilepb -m 128 " }
if {[have_spec zynq_qemu]} { append qemu_args " -M xilinx-zynq-a9 -cpu cortex-a9 -m 256 " }
# add devices for specific platforms
if {[have_spec zynq] && [have_spec cadence_gem]} { append qemu_args " -net nic,model=cadence_gem" }
# on x86, we support booting via pxe or iso/disk image
if {[have_spec x86]} {
if {![regexp -- {-m} $qemu_args dummy]} {
append qemu_args " -m 512 "
}
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"]} {
append qemu_args " --bios [genode_dir]/tool/boot/tianocore.bin -net none -drive format=raw,file=[run_dir].img "
} else {
puts "Aborting, cannot execute Qemu without a ISO or disk image"
exit -4
} } } }
append qemu_args " -machine q35 "
}
# on ARM, we supply the boot image as kernel
if {[have_spec arm]} { append qemu_args " -kernel [run_dir]/image.elf " }
eval spawn $qemu $qemu_args
set qemu_spawn_id $spawn_id
return true
}