[PATCH v3 00/28] Get Xen PV shim running in QEMU, add net & console

David Woodhouse
2023-10-25T14:51:53Z

Round up a handful of outstanding fixes, add console support and fix up
per-vCPU upcall vector support (which was previously untested), and that
allows us to boot PV guests using the Xen "PV shim".

Having fixed up the per-vCPU upcall vector support, pull in slightly
newer Xen headers just for the definition of the CPUID bit that lets
us tell the Linux (6.0+) kernel to use it. That'll help with testing.

v2 of the series added network support for emulated Xen guests by
converting the xen_nic driver to the "new" XenDevice model. That had
been on the TODO list for a while, and having done the console it made
sense to do network too while I still remembered it all.

But then there was a bit more breakage to deal with. Even before the
conversion to XenDevice, the xen_nic support was already hosed for
actual Xen PV guests (-m xenfv) because it never actually managed to
connect the Xen network device to a netdev. And net_cleanup() was
freeing the NICs from underneath the device models which own them, which
upsets the devices that actually do their own cleanup.

Simplify the user experience for "-device file=IMAGE,if=xen" because
that had been offending me for a while, and now I knew how to do that
too.

Update the documentation, and take the opportunity to fix up that bit
about unplug not working on Q35, because I *also* worked out how to do
that when heckling Joel's attempt to do so.

v3 of the series includes more cleanups to the -nic option handling,
allowing me to ditch some of the ugly special cases for registering
the Xen network device for xenfv vs. pc platforms, and replace it with
a simple "register all NICs on this bus" which PCI can use too. That
was seen in a 45-patch series all of its own, but now I've pulled in
just the basic part that's needed for Xen support, and the remaining
bombing run on all the platforms can wait; I won't spam the list with
the rest of that again just yet.

David Woodhouse (28):
i386/xen: Don't advertise XENFEAT_supervisor_mode_kernel
i386/xen: fix per-vCPU upcall vector for Xen emulation
hw/xen: select kernel mode for per-vCPU event channel upcall vector
hw/xen: don't clear map_track[] in xen_gnttab_reset()
hw/xen: fix XenStore watch delivery to guest
hw/xen: take iothread mutex in xen_evtchn_reset_op()
hw/xen: use correct default protocol for xen-block on x86
i386/xen: Ignore VCPU_SSHOTTMR_future flag in set_singleshot_timer()
hw/xen: Clean up event channel 'type_val' handling to use union
include: update Xen public headers to Xen 4.17.2 release
i386/xen: advertise XEN_HVM_CPUID_UPCALL_VECTOR in CPUID
hw/xen: populate store frontend nodes with XenStore PFN/port
hw/xen: automatically assign device index to block devices
hw/xen: add get_frontend_path() method to XenDeviceClass
hw/xen: do not repeatedly try to create a failing backend device
hw/xen: update Xen console to XenDevice model
hw/xen: add support for Xen primary console in emulated mode
hw/xen: only remove peers of PCI NICs on unplug
hw/xen: update Xen PV NIC to XenDevice model
net: do not delete nics in net_cleanup()
xen-platform: unplug AHCI disks
net: add qemu_{configure,create}_nic_device(), qemu_find_nic_info()
net: report list of available models according to platform
net: add qemu_create_nic_bus_devices()
hw/pci: add pci_init_nic_devices(), pci_init_nic_in_slot()
hw/i386/pc: use qemu_get_nic_info() and pci_init_nic_devices()
hw/xen: use qemu_create_nic_bus_devices() to instantiate Xen NICs
docs: update Xen-on-KVM documentation

MAINTAINERS | 2 +-
blockdev.c | 15 +-
docs/system/i386/xen.rst | 100 +++--
hw/block/xen-block.c | 44 +-
hw/char/trace-events | 8 +
hw/char/xen_console.c | 572 +++++++++++++++++++------
hw/i386/kvm/meson.build | 1 +
hw/i386/kvm/trace-events | 2 +
hw/i386/kvm/xen-stubs.c | 8 +
hw/i386/kvm/xen_evtchn.c | 158 ++++---
hw/i386/kvm/xen_gnttab.c | 7 +-
hw/i386/kvm/xen_primary_console.c | 193 +++++++++
hw/i386/kvm/xen_primary_console.h | 23 +
hw/i386/kvm/xen_xenstore.c | 31 +-
hw/i386/pc.c | 21 +-
hw/i386/xen/xen_platform.c | 77 ++--
hw/net/meson.build | 2 +-
hw/net/trace-events | 11 +
hw/net/xen_nic.c | 484 ++++++++++++++++-----
hw/pci/pci.c | 45 ++
hw/xen/xen-backend.c | 27 +-
hw/xen/xen-bus.c | 23 +-
hw/xen/xen-legacy-backend.c | 1 -
hw/xen/xen_devconfig.c | 53 ---
hw/xenpv/xen_machine_pv.c | 19 -
include/hw/net/ne2000-isa.h | 2 -
include/hw/pci/pci.h | 4 +-
include/hw/xen/interface/arch-arm.h | 37 +-
include/hw/xen/interface/arch-x86/cpuid.h | 31 +-
include/hw/xen/interface/arch-x86/xen-x86_32.h | 19 +-
include/hw/xen/interface/arch-x86/xen-x86_64.h | 19 +-
include/hw/xen/interface/arch-x86/xen.h | 26 +-
include/hw/xen/interface/event_channel.h | 19 +-
include/hw/xen/interface/features.h | 19 +-
include/hw/xen/interface/grant_table.h | 19 +-
include/hw/xen/interface/hvm/hvm_op.h | 19 +-
include/hw/xen/interface/hvm/params.h | 19 +-
include/hw/xen/interface/io/blkif.h | 27 +-
include/hw/xen/interface/io/console.h | 19 +-
include/hw/xen/interface/io/fbif.h | 19 +-
include/hw/xen/interface/io/kbdif.h | 19 +-
include/hw/xen/interface/io/netif.h | 25 +-
include/hw/xen/interface/io/protocols.h | 19 +-
include/hw/xen/interface/io/ring.h | 49 +--
include/hw/xen/interface/io/usbif.h | 19 +-
include/hw/xen/interface/io/xenbus.h | 19 +-
include/hw/xen/interface/io/xs_wire.h | 36 +-
include/hw/xen/interface/memory.h | 30 +-
include/hw/xen/interface/physdev.h | 23 +-
include/hw/xen/interface/sched.h | 19 +-
include/hw/xen/interface/trace.h | 19 +-
include/hw/xen/interface/vcpu.h | 19 +-
include/hw/xen/interface/version.h | 19 +-
include/hw/xen/interface/xen-compat.h | 19 +-
include/hw/xen/interface/xen.h | 19 +-
include/hw/xen/xen-backend.h | 1 +
include/hw/xen/xen-bus.h | 3 +
include/hw/xen/xen-legacy-backend.h | 2 -
include/net/net.h | 10 +-
include/sysemu/kvm_xen.h | 1 +
net/net.c | 226 +++++++++-
target/i386/kvm/kvm.c | 4 +
target/i386/kvm/xen-emu.c | 59 ++-
63 files changed, 1851 insertions(+), 1033 deletions(-)