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 accel = "kvm" 66166d4346SAndrea Bolognani gic-version = "host" 67166d4346SAndrea Bolognani 68166d4346SAndrea Bolognani[memory] 69166d4346SAndrea Bolognani size = "1024" 70166d4346SAndrea Bolognani 71166d4346SAndrea Bolognani 72166d4346SAndrea Bolognani# Firmware configuration 73166d4346SAndrea Bolognani# ========================================================= 74166d4346SAndrea Bolognani# 75166d4346SAndrea Bolognani# There are two parts to the firmware: a read-only image 76166d4346SAndrea Bolognani# containing the executable code, which is shared between 77166d4346SAndrea Bolognani# guests, and a read/write variable store that is owned 78166d4346SAndrea Bolognani# by one specific guest, exclusively, and is used to 79166d4346SAndrea Bolognani# record information such as the UEFI boot order. 80166d4346SAndrea Bolognani# 81166d4346SAndrea Bolognani# For any new guest, its permanent, private variable store 82166d4346SAndrea Bolognani# should initially be copied from the template file 83166d4346SAndrea Bolognani# provided along with the firmware binary. 84166d4346SAndrea Bolognani# 85166d4346SAndrea Bolognani# Depending on the OS distribution you're using on the 86166d4346SAndrea Bolognani# host, the name of the package containing the firmware 87166d4346SAndrea Bolognani# binary and variable store template, as well as the paths 88166d4346SAndrea Bolognani# to the files themselves, will be different. For example: 89166d4346SAndrea Bolognani# 90166d4346SAndrea Bolognani# Fedora 91166d4346SAndrea Bolognani# edk2-aarch64 (pkg) 92166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw (bin) 93166d4346SAndrea Bolognani# /usr/share/edk2/aarch64/vars-template-pflash.raw (var) 94166d4346SAndrea Bolognani# 95166d4346SAndrea Bolognani# RHEL 96166d4346SAndrea Bolognani# AAVMF (pkg) 97166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 98166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 99166d4346SAndrea Bolognani# 100166d4346SAndrea Bolognani# Debian/Ubuntu 101166d4346SAndrea Bolognani# qemu-efi (pkg) 102166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_CODE.fd (bin) 103166d4346SAndrea Bolognani# /usr/share/AAVMF/AAVMF_VARS.fd (var) 104166d4346SAndrea Bolognani 105166d4346SAndrea Bolognani[drive "uefi-binary"] 106166d4346SAndrea Bolognani file = "/usr/share/AAVMF/AAVMF_CODE.fd" # CHANGE ME 107166d4346SAndrea Bolognani format = "raw" 108166d4346SAndrea Bolognani if = "pflash" 109166d4346SAndrea Bolognani unit = "0" 110166d4346SAndrea Bolognani readonly = "on" 111166d4346SAndrea Bolognani 112166d4346SAndrea Bolognani[drive "uefi-varstore"] 113166d4346SAndrea Bolognani file = "guest_VARS.fd" # CHANGE ME 114166d4346SAndrea Bolognani format = "raw" 115166d4346SAndrea Bolognani if = "pflash" 116166d4346SAndrea Bolognani unit = "1" 117166d4346SAndrea Bolognani 118166d4346SAndrea Bolognani 119166d4346SAndrea Bolognani# PCI bridge (PCI Express Root Ports) 120166d4346SAndrea Bolognani# ========================================================= 121166d4346SAndrea Bolognani# 122166d4346SAndrea Bolognani# We create eight PCI Express Root Ports, and we plug them 123166d4346SAndrea Bolognani# all into separate functions of the same slot. Some of 124166d4346SAndrea Bolognani# them will be used by devices, the rest will remain 125166d4346SAndrea Bolognani# available for hotplug. 126166d4346SAndrea Bolognani 127166d4346SAndrea Bolognani[device "pcie.1"] 128166d4346SAndrea Bolognani driver = "pcie-root-port" 129166d4346SAndrea Bolognani bus = "pcie.0" 130166d4346SAndrea Bolognani addr = "1c.0" 131166d4346SAndrea Bolognani port = "1" 132166d4346SAndrea Bolognani chassis = "1" 133166d4346SAndrea Bolognani multifunction = "on" 134166d4346SAndrea Bolognani 135166d4346SAndrea Bolognani[device "pcie.2"] 136166d4346SAndrea Bolognani driver = "pcie-root-port" 137166d4346SAndrea Bolognani bus = "pcie.0" 138166d4346SAndrea Bolognani addr = "1c.1" 139166d4346SAndrea Bolognani port = "2" 140166d4346SAndrea Bolognani chassis = "2" 141166d4346SAndrea Bolognani 142166d4346SAndrea Bolognani[device "pcie.3"] 143166d4346SAndrea Bolognani driver = "pcie-root-port" 144166d4346SAndrea Bolognani bus = "pcie.0" 145166d4346SAndrea Bolognani addr = "1c.2" 146166d4346SAndrea Bolognani port = "3" 147166d4346SAndrea Bolognani chassis = "3" 148166d4346SAndrea Bolognani 149166d4346SAndrea Bolognani[device "pcie.4"] 150166d4346SAndrea Bolognani driver = "pcie-root-port" 151166d4346SAndrea Bolognani bus = "pcie.0" 152166d4346SAndrea Bolognani addr = "1c.3" 153166d4346SAndrea Bolognani port = "4" 154166d4346SAndrea Bolognani chassis = "4" 155166d4346SAndrea Bolognani 156166d4346SAndrea Bolognani[device "pcie.5"] 157166d4346SAndrea Bolognani driver = "pcie-root-port" 158166d4346SAndrea Bolognani bus = "pcie.0" 159166d4346SAndrea Bolognani addr = "1c.4" 160166d4346SAndrea Bolognani port = "5" 161166d4346SAndrea Bolognani chassis = "5" 162166d4346SAndrea Bolognani 163166d4346SAndrea Bolognani[device "pcie.6"] 164166d4346SAndrea Bolognani driver = "pcie-root-port" 165166d4346SAndrea Bolognani bus = "pcie.0" 166166d4346SAndrea Bolognani addr = "1c.5" 167166d4346SAndrea Bolognani port = "6" 168166d4346SAndrea Bolognani chassis = "6" 169166d4346SAndrea Bolognani 170166d4346SAndrea Bolognani[device "pcie.7"] 171166d4346SAndrea Bolognani driver = "pcie-root-port" 172166d4346SAndrea Bolognani bus = "pcie.0" 173166d4346SAndrea Bolognani addr = "1c.6" 174166d4346SAndrea Bolognani port = "7" 175166d4346SAndrea Bolognani chassis = "7" 176166d4346SAndrea Bolognani 177166d4346SAndrea Bolognani[device "pcie.8"] 178166d4346SAndrea Bolognani driver = "pcie-root-port" 179166d4346SAndrea Bolognani bus = "pcie.0" 180166d4346SAndrea Bolognani addr = "1c.7" 181166d4346SAndrea Bolognani port = "8" 182166d4346SAndrea Bolognani chassis = "8" 183166d4346SAndrea Bolognani 184166d4346SAndrea Bolognani 185166d4346SAndrea Bolognani# SCSI storage controller (and storage) 186166d4346SAndrea Bolognani# ========================================================= 187166d4346SAndrea Bolognani# 188166d4346SAndrea Bolognani# We use virtio-scsi here so that we can (hot)plug a large 189166d4346SAndrea Bolognani# number of disks without running into issues; a SCSI disk, 190166d4346SAndrea Bolognani# backed by a qcow2 disk image on the host's filesystem, is 191166d4346SAndrea Bolognani# attached to it. 192166d4346SAndrea Bolognani# 193166d4346SAndrea Bolognani# We also create an optical disk, mostly for installation 194*9277d81fSVille Skyttä# purposes: once the guest OS has been successfully 195166d4346SAndrea Bolognani# installed, the guest will no longer boot from optical 196166d4346SAndrea Bolognani# media. If you don't want, or no longer want, to have an 197166d4346SAndrea Bolognani# optical disk in the guest you can safely comment out 198166d4346SAndrea Bolognani# all relevant sections below. 199166d4346SAndrea Bolognani 200166d4346SAndrea Bolognani[device "scsi"] 201166d4346SAndrea Bolognani driver = "virtio-scsi-pci" 202166d4346SAndrea Bolognani bus = "pcie.1" 203166d4346SAndrea Bolognani addr = "00.0" 204166d4346SAndrea Bolognani 205166d4346SAndrea Bolognani[device "scsi-disk"] 206166d4346SAndrea Bolognani driver = "scsi-hd" 207166d4346SAndrea Bolognani bus = "scsi.0" 208166d4346SAndrea Bolognani drive = "disk" 209166d4346SAndrea Bolognani bootindex = "1" 210166d4346SAndrea Bolognani 211166d4346SAndrea Bolognani[drive "disk"] 212166d4346SAndrea Bolognani file = "guest.qcow2" # CHANGE ME 213166d4346SAndrea Bolognani format = "qcow2" 214166d4346SAndrea Bolognani if = "none" 215166d4346SAndrea Bolognani 216166d4346SAndrea Bolognani[device "scsi-optical-disk"] 217166d4346SAndrea Bolognani driver = "scsi-cd" 218166d4346SAndrea Bolognani bus = "scsi.0" 219166d4346SAndrea Bolognani drive = "optical-disk" 220166d4346SAndrea Bolognani bootindex = "2" 221166d4346SAndrea Bolognani 222166d4346SAndrea Bolognani[drive "optical-disk"] 223166d4346SAndrea Bolognani file = "install.iso" # CHANGE ME 224166d4346SAndrea Bolognani format = "raw" 225166d4346SAndrea Bolognani if = "none" 226166d4346SAndrea Bolognani 227166d4346SAndrea Bolognani 228166d4346SAndrea Bolognani# Ethernet controller 229166d4346SAndrea Bolognani# ========================================================= 230166d4346SAndrea Bolognani# 231166d4346SAndrea Bolognani# We use virtio-net for improved performance over emulated 232166d4346SAndrea Bolognani# hardware; on the host side, we take advantage of user 233166d4346SAndrea Bolognani# networking so that the QEMU process doesn't require any 234166d4346SAndrea Bolognani# additional privileges. 235166d4346SAndrea Bolognani 236166d4346SAndrea Bolognani[netdev "hostnet"] 237166d4346SAndrea Bolognani type = "user" 238166d4346SAndrea Bolognani 239166d4346SAndrea Bolognani[device "net"] 240166d4346SAndrea Bolognani driver = "virtio-net-pci" 241166d4346SAndrea Bolognani netdev = "hostnet" 242166d4346SAndrea Bolognani bus = "pcie.2" 243166d4346SAndrea Bolognani addr = "00.0" 244