1166d4346SAndrea Bolognani# mach-virt - VirtIO guest (serial console) 2166d4346SAndrea Bolognani# ========================================================= 3166d4346SAndrea Bolognani# 4166d4346SAndrea Bolognani# Usage: 5166d4346SAndrea Bolognani# 6166d4346SAndrea Bolognani# $ qemu-system-aarch64 \ 7166d4346SAndrea Bolognani# -nodefaults \ 8166d4346SAndrea Bolognani# -readconfig mach-virt-serial.cfg \ 9166d4346SAndrea Bolognani# -display none -serial mon:stdio \ 10166d4346SAndrea Bolognani# -cpu host 11166d4346SAndrea Bolognani# 12166d4346SAndrea Bolognani# You will probably need to tweak the lines marked as 13166d4346SAndrea Bolognani# CHANGE ME before being able to use this configuration! 14166d4346SAndrea Bolognani# 15166d4346SAndrea Bolognani# The guest will have a selection of VirtIO devices 16166d4346SAndrea Bolognani# tailored towards optimal performance with modern guests, 17166d4346SAndrea Bolognani# and will be accessed through the serial console. 18166d4346SAndrea Bolognani# 19166d4346SAndrea Bolognani# --------------------------------------------------------- 20166d4346SAndrea Bolognani# 21166d4346SAndrea Bolognani# Using -nodefaults is required to have full control over 22166d4346SAndrea Bolognani# the virtual hardware: when it's specified, QEMU will 23166d4346SAndrea Bolognani# populate the board with only the builtin peripherals, 24166d4346SAndrea Bolognani# such as the PL011 UART, plus a PCI Express Root Bus; the 25166d4346SAndrea Bolognani# user will then have to explicitly add further devices. 26166d4346SAndrea Bolognani# 27166d4346SAndrea Bolognani# The PCI Express Root Bus shows up in the guest as: 28166d4346SAndrea Bolognani# 29166d4346SAndrea Bolognani# 00:00.0 Host bridge 30166d4346SAndrea Bolognani# 31166d4346SAndrea Bolognani# This configuration file adds a number of other useful 32166d4346SAndrea Bolognani# devices, more specifically: 33166d4346SAndrea Bolognani# 34166d4346SAndrea Bolognani# 00.1c.* PCI bridge (PCI Express Root Ports) 35166d4346SAndrea Bolognani# 01:00.0 SCSI storage controller 36166d4346SAndrea Bolognani# 02:00.0 Ethernet controller 37166d4346SAndrea Bolognani# 38166d4346SAndrea Bolognani# More information about these devices is available below. 39166d4346SAndrea Bolognani# 40166d4346SAndrea Bolognani# We use '-display none' to prevent QEMU from creating a 41166d4346SAndrea Bolognani# graphical display window, which would serve no use in 42166d4346SAndrea Bolognani# this specific configuration, and '-serial mon:stdio' to 43166d4346SAndrea Bolognani# multiplex the guest's serial console and the QEMU monitor 44166d4346SAndrea Bolognani# to the host's stdio; use 'Ctrl+A h' to learn how to 45166d4346SAndrea Bolognani# switch between the two and more. 46166d4346SAndrea Bolognani 47166d4346SAndrea Bolognani 48166d4346SAndrea Bolognani# Machine options 49166d4346SAndrea Bolognani# ========================================================= 50166d4346SAndrea Bolognani# 51166d4346SAndrea Bolognani# We use the virt machine type and enable KVM acceleration 52166d4346SAndrea Bolognani# for better performance. 53166d4346SAndrea Bolognani# 54166d4346SAndrea Bolognani# Using less than 1 GiB of memory is probably not going to 55166d4346SAndrea Bolognani# yield good performance in the guest, and might even lead 56166d4346SAndrea Bolognani# to obscure boot issues in some cases. 57166d4346SAndrea Bolognani# 58166d4346SAndrea Bolognani# Unfortunately, there is no way to configure the CPU model 59166d4346SAndrea Bolognani# in this file, so it will have to be provided on the 60166d4346SAndrea Bolognani# command line, but we can configure the guest to use the 61166d4346SAndrea Bolognani# same GIC version as the host. 62166d4346SAndrea Bolognani 63166d4346SAndrea Bolognani[machine] 64166d4346SAndrea Bolognani type = "virt" 65166d4346SAndrea Bolognani gic-version = "host" 66166d4346SAndrea Bolognani 67*4477035eSThomas Huth[accel] 68*4477035eSThomas Huth accel = "kvm" 69*4477035eSThomas Huth 70166d4346SAndrea Bolognani[memory] 71166d4346SAndrea Bolognani size = "1024" 72166d4346SAndrea Bolognani 73166d4346SAndrea Bolognani 74166d4346SAndrea Bolognani# Firmware configuration 75166d4346SAndrea Bolognani# ========================================================= 76166d4346SAndrea Bolognani# 77166d4346SAndrea Bolognani# There are two parts to the firmware: a read-only image 78166d4346SAndrea Bolognani# containing the executable code, which is shared between 79166d4346SAndrea Bolognani# guests, and a read/write variable store that is owned 80166d4346SAndrea Bolognani# by one specific guest, exclusively, and is used to 81166d4346SAndrea Bolognani# record information such as the UEFI boot order. 82166d4346SAndrea Bolognani# 83166d4346SAndrea Bolognani# For any new guest, its permanent, private variable store 84166d4346SAndrea Bolognani# should initially be copied from the template file 85166d4346SAndrea Bolognani# provided along with the firmware binary. 86166d4346SAndrea Bolognani# 87166d4346SAndrea Bolognani# Depending on the OS distribution you're using on the 88166d4346SAndrea Bolognani# host, the name of the package containing the firmware 89166d4346SAndrea Bolognani# binary and variable store template, as well as the paths 90166d4346SAndrea Bolognani# to the files themselves, will be different. For example: 91166d4346SAndrea Bolognani# 92166d4346SAndrea Bolognani# Fedora 93166d4346SAndrea Bolognani# edk2-aarch64 (pkg) 94166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw (bin) 95166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/vars-template-pflash.raw (var) 96166d4346SAndrea Bolognani# 97166d4346SAndrea Bolognani# RHEL 98166d4346SAndrea Bolognani# AAVMF (pkg) 99166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 100166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 101166d4346SAndrea Bolognani# 102166d4346SAndrea Bolognani# Debian/Ubuntu 103166d4346SAndrea Bolognani# qemu-efi (pkg) 104166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 105166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 106166d4346SAndrea Bolognani 107166d4346SAndrea Bolognani[drive "uefi-binary"] 108166d4346SAndrea Bolognani file = "/usr/share/AAVMF/AAVMF_CODE.fd" # CHANGE ME 109166d4346SAndrea Bolognani format = "raw" 110166d4346SAndrea Bolognani if = "pflash" 111166d4346SAndrea Bolognani unit = "0" 112166d4346SAndrea Bolognani readonly = "on" 113166d4346SAndrea Bolognani 114166d4346SAndrea Bolognani[drive "uefi-varstore"] 115166d4346SAndrea Bolognani file = "guest_VARS.fd" # CHANGE ME 116166d4346SAndrea Bolognani format = "raw" 117166d4346SAndrea Bolognani if = "pflash" 118166d4346SAndrea Bolognani unit = "1" 119166d4346SAndrea Bolognani 120166d4346SAndrea Bolognani 121166d4346SAndrea Bolognani# PCI bridge (PCI Express Root Ports) 122166d4346SAndrea Bolognani# ========================================================= 123166d4346SAndrea Bolognani# 124166d4346SAndrea Bolognani# We create eight PCI Express Root Ports, and we plug them 125166d4346SAndrea Bolognani# all into separate functions of the same slot. Some of 126166d4346SAndrea Bolognani# them will be used by devices, the rest will remain 127166d4346SAndrea Bolognani# available for hotplug. 128166d4346SAndrea Bolognani 129166d4346SAndrea Bolognani[device "pcie.1"] 130166d4346SAndrea Bolognani driver = "pcie-root-port" 131166d4346SAndrea Bolognani bus = "pcie.0" 132166d4346SAndrea Bolognani addr = "1c.0" 133166d4346SAndrea Bolognani port = "1" 134166d4346SAndrea Bolognani chassis = "1" 135166d4346SAndrea Bolognani multifunction = "on" 136166d4346SAndrea Bolognani 137166d4346SAndrea Bolognani[device "pcie.2"] 138166d4346SAndrea Bolognani driver = "pcie-root-port" 139166d4346SAndrea Bolognani bus = "pcie.0" 140166d4346SAndrea Bolognani addr = "1c.1" 141166d4346SAndrea Bolognani port = "2" 142166d4346SAndrea Bolognani chassis = "2" 143166d4346SAndrea Bolognani 144166d4346SAndrea Bolognani[device "pcie.3"] 145166d4346SAndrea Bolognani driver = "pcie-root-port" 146166d4346SAndrea Bolognani bus = "pcie.0" 147166d4346SAndrea Bolognani addr = "1c.2" 148166d4346SAndrea Bolognani port = "3" 149166d4346SAndrea Bolognani chassis = "3" 150166d4346SAndrea Bolognani 151166d4346SAndrea Bolognani[device "pcie.4"] 152166d4346SAndrea Bolognani driver = "pcie-root-port" 153166d4346SAndrea Bolognani bus = "pcie.0" 154166d4346SAndrea Bolognani addr = "1c.3" 155166d4346SAndrea Bolognani port = "4" 156166d4346SAndrea Bolognani chassis = "4" 157166d4346SAndrea Bolognani 158166d4346SAndrea Bolognani[device "pcie.5"] 159166d4346SAndrea Bolognani driver = "pcie-root-port" 160166d4346SAndrea Bolognani bus = "pcie.0" 161166d4346SAndrea Bolognani addr = "1c.4" 162166d4346SAndrea Bolognani port = "5" 163166d4346SAndrea Bolognani chassis = "5" 164166d4346SAndrea Bolognani 165166d4346SAndrea Bolognani[device "pcie.6"] 166166d4346SAndrea Bolognani driver = "pcie-root-port" 167166d4346SAndrea Bolognani bus = "pcie.0" 168166d4346SAndrea Bolognani addr = "1c.5" 169166d4346SAndrea Bolognani port = "6" 170166d4346SAndrea Bolognani chassis = "6" 171166d4346SAndrea Bolognani 172166d4346SAndrea Bolognani[device "pcie.7"] 173166d4346SAndrea Bolognani driver = "pcie-root-port" 174166d4346SAndrea Bolognani bus = "pcie.0" 175166d4346SAndrea Bolognani addr = "1c.6" 176166d4346SAndrea Bolognani port = "7" 177166d4346SAndrea Bolognani chassis = "7" 178166d4346SAndrea Bolognani 179166d4346SAndrea Bolognani[device "pcie.8"] 180166d4346SAndrea Bolognani driver = "pcie-root-port" 181166d4346SAndrea Bolognani bus = "pcie.0" 182166d4346SAndrea Bolognani addr = "1c.7" 183166d4346SAndrea Bolognani port = "8" 184166d4346SAndrea Bolognani chassis = "8" 185166d4346SAndrea Bolognani 186166d4346SAndrea Bolognani 187166d4346SAndrea Bolognani# SCSI storage controller (and storage) 188166d4346SAndrea Bolognani# ========================================================= 189166d4346SAndrea Bolognani# 190166d4346SAndrea Bolognani# We use virtio-scsi here so that we can (hot)plug a large 191166d4346SAndrea Bolognani# number of disks without running into issues; a SCSI disk, 192166d4346SAndrea Bolognani# backed by a qcow2 disk image on the host's filesystem, is 193166d4346SAndrea Bolognani# attached to it. 194166d4346SAndrea Bolognani# 195166d4346SAndrea Bolognani# We also create an optical disk, mostly for installation 1969277d81fSVille Skyttä# purposes: once the guest OS has been successfully 197166d4346SAndrea Bolognani# installed, the guest will no longer boot from optical 198166d4346SAndrea Bolognani# media. If you don't want, or no longer want, to have an 199166d4346SAndrea Bolognani# optical disk in the guest you can safely comment out 200166d4346SAndrea Bolognani# all relevant sections below. 201166d4346SAndrea Bolognani 202166d4346SAndrea Bolognani[device "scsi"] 203166d4346SAndrea Bolognani driver = "virtio-scsi-pci" 204166d4346SAndrea Bolognani bus = "pcie.1" 205166d4346SAndrea Bolognani addr = "00.0" 206166d4346SAndrea Bolognani 207166d4346SAndrea Bolognani[device "scsi-disk"] 208166d4346SAndrea Bolognani driver = "scsi-hd" 209166d4346SAndrea Bolognani bus = "scsi.0" 210166d4346SAndrea Bolognani drive = "disk" 211166d4346SAndrea Bolognani bootindex = "1" 212166d4346SAndrea Bolognani 213166d4346SAndrea Bolognani[drive "disk"] 214166d4346SAndrea Bolognani file = "guest.qcow2" # CHANGE ME 215166d4346SAndrea Bolognani format = "qcow2" 216166d4346SAndrea Bolognani if = "none" 217166d4346SAndrea Bolognani 218166d4346SAndrea Bolognani[device "scsi-optical-disk"] 219166d4346SAndrea Bolognani driver = "scsi-cd" 220166d4346SAndrea Bolognani bus = "scsi.0" 221166d4346SAndrea Bolognani drive = "optical-disk" 222166d4346SAndrea Bolognani bootindex = "2" 223166d4346SAndrea Bolognani 224166d4346SAndrea Bolognani[drive "optical-disk"] 225166d4346SAndrea Bolognani file = "install.iso" # CHANGE ME 226166d4346SAndrea Bolognani format = "raw" 227166d4346SAndrea Bolognani if = "none" 228166d4346SAndrea Bolognani 229166d4346SAndrea Bolognani 230166d4346SAndrea Bolognani# Ethernet controller 231166d4346SAndrea Bolognani# ========================================================= 232166d4346SAndrea Bolognani# 233166d4346SAndrea Bolognani# We use virtio-net for improved performance over emulated 234166d4346SAndrea Bolognani# hardware; on the host side, we take advantage of user 235166d4346SAndrea Bolognani# networking so that the QEMU process doesn't require any 236166d4346SAndrea Bolognani# additional privileges. 237166d4346SAndrea Bolognani 238166d4346SAndrea Bolognani[netdev "hostnet"] 239166d4346SAndrea Bolognani type = "user" 240166d4346SAndrea Bolognani 241166d4346SAndrea Bolognani[device "net"] 242166d4346SAndrea Bolognani driver = "virtio-net-pci" 243166d4346SAndrea Bolognani netdev = "hostnet" 244166d4346SAndrea Bolognani bus = "pcie.2" 245166d4346SAndrea Bolognani addr = "00.0" 246