Virtio 1.0 mostly reuses functionality from the previous version. It
adds a new custom BAR with four capabilities: common configuration,
notification, interrupt, and device configuration.
The common configuration mostly exposes information already available in
the previous version. One difference is that device feature negotiation
is extended from 32 bits to 128 bits. We currently support only 64 bits,
as the upper bits are reserved for future use and are not used by any
existing devices. As suggested by the virtio specification, unsupported
bits are ignored. The negotiation process now has a clearly defined
status model. Another change is that the virtqueue descriptor, available
ring, and used ring are configured using separate guest addresses. This
is provided through six different commands (three addresses, each split
into low and high 32-bit parts). Finally, the device may reduce the
queue size during negotiation. As a result, we record the maximum queue
size from the initial configuration and restore it when rolling back.
The notification capability serves as the doorbell register, equivalent
to VIRTIO_PCI_QUEUE_NOTIFY in the previous PCI transport
specification.
The interrupt capability serves as the interrupt status and
acknowledgment mechanism, similar to VIRTIO_PCI_ISR in the previous
specification.
The device configuration capability provides access to device-specific
configuration data, replacing reads from VIRTIO_PCI_CONFIG_OFF in the
previous version.