From 1e385441124a4e8d3b9229ea5d16ac1d04019c49 Mon Sep 17 00:00:00 2001 From: "David B. Kinder" Date: Thu, 4 Oct 2018 16:39:40 -0700 Subject: [PATCH] doc: reorganize HLD docs Reorganize the high-level design docs to align with a work-in-progress HLD document. Migrate previous web content (and images) into the new organization. From here we'll continue inclusion of new design chapters as they're reviewed and edited. Signed-off-by: David B. Kinder --- .../{ACPI-virt-hld.rst => hld/acpi-virt.rst} | 2 +- .../hld-APL_GVT-g.rst} | 0 doc/developer-guides/hld/hld-devicemodel.rst | 10 + .../hld/hld-emulated-devices.rst | 11 + doc/developer-guides/hld/hld-hypervisor.rst | 11 + doc/developer-guides/hld/hld-overview.rst | 4 + .../hld/hld-power-management.rst | 4 + .../hld-security.rst} | 2 +- doc/developer-guides/hld/hld-trace-log.rst | 4 + .../hld-virtio-devices.rst} | 1141 +++++++---------- .../hld/hld-vm-management.rst | 4 + doc/developer-guides/hld/hld-vsbl.rst | 4 + .../{ => hld}/images/APL_GVT-g-DM.png | Bin .../images/APL_GVT-g-access-patterns.png | Bin .../images/APL_GVT-g-api-forwarding.png | Bin .../{ => hld}/images/APL_GVT-g-arch.png | Bin .../images/APL_GVT-g-direct-display.png | Bin .../images/APL_GVT-g-display-virt.png | Bin .../{ => hld}/images/APL_GVT-g-full-pic.png | Bin .../images/APL_GVT-g-graphics-arch.png | Bin .../{ => hld}/images/APL_GVT-g-hyper-dma.png | Bin .../images/APL_GVT-g-indirect-display.png | Bin .../images/APL_GVT-g-interrupt-virt.png | Bin .../images/APL_GVT-g-ive-use-case.png | Bin .../APL_GVT-g-mediated-pass-through.png | Bin .../{ => hld}/images/APL_GVT-g-mem-part.png | Bin .../images/APL_GVT-g-pass-through.png | Bin .../images/APL_GVT-g-per-vm-shadow.png | Bin .../images/APL_GVT-g-perf-critical.png | Bin .../images/APL_GVT-g-plane-based.png | Bin .../images/APL_GVT-g-scheduling-policy.png | Bin .../{ => hld}/images/APL_GVT-g-scheduling.png | Bin .../images/APL_GVT-g-shared-shadow.png | Bin .../{ => hld}/images/APL_GVT-g-workload.png | Bin .../{ => hld}/images/acpi-image1.png | Bin .../{ => hld}/images/acpi-image2.png | Bin .../{ => hld}/images/acpi-image3.png | Bin .../{ => hld}/images/acpi-image5.png | Bin .../{ => hld}/images/interrupt-image2.png | Bin .../{ => hld}/images/interrupt-image3.png | Bin .../{ => hld}/images/interrupt-image4.png | Bin .../{ => hld}/images/interrupt-image5.png | Bin .../{ => hld}/images/interrupt-image6.png | Bin .../{ => hld}/images/interrupt-image7.png | Bin .../{ => hld}/images/mem-image1.png | Bin .../{ => hld}/images/mem-image2.png | Bin .../{ => hld}/images/mem-image3.png | Bin .../{ => hld}/images/mem-image4.png | Bin .../{ => hld}/images/mem-image5.png | Bin .../{ => hld}/images/mem-image6.png | Bin .../{ => hld}/images/mem-image7.png | Bin .../{ => hld}/images/network-virt-arch.png | Bin .../images/network-virt-sos-infrastruct.png | Bin .../{ => hld}/images/security-image1.png | Bin .../{ => hld}/images/security-image10.png | Bin .../{ => hld}/images/security-image11.png | Bin .../{ => hld}/images/security-image12.png | Bin .../{ => hld}/images/security-image13.png | Bin .../{ => hld}/images/security-image14.png | Bin .../{ => hld}/images/security-image2.png | Bin .../{ => hld}/images/security-image3.png | Bin .../{ => hld}/images/security-image4.png | Bin .../{ => hld}/images/security-image5.png | Bin .../{ => hld}/images/security-image6.png | Bin .../{ => hld}/images/security-image7.png | Bin .../{ => hld}/images/security-image8.png | Bin .../{ => hld}/images/security-image9.png | Bin .../{ => hld}/images/uart-image1.png | Bin .../hld/images/virtio-blk-image01.png | Bin 0 -> 145266 bytes .../hld/images/virtio-blk-image02.png | Bin 0 -> 46513 bytes .../{ => hld}/images/virtio-console-arch.png | Bin .../{ => hld}/images/virtio-hld-image0.png | Bin .../{ => hld}/images/virtio-hld-image1.png | Bin .../{ => hld}/images/virtio-hld-image2.png | Bin .../{ => hld}/images/virtio-hld-image3.png | Bin .../{ => hld}/images/virtio-hld-image4.png | Bin .../{ => hld}/images/virtio-hld-image5.png | Bin .../{ => hld}/images/virtio-hld-image6.png | Bin .../{ => hld}/images/virtio-hld-image7.png | Bin .../{ => hld}/images/virtio-hld-image8.png | Bin .../{ => hld}/images/watchdog-image1.png | Bin .../{ => hld}/images/watchdog-image2.png | Bin doc/developer-guides/hld/index.rst | 28 + .../{ => hld}/interrupt-hld.rst | 0 doc/developer-guides/{ => hld}/memmgt-hld.rst | 0 .../uart-virt-hld.rst} | 0 doc/developer-guides/hld/virtio-blk.rst | 107 ++ .../{ => hld}/virtio-console.rst | 7 +- .../virtio-net.rst} | 1081 ++++++++-------- doc/developer-guides/hld/virtio-rnd.rst | 21 + .../{ => hld}/watchdog-hld.rst | 0 doc/developer-guides/index.rst | 35 +- doc/developer-guides/trusty.rst | 6 +- 93 files changed, 1249 insertions(+), 1233 deletions(-) rename doc/developer-guides/{ACPI-virt-hld.rst => hld/acpi-virt.rst} (99%) rename doc/developer-guides/{APL_GVT-g-hld.rst => hld/hld-APL_GVT-g.rst} (100%) create mode 100644 doc/developer-guides/hld/hld-devicemodel.rst create mode 100644 doc/developer-guides/hld/hld-emulated-devices.rst create mode 100644 doc/developer-guides/hld/hld-hypervisor.rst create mode 100644 doc/developer-guides/hld/hld-overview.rst create mode 100644 doc/developer-guides/hld/hld-power-management.rst rename doc/developer-guides/{security-hld.rst => hld/hld-security.rst} (99%) create mode 100644 doc/developer-guides/hld/hld-trace-log.rst rename doc/developer-guides/{virtio-hld.rst => hld/hld-virtio-devices.rst} (75%) create mode 100644 doc/developer-guides/hld/hld-vm-management.rst create mode 100644 doc/developer-guides/hld/hld-vsbl.rst rename doc/developer-guides/{ => hld}/images/APL_GVT-g-DM.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-access-patterns.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-api-forwarding.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-arch.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-direct-display.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-display-virt.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-full-pic.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-graphics-arch.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-hyper-dma.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-indirect-display.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-interrupt-virt.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-ive-use-case.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-mediated-pass-through.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-mem-part.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-pass-through.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-per-vm-shadow.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-perf-critical.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-plane-based.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-scheduling-policy.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-scheduling.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-shared-shadow.png (100%) rename doc/developer-guides/{ => hld}/images/APL_GVT-g-workload.png (100%) rename doc/developer-guides/{ => hld}/images/acpi-image1.png (100%) rename doc/developer-guides/{ => hld}/images/acpi-image2.png (100%) rename doc/developer-guides/{ => hld}/images/acpi-image3.png (100%) rename doc/developer-guides/{ => hld}/images/acpi-image5.png (100%) rename doc/developer-guides/{ => hld}/images/interrupt-image2.png (100%) rename doc/developer-guides/{ => hld}/images/interrupt-image3.png (100%) rename doc/developer-guides/{ => hld}/images/interrupt-image4.png (100%) rename doc/developer-guides/{ => hld}/images/interrupt-image5.png (100%) rename doc/developer-guides/{ => hld}/images/interrupt-image6.png (100%) rename doc/developer-guides/{ => hld}/images/interrupt-image7.png (100%) rename doc/developer-guides/{ => hld}/images/mem-image1.png (100%) rename doc/developer-guides/{ => hld}/images/mem-image2.png (100%) rename doc/developer-guides/{ => hld}/images/mem-image3.png (100%) rename doc/developer-guides/{ => hld}/images/mem-image4.png (100%) rename doc/developer-guides/{ => hld}/images/mem-image5.png (100%) rename doc/developer-guides/{ => hld}/images/mem-image6.png (100%) rename doc/developer-guides/{ => hld}/images/mem-image7.png (100%) rename doc/developer-guides/{ => hld}/images/network-virt-arch.png (100%) rename doc/developer-guides/{ => hld}/images/network-virt-sos-infrastruct.png (100%) rename doc/developer-guides/{ => hld}/images/security-image1.png (100%) rename doc/developer-guides/{ => hld}/images/security-image10.png (100%) rename doc/developer-guides/{ => hld}/images/security-image11.png (100%) rename doc/developer-guides/{ => hld}/images/security-image12.png (100%) rename doc/developer-guides/{ => hld}/images/security-image13.png (100%) rename doc/developer-guides/{ => hld}/images/security-image14.png (100%) rename doc/developer-guides/{ => hld}/images/security-image2.png (100%) rename doc/developer-guides/{ => hld}/images/security-image3.png (100%) rename doc/developer-guides/{ => hld}/images/security-image4.png (100%) rename doc/developer-guides/{ => hld}/images/security-image5.png (100%) rename doc/developer-guides/{ => hld}/images/security-image6.png (100%) rename doc/developer-guides/{ => hld}/images/security-image7.png (100%) rename doc/developer-guides/{ => hld}/images/security-image8.png (100%) rename doc/developer-guides/{ => hld}/images/security-image9.png (100%) rename doc/developer-guides/{ => hld}/images/uart-image1.png (100%) create mode 100644 doc/developer-guides/hld/images/virtio-blk-image01.png create mode 100644 doc/developer-guides/hld/images/virtio-blk-image02.png rename doc/developer-guides/{ => hld}/images/virtio-console-arch.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image0.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image1.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image2.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image3.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image4.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image5.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image6.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image7.png (100%) rename doc/developer-guides/{ => hld}/images/virtio-hld-image8.png (100%) rename doc/developer-guides/{ => hld}/images/watchdog-image1.png (100%) rename doc/developer-guides/{ => hld}/images/watchdog-image2.png (100%) create mode 100644 doc/developer-guides/hld/index.rst rename doc/developer-guides/{ => hld}/interrupt-hld.rst (100%) rename doc/developer-guides/{ => hld}/memmgt-hld.rst (100%) rename doc/developer-guides/{uart-virtualization.rst => hld/uart-virt-hld.rst} (100%) create mode 100644 doc/developer-guides/hld/virtio-blk.rst rename doc/developer-guides/{ => hld}/virtio-console.rst (98%) rename doc/developer-guides/{network-virt-hld.rst => hld/virtio-net.rst} (89%) create mode 100644 doc/developer-guides/hld/virtio-rnd.rst rename doc/developer-guides/{ => hld}/watchdog-hld.rst (100%) diff --git a/doc/developer-guides/ACPI-virt-hld.rst b/doc/developer-guides/hld/acpi-virt.rst similarity index 99% rename from doc/developer-guides/ACPI-virt-hld.rst rename to doc/developer-guides/hld/acpi-virt.rst index c34faa2f0..a154f1429 100644 --- a/doc/developer-guides/ACPI-virt-hld.rst +++ b/doc/developer-guides/hld/acpi-virt.rst @@ -1,4 +1,4 @@ -.. _ACPI-virt-HLD: +.. _acpi-virt-HLD: ACPI Virtualization high-level design ##################################### diff --git a/doc/developer-guides/APL_GVT-g-hld.rst b/doc/developer-guides/hld/hld-APL_GVT-g.rst similarity index 100% rename from doc/developer-guides/APL_GVT-g-hld.rst rename to doc/developer-guides/hld/hld-APL_GVT-g.rst diff --git a/doc/developer-guides/hld/hld-devicemodel.rst b/doc/developer-guides/hld/hld-devicemodel.rst new file mode 100644 index 000000000..cd697f1c7 --- /dev/null +++ b/doc/developer-guides/hld/hld-devicemodel.rst @@ -0,0 +1,10 @@ +.. _hld-devicemodel: + +Device Model high-level design +############################## + + +.. toctree:: + :maxdepth: 1 + + ACPI virtualization diff --git a/doc/developer-guides/hld/hld-emulated-devices.rst b/doc/developer-guides/hld/hld-emulated-devices.rst new file mode 100644 index 000000000..ef9a34de0 --- /dev/null +++ b/doc/developer-guides/hld/hld-emulated-devices.rst @@ -0,0 +1,11 @@ +.. _hld-emulated-devices: + +Emulated Devices high-level design +################################## + +.. toctree:: + :maxdepth: 1 + + GVT-g GPU Virtualization + UART virtualization + Watchdoc virtualization diff --git a/doc/developer-guides/hld/hld-hypervisor.rst b/doc/developer-guides/hld/hld-hypervisor.rst new file mode 100644 index 000000000..c18e1c15b --- /dev/null +++ b/doc/developer-guides/hld/hld-hypervisor.rst @@ -0,0 +1,11 @@ +.. _hld-hypervisor: + +Hypervisor high-level design +############################ + + +.. toctree:: + :maxdepth: 1 + + Memory management + Interrupt management diff --git a/doc/developer-guides/hld/hld-overview.rst b/doc/developer-guides/hld/hld-overview.rst new file mode 100644 index 000000000..9544f1bd3 --- /dev/null +++ b/doc/developer-guides/hld/hld-overview.rst @@ -0,0 +1,4 @@ +.. _hld-overview: + +Overview +######## diff --git a/doc/developer-guides/hld/hld-power-management.rst b/doc/developer-guides/hld/hld-power-management.rst new file mode 100644 index 000000000..61c719c52 --- /dev/null +++ b/doc/developer-guides/hld/hld-power-management.rst @@ -0,0 +1,4 @@ +.. _hld-power-management: + +Power Management high-level design +################################## diff --git a/doc/developer-guides/security-hld.rst b/doc/developer-guides/hld/hld-security.rst similarity index 99% rename from doc/developer-guides/security-hld.rst rename to doc/developer-guides/hld/hld-security.rst index fcc853a93..5b6fd1544 100644 --- a/doc/developer-guides/security-hld.rst +++ b/doc/developer-guides/hld/hld-security.rst @@ -1,4 +1,4 @@ -.. _security-hld: +.. _hld-security: Security high-level design ########################## diff --git a/doc/developer-guides/hld/hld-trace-log.rst b/doc/developer-guides/hld/hld-trace-log.rst new file mode 100644 index 000000000..42d85620f --- /dev/null +++ b/doc/developer-guides/hld/hld-trace-log.rst @@ -0,0 +1,4 @@ +.. _hld-trace-log: + +Tracing and Logging high-level design +##################################### diff --git a/doc/developer-guides/virtio-hld.rst b/doc/developer-guides/hld/hld-virtio-devices.rst similarity index 75% rename from doc/developer-guides/virtio-hld.rst rename to doc/developer-guides/hld/hld-virtio-devices.rst index 6d7b846b6..5bf97766f 100644 --- a/doc/developer-guides/virtio-hld.rst +++ b/doc/developer-guides/hld/hld-virtio-devices.rst @@ -1,642 +1,499 @@ -.. _virtio-hld: - -Virtio high-level design -######################## - -The ACRN Hypervisor follows the `Virtual I/O Device (virtio) -specification -`_ to -realize I/O virtualization for many performance-critical devices -supported in the ACRN project. Adopting the virtio specification lets us -reuse many frontend virtio drivers already available in a Linux-based -User OS, drastically reducing potential development effort for frontend -virtio drivers. To further reduce the development effort of backend -virtio drivers, the hypervisor provides the virtio backend service -(VBS) APIs, that make it very straightforward to implement a virtio -device in the hypervisor. - -The virtio APIs can be divided into 3 groups: DM APIs, virtio backend -service (VBS) APIs, and virtqueue (VQ) APIs, as shown in -:numref:`be-interface`. - -.. figure:: images/virtio-hld-image0.png - :width: 900px - :align: center - :name: be-interface - - ACRN Virtio Backend Service Interface - -- **DM APIs** are exported by the DM, and are mainly used during the - device initialization phase and runtime. The DM APIs also include - PCIe emulation APIs because each virtio device is a PCIe device in - the SOS and UOS. -- **VBS APIs** are mainly exported by the VBS and related modules. - Generally they are callbacks to be - registered into the DM. -- **VQ APIs** are used by a virtio backend device to access and parse - information from the shared memory between the frontend and backend - device drivers. - -Virtio Device -************* - -Virtio framework is the para-virtualization specification that ACRN -follows to implement I/O virtualization of performance-critical -devices such as audio, eAVB/TSN, IPU, and CSMU devices. This section gives -an overview about virtio history, motivation, and advantages, and then -highlights virtio key concepts. Second, this section will describe -ACRN's virtio architectures, and elaborates on ACRN virtio APIs. Finally -this section will introduce all the virtio devices currently supported -by ACRN. - -Introduction -============ - -Virtio is an abstraction layer over devices in a para-virtualized -hypervisor. Virtio was developed by Rusty Russell when he worked at IBM -research to support his lguest hypervisor in 2007, and it quickly became -the de-facto standard for KVM's para-virtualized I/O devices. - -Virtio is very popular for virtual I/O devices because is provides a -straightforward, efficient, standard, and extensible mechanism, and -eliminates the need for boutique, per-environment, or per-OS mechanisms. -For example, rather than having a variety of device emulation -mechanisms, virtio provides a common frontend driver framework that -standardizes device interfaces, and increases code reuse across -different virtualization platforms. - -Given the advantages of virtio, ACRN also follows the virtio -specification. - -Key Concepts -============ - -To better understand virtio, especially its usage in ACRN, we'll -highlight several key virtio concepts important to ACRN: - - -Frontend virtio driver (FE) - Virtio adopts a frontend-backend architecture that enables a simple but - flexible framework for both frontend and backend virtio drivers. The FE - driver merely needs to offer services configure the interface, pass messages, - produce requests, and kick backend virtio driver. As a result, the FE - driver is easy to implement and the performance overhead of emulating - a device is eliminated. - -Backend virtio driver (BE) - Similar to FE driver, the BE driver, running either in user-land or - kernel-land of the host OS, consumes requests from the FE driver and sends them - to the host native device driver. Once the requests are done by the host - native device driver, the BE driver notifies the FE driver that the - request is complete. - - Note: to distinguish BE driver from host native device driver, the host - native device driver is called "native driver" in this document. - -Straightforward: virtio devices as standard devices on existing buses - Instead of creating new device buses from scratch, virtio devices are - built on existing buses. This gives a straightforward way for both FE - and BE drivers to interact with each other. For example, FE driver could - read/write registers of the device, and the virtual device could - interrupt FE driver, on behalf of the BE driver, in case something of - interest is happening. - - Currently virtio supports PCI/PCIe bus and MMIO bus. In ACRN, only - PCI/PCIe bus is supported, and all the virtio devices share the same - vendor ID 0x1AF4. - - Note: For MMIO, the "bus" is a little bit an overstatement since - basically it is a few descriptors describing the devices. - -Efficient: batching operation is encouraged - Batching operation and deferred notification are important to achieve - high-performance I/O, since notification between FE and BE driver - usually involves an expensive exit of the guest. Therefore batching - operating and notification suppression are highly encouraged if - possible. This will give an efficient implementation for - performance-critical devices. - -Standard: virtqueue - All virtio devices share a standard ring buffer and descriptor - mechanism, called a virtqueue, shown in :numref:`virtqueue`. A virtqueue is a - queue of scatter-gather buffers. There are three important methods on - virtqueues: - - - **add_buf** is for adding a request/response buffer in a virtqueue, - - **get_buf** is for getting a response/request in a virtqueue, and - - **kick** is for notifying the other side for a virtqueue to consume buffers. - - The virtqueues are created in guest physical memory by the FE drivers. - BE drivers only need to parse the virtqueue structures to obtain - the requests and process them. How a virtqueue is organized is - specific to the Guest OS. In the Linux implementation of virtio, the - virtqueue is implemented as a ring buffer structure called vring. - - In ACRN, the virtqueue APIs can be leveraged directly so that users - don't need to worry about the details of the virtqueue. (Refer to guest - OS for more details about the virtqueue implementation.) - -.. figure:: images/virtio-hld-image2.png - :width: 900px - :align: center - :name: virtqueue - - Virtqueue - -Extensible: feature bits - A simple extensible feature negotiation mechanism exists for each - virtual device and its driver. Each virtual device could claim its - device specific features while the corresponding driver could respond to - the device with the subset of features the driver understands. The - feature mechanism enables forward and backward compatibility for the - virtual device and driver. - -Virtio Device Modes - The virtio specification defines three modes of virtio devices: - a legacy mode device, a transitional mode device, and a modern mode - device. A legacy mode device is compliant to virtio specification - version 0.95, a transitional mode device is compliant to both - 0.95 and 1.0 spec versions, and a modern mode - device is only compatible to the version 1.0 specification. - - In ACRN, all the virtio devices are transitional devices, meaning that - they should be compatible with both 0.95 and 1.0 versions of virtio - specification. - -Virtio Device Discovery - Virtio devices are commonly implemented as PCI/PCIe devices. A - virtio device using virtio over PCI/PCIe bus must expose an interface to - the Guest OS that meets the PCI/PCIe specifications. - - Conventionally, any PCI device with Vendor ID 0x1AF4, - PCI_VENDOR_ID_REDHAT_QUMRANET, and Device ID 0x1000 through 0x107F - inclusive is a virtio device. Among the Device IDs, the - legacy/transitional mode virtio devices occupy the first 64 IDs ranging - from 0x1000 to 0x103F, while the range 0x1040-0x107F belongs to - virtio modern devices. In addition, the Subsystem Vendor ID should - reflect the PCI/PCIe vendor ID of the environment, and the Subsystem - Device ID indicates which virtio device is supported by the device. - -Virtio Frameworks -================= - -This section describes the overall architecture of virtio, and then -introduce ACRN specific implementations of the virtio framework. - -Architecture ------------- - -Virtio adopts a frontend-backend -architecture, as shown in :numref:`virtio-arch`. Basically the FE and BE driver -communicate with each other through shared memory, via the -virtqueues. The FE driver talks to the BE driver in the same way it -would talk to a real PCIe device. The BE driver handles requests -from the FE driver, and notifies the FE driver if the request has been -processed. - -.. figure:: images/virtio-hld-image1.png - :width: 900px - :align: center - :name: virtio-arch - - Virtio Architecture - -In addition to virtio's frontend-backend architecture, both FE and BE -drivers follow a layered architecture, as shown in -:numref:`virtio-fe-be`. Each -side has three layers: transports, core models, and device types. -All virtio devices share the same virtio infrastructure, including -virtqueues, feature mechanisms, configuration space, and buses. - -.. figure:: images/virtio-hld-image4.png - :width: 900px - :align: center - :name: virtio-fe-be - - Virtio Frontend/Backend Layered Architecture - -Virtio Framework Considerations -------------------------------- - -How to realize the virtio framework is specific to a -hypervisor implementation. In ACRN, the virtio framework implementations -can be classified into two types, virtio backend service in user-land -(VBS-U) and virtio backend service in kernel-land (VBS-K), according to -where the virtio backend service (VBS) is located. Although different in BE -drivers, both VBS-U and VBS-K share the same FE drivers. The reason -behind the two virtio implementations is to meet the requirement of -supporting a large amount of diverse I/O devices in ACRN project. - -When developing a virtio BE device driver, the device owner should choose -carefully between the VBS-U and VBS-K. Generally VBS-U targets -non-performance-critical devices, but enables easy development and -debugging. VBS-K targets performance critical devices. - -The next two sections introduce ACRN's two implementations of the virtio -framework. - -User-Land Virtio Framework --------------------------- - -The architecture of ACRN user-land virtio framework (VBS-U) is shown in -:numref:`virtio-userland`. - -The FE driver talks to the BE driver as if it were talking with a PCIe -device. This means for "control plane", the FE driver could poke device -registers through PIO or MMIO, and the device will interrupt the FE -driver when something happens. For "data plane", the communication -between the FE and BE driver is through shared memory, in the form of -virtqueues. - -On the service OS side where the BE driver is located, there are several -key components in ACRN, including device model (DM), virtio and HV -service module (VHM), VBS-U, and user-level vring service API helpers. - -DM bridges the FE driver and BE driver since each VBS-U module emulates -a PCIe virtio device. VHM bridges DM and the hypervisor by providing -remote memory map APIs and notification APIs. VBS-U accesses the -virtqueue through the user-level vring service API helpers. - -.. figure:: images/virtio-hld-image3.png - :width: 900px - :align: center - :name: virtio-userland - - ACRN User-Land Virtio Framework - -Kernel-Land Virtio Framework ----------------------------- - -The architecture of ACRN kernel-land virtio framework (VBS-K) is shown -in :numref:`virtio-kernelland`. - -VBS-K provides acceleration for performance critical devices emulated by -VBS-U modules by handling the "data plane" of the devices directly in -the kernel. When VBS-K is enabled for certain device, the kernel-land -vring service API helpers are used to access the virtqueues shared by -the FE driver. Compared to VBS-U, this eliminates the overhead of -copying data back-and-forth between user-land and kernel-land within the -service OS, but pays with the extra implementation complexity of the BE -drivers. - -Except for the differences mentioned above, VBS-K still relies on VBS-U -for feature negotiations between FE and BE drivers. This means the -"control plane" of the virtio device still remains in VBS-U. When -feature negotiation is done, which is determined by FE driver setting up -an indicative flag, VBS-K module will be initialized by VBS-U, after -which all request handling will be offloaded to the VBS-K in kernel. - -The FE driver is not aware of how the BE driver is implemented, either -in the VBS-U or VBS-K model. This saves engineering effort regarding FE -driver development. - -.. figure:: images/virtio-hld-image6.png - :width: 900px - :align: center - :name: virtio-kernelland - - ACRN Kernel-Land Virtio Framework - -Virtio APIs -=========== - -This section provides details on the ACRN virtio APIs. As outlined previously, -the ACRN virtio APIs can be divided into three groups: DM_APIs, -VBS_APIs, and VQ_APIs. The following sections will elaborate on -these APIs. - -VBS-U Key Data Structures -------------------------- - -The key data structures for VBS-U are listed as following, and their -relationships are shown in :numref:`VBS-U-data`. - -``struct pci_virtio_blk`` - An example virtio device, such as virtio-blk. -``struct virtio_common`` - A common component to any virtio device. -``struct virtio_ops`` - Virtio specific operation functions for this type of virtio device. -``struct pci_vdev`` - Instance of a virtual PCIe device, and any virtio - device is a virtual PCIe device. -``struct pci_vdev_ops`` - PCIe device's operation functions for this type - of device. -``struct vqueue_info`` - Instance of a virtqueue. - -.. figure:: images/virtio-hld-image5.png - :width: 900px - :align: center - :name: VBS-U-data - - VBS-U Key Data Structures - -Each virtio device is a PCIe device. In addition, each virtio device -could have none or multiple virtqueues, depending on the device type. -The ``struct virtio_common`` is a key data structure to be manipulated by -DM, and DM finds other key data structures through it. The ``struct -virtio_ops`` abstracts a series of virtio callbacks to be provided by -device owner. - -VBS-K Key Data Structures -------------------------- - -The key data structures for VBS-K are listed as follows, and their -relationships are shown in :numref:`VBS-K-data`. - -``struct vbs_k_rng`` - In-kernel VBS-K component handling data plane of a - VBS-U virtio device, for example virtio random_num_generator. -``struct vbs_k_dev`` - In-kernel VBS-K component common to all VBS-K. -``struct vbs_k_vq`` - In-kernel VBS-K component to be working with kernel - vring service API helpers. -``struct vbs_k_dev_inf`` - Virtio device information to be synchronized - from VBS-U to VBS-K kernel module. -``struct vbs_k_vq_info`` - A single virtqueue information to be - synchronized from VBS-U to VBS-K kernel module. -``struct vbs_k_vqs_info`` - Virtqueue(s) information, of a virtio device, - to be synchronized from VBS-U to VBS-K kernel module. - -.. figure:: images/virtio-hld-image8.png - :width: 900px - :align: center - :name: VBS-K-data - - VBS-K Key Data Structures - -In VBS-K, the struct vbs_k_xxx represents the in-kernel component -handling a virtio device's data plane. It presents a char device for VBS-U -to open and register device status after feature negotiation with the FE -driver. - -The device status includes negotiated features, number of virtqueues, -interrupt information, and more. All these status will be synchronized -from VBS-U to VBS-K. In VBS-U, the ``struct vbs_k_dev_info`` and ``struct -vbs_k_vqs_info`` will collect all the information and notify VBS-K through -ioctls. In VBS-K, the ``struct vbs_k_dev`` and ``struct vbs_k_vq``, which are -common to all VBS-K modules, are the counterparts to preserve the -related information. The related information is necessary to kernel-land -vring service API helpers. - -DM APIs -======= - -The DM APIs are exported by DM, and they should be used when realizing -BE device drivers on ACRN. - -[API Material from doxygen comments] - -VBS APIs -======== - -The VBS APIs are exported by VBS related modules, including VBS, DM, and -SOS kernel modules. They can be classified into VBS-U and VBS-K APIs -listed as follows. - -VBS-U APIs ----------- - -These APIs provided by VBS-U are callbacks to be registered to DM, and -the virtio framework within DM will invoke them appropriately. - -[API Material from doxygen comments] - -VBS-K APIs ----------- - -The VBS-K APIs are exported by VBS-K related modules. Users could use -the following APIs to implement their VBS-K modules. - -APIs provided by DM -~~~~~~~~~~~~~~~~~~~ - -[API Material from doxygen comments] - -APIs provided by VBS-K modules in service OS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -VQ APIs -------- - -The virtqueue APIs, or VQ APIs, are used by a BE device driver to -access the virtqueues shared by the FE driver. The VQ APIs abstract the -details of virtqueues so that users don't need to worry about the data -structures within the virtqueues. In addition, the VQ APIs are designed -to be identical between VBS-U and VBS-K, so that users don't need to -learn different APIs when implementing BE drivers based on VBS-U and -VBS-K. - -[API Material from doxygen comments] - -Below is an example showing a typical logic of how a BE driver handles -requests from a FE driver. - -.. code-block:: c - - static void BE_callback(struct pci_virtio_xxx *pv, struct vqueue_info *vq ) { - while (vq_has_descs(vq)) { - vq_getchain(vq, &idx, &iov, 1, NULL); - /* handle requests in iov */ - request_handle_proc(); - /* Release this chain and handle more */ - vq_relchain(vq, idx, len); - } - /* Generate interrupt if appropriate. 1 means ring empty \*/ - vq_endchains(vq, 1); - } - -Current Virtio Devices -====================== - -This section introduces the status of the current virtio devices -supported in ACRN. All the BE virtio drivers are implemented using the -ACRN virtio APIs, and the FE drivers are reusing the standard Linux FE -virtio drivers. For the devices with FE drivers available in the Linux -kernel, they should use standard virtio Vendor ID/Device ID and -Subsystem Vendor ID/Subsystem Device ID. For other devices within ACRN, -their temporary IDs are listed in the following table. - -.. table:: Virtio Devices without existing FE drivers in Linux - :align: center - :name: virtio-device-table - - +--------------+-------------+-------------+-------------+-------------+ - | virtio | Vendor ID | Device ID | Subvendor | Subdevice | - | device | | | ID | ID | - +--------------+-------------+-------------+-------------+-------------+ - | RPMB | 0x8086 | 0x8601 | 0x8086 | 0xFFFF | - +--------------+-------------+-------------+-------------+-------------+ - | HECI | 0x8086 | 0x8602 | 0x8086 | 0xFFFE | - +--------------+-------------+-------------+-------------+-------------+ - | audio | 0x8086 | 0x8603 | 0x8086 | 0xFFFD | - +--------------+-------------+-------------+-------------+-------------+ - | IPU | 0x8086 | 0x8604 | 0x8086 | 0xFFFC | - +--------------+-------------+-------------+-------------+-------------+ - | TSN/AVB | 0x8086 | 0x8605 | 0x8086 | 0xFFFB | - +--------------+-------------+-------------+-------------+-------------+ - | hyper_dmabuf | 0x8086 | 0x8606 | 0x8086 | 0xFFFA | - +--------------+-------------+-------------+-------------+-------------+ - | HDCP | 0x8086 | 0x8607 | 0x8086 | 0xFFF9 | - +--------------+-------------+-------------+-------------+-------------+ - | COREU | 0x8086 | 0x8608 | 0x8086 | 0xFFF8 | - +--------------+-------------+-------------+-------------+-------------+ - -Virtio-rnd -========== - -The virtio-rnd entropy device supplies high-quality randomness for guest -use. The virtio device ID of the virtio-rnd device is 4, and it supports -one virtqueue, the size of which is 64, configurable in the source code. -It has no feature bits defined. - -When the FE driver requires some random bytes, the BE device will place -bytes of random data onto the virtqueue. - -To launch the virtio-rnd device, use the following virtio command:: - - -s ,virtio-rnd - -To verify the correctness in user OS, use the following -command:: - - od /dev/random - -Virtio-blk -========== - -The virtio-blk device is a simple virtual block device. The FE driver -places read, write, and other requests onto the virtqueue, so that the -BE driver can process them accordingly. - -The virtio device ID of the virtio-blk is 2, and it supports one -virtqueue, the size of which is 64, configurable in the source code. The -feature bits supported by the BE device are shown as follows: - -VTBLK_F_SEG_MAX(bit 2) - Maximum number of segments in a request is in seg_max. -VTBLK_F_BLK_SIZE(bit 6) - block size of disk is in blk_size. -VTBLK_F_FLUSH(bit 9) - cache flush command support. -VTBLK_F_TOPOLOGY(bit 10) - device exports information on optimal I/O alignment. - -To use the virtio-blk device, use the following virtio command:: - - -s ,virtio-blk,[,options] - - options: - - writethru: write operation is reported completed only when the - data has been written to physical storage. - - writeback: write operation is reported completed when data is - placed in page cache. Needs to be flushed to the physical storage. - - ro: open file with readonly mode. - - sectorsize: - 1> sectorsize=/ - 2> sectorsize= - default values for sector size and physical sector size are 512 - - range: - range=/ - -Successful booting of the User OS verifies the correctness of the -device. - -Virtio-net -========== - -The virtio-net device is a virtual Ethernet device. The virtio device ID -of the virtio-net is 1, and ACRN's virtio-net device supports twp -virtqueues, one for transmitting packets and the other for receiving -packets. The FE driver places empty buffers onto one virtqueue for -receiving packets, and enqueue outgoing packets onto another virtqueue -for transmission. Currently the size of each virtqueue is 1000, -configurable in the source code. - -To access the external network from user OS, as shown in -:numref:`virtio-network`, a L2 virtual switch should be created in the -service OS, and the BE driver is bonded to a tap/tun device linking -under the L2 virtual switch. - -.. figure:: images/virtio-hld-image7.png - :width: 900px - :align: center - :name: virtio-network - - Virtio-net Accessing External Network - -Currently the feature bits supported by the BE device are shown as -follows: - -VIRTIO_NET_F_MAC(bit 5) - device has given MAC address. -VIRTIO_NET_F_MRG_RXBUF(bit 15) - BE driver can merge receive buffers. -VIRTIO_NET_F_STATUS(bit 16) - configuration status field is available. -VIRTIO_F_NOTIFY_ON_EMPTY(bit 24) - device will issue an interrupt if - it runs out of available descriptors on a virtqueue. - -To enable the virtio-net device, use the following virtio command:: - - -s ,virtio-net, - -To verify the correctness of the device, access the external -network within the user OS. - -Virtio-console -============== - -The virtio-console device is a simple device for data input and output. -The virtio device ID of the virtio-console device is 3. A device could -have one or up to 16 ports in ACRN. Each port has a pair of input and -output virtqueues. A device has a pair of control virtqueues, which are -used to communicate information between the FE and BE drivers. Currently -the size of each virtqueue is 64, configurable in the source code. - -Similar to virtio-net device, two virtqueues specific to a port are -transmitting virtqueue and receiving virtqueue. The FE driver places -empty buffers onto the receiving virtqueue for incoming data, and -enqueues outgoing characters onto transmitting virtqueue. - -Currently the feature bits supported by the BE device are shown as -follows: - -VTCON_F_SIZE(bit 0) - configuration columns and rows are valid. -VTCON_F_MULTIPORT(bit 1) - device supports multiple ports, and control - virtqueues will be used. -VTCON_F_EMERG_WRITE(bit 2) - device supports emergency write. - -To use the virtio-console device, use the following virtio command:: - - -s ,virtio-console,[@]:[=portpath] - -.. note:: - - Here are some notes about the virtio-console device: - - - ``@`` : marks the port as a console port, otherwise it is a normal - virtio serial port - - stdio/tty/pty: tty capable, which means :kbd:`TAB` and :kbd:`BACKSPACE` - are supported as in regular terminals - - When tty are used, please make sure the redirected tty is sleep, e.g. by - "sleep 2d" command, and will not read input from stdin before it is used - by virtio-console to redirect guest output; - - Claiming multiple virtio serial ports as consoles are supported, however - the guest Linux will only use one of them, through "console=hvcN" kernel - parameters, as the hvc. +.. _hld-virtio-devices: +.. _virtio-hld: + +Virtio devices high-level design +################################ + +The ACRN Hypervisor follows the `Virtual I/O Device (virtio) +specification +`_ to +realize I/O virtualization for many performance-critical devices +supported in the ACRN project. Adopting the virtio specification lets us +reuse many frontend virtio drivers already available in a Linux-based +User OS, drastically reducing potential development effort for frontend +virtio drivers. To further reduce the development effort of backend +virtio drivers, the hypervisor provides the virtio backend service +(VBS) APIs, that make it very straightforward to implement a virtio +device in the hypervisor. + +The virtio APIs can be divided into 3 groups: DM APIs, virtio backend +service (VBS) APIs, and virtqueue (VQ) APIs, as shown in +:numref:`be-interface`. + +.. figure:: images/virtio-hld-image0.png + :width: 900px + :align: center + :name: be-interface + + ACRN Virtio Backend Service Interface + +- **DM APIs** are exported by the DM, and are mainly used during the + device initialization phase and runtime. The DM APIs also include + PCIe emulation APIs because each virtio device is a PCIe device in + the SOS and UOS. +- **VBS APIs** are mainly exported by the VBS and related modules. + Generally they are callbacks to be + registered into the DM. +- **VQ APIs** are used by a virtio backend device to access and parse + information from the shared memory between the frontend and backend + device drivers. + +Virtio framework is the para-virtualization specification that ACRN +follows to implement I/O virtualization of performance-critical +devices such as audio, eAVB/TSN, IPU, and CSMU devices. This section gives +an overview about virtio history, motivation, and advantages, and then +highlights virtio key concepts. Second, this section will describe +ACRN's virtio architectures, and elaborates on ACRN virtio APIs. Finally +this section will introduce all the virtio devices currently supported +by ACRN. + +Virtio introduction +******************* + +Virtio is an abstraction layer over devices in a para-virtualized +hypervisor. Virtio was developed by Rusty Russell when he worked at IBM +research to support his lguest hypervisor in 2007, and it quickly became +the de-facto standard for KVM's para-virtualized I/O devices. + +Virtio is very popular for virtual I/O devices because is provides a +straightforward, efficient, standard, and extensible mechanism, and +eliminates the need for boutique, per-environment, or per-OS mechanisms. +For example, rather than having a variety of device emulation +mechanisms, virtio provides a common frontend driver framework that +standardizes device interfaces, and increases code reuse across +different virtualization platforms. + +Given the advantages of virtio, ACRN also follows the virtio +specification. + +Key Concepts +************ + +To better understand virtio, especially its usage in ACRN, we'll +highlight several key virtio concepts important to ACRN: + + +Frontend virtio driver (FE) + Virtio adopts a frontend-backend architecture that enables a simple but + flexible framework for both frontend and backend virtio drivers. The FE + driver merely needs to offer services configure the interface, pass messages, + produce requests, and kick backend virtio driver. As a result, the FE + driver is easy to implement and the performance overhead of emulating + a device is eliminated. + +Backend virtio driver (BE) + Similar to FE driver, the BE driver, running either in user-land or + kernel-land of the host OS, consumes requests from the FE driver and sends them + to the host native device driver. Once the requests are done by the host + native device driver, the BE driver notifies the FE driver that the + request is complete. + + Note: to distinguish BE driver from host native device driver, the host + native device driver is called "native driver" in this document. + +Straightforward: virtio devices as standard devices on existing buses + Instead of creating new device buses from scratch, virtio devices are + built on existing buses. This gives a straightforward way for both FE + and BE drivers to interact with each other. For example, FE driver could + read/write registers of the device, and the virtual device could + interrupt FE driver, on behalf of the BE driver, in case something of + interest is happening. + + Currently virtio supports PCI/PCIe bus and MMIO bus. In ACRN, only + PCI/PCIe bus is supported, and all the virtio devices share the same + vendor ID 0x1AF4. + + Note: For MMIO, the "bus" is a little bit an overstatement since + basically it is a few descriptors describing the devices. + +Efficient: batching operation is encouraged + Batching operation and deferred notification are important to achieve + high-performance I/O, since notification between FE and BE driver + usually involves an expensive exit of the guest. Therefore batching + operating and notification suppression are highly encouraged if + possible. This will give an efficient implementation for + performance-critical devices. + +Standard: virtqueue + All virtio devices share a standard ring buffer and descriptor + mechanism, called a virtqueue, shown in :numref:`virtqueue`. A virtqueue is a + queue of scatter-gather buffers. There are three important methods on + virtqueues: + + - **add_buf** is for adding a request/response buffer in a virtqueue, + - **get_buf** is for getting a response/request in a virtqueue, and + - **kick** is for notifying the other side for a virtqueue to consume buffers. + + The virtqueues are created in guest physical memory by the FE drivers. + BE drivers only need to parse the virtqueue structures to obtain + the requests and process them. How a virtqueue is organized is + specific to the Guest OS. In the Linux implementation of virtio, the + virtqueue is implemented as a ring buffer structure called vring. + + In ACRN, the virtqueue APIs can be leveraged directly so that users + don't need to worry about the details of the virtqueue. (Refer to guest + OS for more details about the virtqueue implementation.) + +.. figure:: images/virtio-hld-image2.png + :width: 900px + :align: center + :name: virtqueue + + Virtqueue + +Extensible: feature bits + A simple extensible feature negotiation mechanism exists for each + virtual device and its driver. Each virtual device could claim its + device specific features while the corresponding driver could respond to + the device with the subset of features the driver understands. The + feature mechanism enables forward and backward compatibility for the + virtual device and driver. + +Virtio Device Modes + The virtio specification defines three modes of virtio devices: + a legacy mode device, a transitional mode device, and a modern mode + device. A legacy mode device is compliant to virtio specification + version 0.95, a transitional mode device is compliant to both + 0.95 and 1.0 spec versions, and a modern mode + device is only compatible to the version 1.0 specification. + + In ACRN, all the virtio devices are transitional devices, meaning that + they should be compatible with both 0.95 and 1.0 versions of virtio + specification. + +Virtio Device Discovery + Virtio devices are commonly implemented as PCI/PCIe devices. A + virtio device using virtio over PCI/PCIe bus must expose an interface to + the Guest OS that meets the PCI/PCIe specifications. + + Conventionally, any PCI device with Vendor ID 0x1AF4, + PCI_VENDOR_ID_REDHAT_QUMRANET, and Device ID 0x1000 through 0x107F + inclusive is a virtio device. Among the Device IDs, the + legacy/transitional mode virtio devices occupy the first 64 IDs ranging + from 0x1000 to 0x103F, while the range 0x1040-0x107F belongs to + virtio modern devices. In addition, the Subsystem Vendor ID should + reflect the PCI/PCIe vendor ID of the environment, and the Subsystem + Device ID indicates which virtio device is supported by the device. + +Virtio Frameworks +***************** + +This section describes the overall architecture of virtio, and then +introduce ACRN specific implementations of the virtio framework. + +Architecture +============ + +Virtio adopts a frontend-backend +architecture, as shown in :numref:`virtio-arch`. Basically the FE and BE driver +communicate with each other through shared memory, via the +virtqueues. The FE driver talks to the BE driver in the same way it +would talk to a real PCIe device. The BE driver handles requests +from the FE driver, and notifies the FE driver if the request has been +processed. + +.. figure:: images/virtio-hld-image1.png + :width: 900px + :align: center + :name: virtio-arch + + Virtio Architecture + +In addition to virtio's frontend-backend architecture, both FE and BE +drivers follow a layered architecture, as shown in +:numref:`virtio-fe-be`. Each +side has three layers: transports, core models, and device types. +All virtio devices share the same virtio infrastructure, including +virtqueues, feature mechanisms, configuration space, and buses. + +.. figure:: images/virtio-hld-image4.png + :width: 900px + :align: center + :name: virtio-fe-be + + Virtio Frontend/Backend Layered Architecture + +Virtio Framework Considerations +=============================== + +How to realize the virtio framework is specific to a +hypervisor implementation. In ACRN, the virtio framework implementations +can be classified into two types, virtio backend service in user-land +(VBS-U) and virtio backend service in kernel-land (VBS-K), according to +where the virtio backend service (VBS) is located. Although different in BE +drivers, both VBS-U and VBS-K share the same FE drivers. The reason +behind the two virtio implementations is to meet the requirement of +supporting a large amount of diverse I/O devices in ACRN project. + +When developing a virtio BE device driver, the device owner should choose +carefully between the VBS-U and VBS-K. Generally VBS-U targets +non-performance-critical devices, but enables easy development and +debugging. VBS-K targets performance critical devices. + +The next two sections introduce ACRN's two implementations of the virtio +framework. + +User-Land Virtio Framework +========================== + +The architecture of ACRN user-land virtio framework (VBS-U) is shown in +:numref:`virtio-userland`. + +The FE driver talks to the BE driver as if it were talking with a PCIe +device. This means for "control plane", the FE driver could poke device +registers through PIO or MMIO, and the device will interrupt the FE +driver when something happens. For "data plane", the communication +between the FE and BE driver is through shared memory, in the form of +virtqueues. + +On the service OS side where the BE driver is located, there are several +key components in ACRN, including device model (DM), virtio and HV +service module (VHM), VBS-U, and user-level vring service API helpers. + +DM bridges the FE driver and BE driver since each VBS-U module emulates +a PCIe virtio device. VHM bridges DM and the hypervisor by providing +remote memory map APIs and notification APIs. VBS-U accesses the +virtqueue through the user-level vring service API helpers. + +.. figure:: images/virtio-hld-image3.png + :width: 900px + :align: center + :name: virtio-userland + + ACRN User-Land Virtio Framework + +Kernel-Land Virtio Framework +============================ + +The architecture of ACRN kernel-land virtio framework (VBS-K) is shown +in :numref:`virtio-kernelland`. + +VBS-K provides acceleration for performance critical devices emulated by +VBS-U modules by handling the "data plane" of the devices directly in +the kernel. When VBS-K is enabled for certain device, the kernel-land +vring service API helpers are used to access the virtqueues shared by +the FE driver. Compared to VBS-U, this eliminates the overhead of +copying data back-and-forth between user-land and kernel-land within the +service OS, but pays with the extra implementation complexity of the BE +drivers. + +Except for the differences mentioned above, VBS-K still relies on VBS-U +for feature negotiations between FE and BE drivers. This means the +"control plane" of the virtio device still remains in VBS-U. When +feature negotiation is done, which is determined by FE driver setting up +an indicative flag, VBS-K module will be initialized by VBS-U, after +which all request handling will be offloaded to the VBS-K in kernel. + +The FE driver is not aware of how the BE driver is implemented, either +in the VBS-U or VBS-K model. This saves engineering effort regarding FE +driver development. + +.. figure:: images/virtio-hld-image6.png + :width: 900px + :align: center + :name: virtio-kernelland + + ACRN Kernel-Land Virtio Framework + +Virtio APIs +*********** + +This section provides details on the ACRN virtio APIs. As outlined previously, +the ACRN virtio APIs can be divided into three groups: DM_APIs, +VBS_APIs, and VQ_APIs. The following sections will elaborate on +these APIs. + +VBS-U Key Data Structures +========================= + +The key data structures for VBS-U are listed as following, and their +relationships are shown in :numref:`VBS-U-data`. + +``struct pci_virtio_blk`` + An example virtio device, such as virtio-blk. +``struct virtio_common`` + A common component to any virtio device. +``struct virtio_ops`` + Virtio specific operation functions for this type of virtio device. +``struct pci_vdev`` + Instance of a virtual PCIe device, and any virtio + device is a virtual PCIe device. +``struct pci_vdev_ops`` + PCIe device's operation functions for this type + of device. +``struct vqueue_info`` + Instance of a virtqueue. + +.. figure:: images/virtio-hld-image5.png + :width: 900px + :align: center + :name: VBS-U-data + + VBS-U Key Data Structures + +Each virtio device is a PCIe device. In addition, each virtio device +could have none or multiple virtqueues, depending on the device type. +The ``struct virtio_common`` is a key data structure to be manipulated by +DM, and DM finds other key data structures through it. The ``struct +virtio_ops`` abstracts a series of virtio callbacks to be provided by +device owner. + +VBS-K Key Data Structures +========================= + +The key data structures for VBS-K are listed as follows, and their +relationships are shown in :numref:`VBS-K-data`. + +``struct vbs_k_rng`` + In-kernel VBS-K component handling data plane of a + VBS-U virtio device, for example virtio random_num_generator. +``struct vbs_k_dev`` + In-kernel VBS-K component common to all VBS-K. +``struct vbs_k_vq`` + In-kernel VBS-K component to be working with kernel + vring service API helpers. +``struct vbs_k_dev_inf`` + Virtio device information to be synchronized + from VBS-U to VBS-K kernel module. +``struct vbs_k_vq_info`` + A single virtqueue information to be + synchronized from VBS-U to VBS-K kernel module. +``struct vbs_k_vqs_info`` + Virtqueue(s) information, of a virtio device, + to be synchronized from VBS-U to VBS-K kernel module. + +.. figure:: images/virtio-hld-image8.png + :width: 900px + :align: center + :name: VBS-K-data + + VBS-K Key Data Structures + +In VBS-K, the struct vbs_k_xxx represents the in-kernel component +handling a virtio device's data plane. It presents a char device for VBS-U +to open and register device status after feature negotiation with the FE +driver. + +The device status includes negotiated features, number of virtqueues, +interrupt information, and more. All these status will be synchronized +from VBS-U to VBS-K. In VBS-U, the ``struct vbs_k_dev_info`` and ``struct +vbs_k_vqs_info`` will collect all the information and notify VBS-K through +ioctls. In VBS-K, the ``struct vbs_k_dev`` and ``struct vbs_k_vq``, which are +common to all VBS-K modules, are the counterparts to preserve the +related information. The related information is necessary to kernel-land +vring service API helpers. + +DM APIs +======= + +The DM APIs are exported by DM, and they should be used when realizing +BE device drivers on ACRN. + +[API Material from doxygen comments] + +VBS APIs +======== + +The VBS APIs are exported by VBS related modules, including VBS, DM, and +SOS kernel modules. They can be classified into VBS-U and VBS-K APIs +listed as follows. + +VBS-U APIs +---------- + +These APIs provided by VBS-U are callbacks to be registered to DM, and +the virtio framework within DM will invoke them appropriately. + +[API Material from doxygen comments] + +VBS-K APIs +---------- + +The VBS-K APIs are exported by VBS-K related modules. Users could use +the following APIs to implement their VBS-K modules. + +APIs provided by DM +~~~~~~~~~~~~~~~~~~~ + +[API Material from doxygen comments] + +APIs provided by VBS-K modules in service OS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +[API Material from doxygen comments] + +VQ APIs +======= + +The virtqueue APIs, or VQ APIs, are used by a BE device driver to +access the virtqueues shared by the FE driver. The VQ APIs abstract the +details of virtqueues so that users don't need to worry about the data +structures within the virtqueues. In addition, the VQ APIs are designed +to be identical between VBS-U and VBS-K, so that users don't need to +learn different APIs when implementing BE drivers based on VBS-U and +VBS-K. + +[API Material from doxygen comments] + +Below is an example showing a typical logic of how a BE driver handles +requests from a FE driver. + +.. code-block:: c + + static void BE_callback(struct pci_virtio_xxx *pv, struct vqueue_info *vq ) { + while (vq_has_descs(vq)) { + vq_getchain(vq, &idx, &iov, 1, NULL); + /* handle requests in iov */ + request_handle_proc(); + /* Release this chain and handle more */ + vq_relchain(vq, idx, len); + } + /* Generate interrupt if appropriate. 1 means ring empty \*/ + vq_endchains(vq, 1); + } + +Supported Virtio Devices +************************ + +All the BE virtio drivers are implemented using the +ACRN virtio APIs, and the FE drivers are reusing the standard Linux FE +virtio drivers. For the devices with FE drivers available in the Linux +kernel, they should use standard virtio Vendor ID/Device ID and +Subsystem Vendor ID/Subsystem Device ID. For other devices within ACRN, +their temporary IDs are listed in the following table. + +.. table:: Virtio Devices without existing FE drivers in Linux + :align: center + :name: virtio-device-table + + +--------------+-------------+-------------+-------------+-------------+ + | virtio | Vendor ID | Device ID | Subvendor | Subdevice | + | device | | | ID | ID | + +--------------+-------------+-------------+-------------+-------------+ + | RPMB | 0x8086 | 0x8601 | 0x8086 | 0xFFFF | + +--------------+-------------+-------------+-------------+-------------+ + | HECI | 0x8086 | 0x8602 | 0x8086 | 0xFFFE | + +--------------+-------------+-------------+-------------+-------------+ + | audio | 0x8086 | 0x8603 | 0x8086 | 0xFFFD | + +--------------+-------------+-------------+-------------+-------------+ + | IPU | 0x8086 | 0x8604 | 0x8086 | 0xFFFC | + +--------------+-------------+-------------+-------------+-------------+ + | TSN/AVB | 0x8086 | 0x8605 | 0x8086 | 0xFFFB | + +--------------+-------------+-------------+-------------+-------------+ + | hyper_dmabuf | 0x8086 | 0x8606 | 0x8086 | 0xFFFA | + +--------------+-------------+-------------+-------------+-------------+ + | HDCP | 0x8086 | 0x8607 | 0x8086 | 0xFFF9 | + +--------------+-------------+-------------+-------------+-------------+ + | COREU | 0x8086 | 0x8608 | 0x8086 | 0xFFF8 | + +--------------+-------------+-------------+-------------+-------------+ + +The following sections introduce the status of virtio devices currently +supported in ACRN. + +.. toctree:: + :maxdepth: 1 + + virtio-blk + virtio-net + virtio-console + virtio-rnd diff --git a/doc/developer-guides/hld/hld-vm-management.rst b/doc/developer-guides/hld/hld-vm-management.rst new file mode 100644 index 000000000..9512315f7 --- /dev/null +++ b/doc/developer-guides/hld/hld-vm-management.rst @@ -0,0 +1,4 @@ +.. _hld-vm-management: + +VM Management high-level design +############################### diff --git a/doc/developer-guides/hld/hld-vsbl.rst b/doc/developer-guides/hld/hld-vsbl.rst new file mode 100644 index 000000000..cd77c99fb --- /dev/null +++ b/doc/developer-guides/hld/hld-vsbl.rst @@ -0,0 +1,4 @@ +.. _hld-vsbl: + +Virtual Slim-Bootloader high-level design +######################################### diff --git a/doc/developer-guides/images/APL_GVT-g-DM.png b/doc/developer-guides/hld/images/APL_GVT-g-DM.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-DM.png rename to doc/developer-guides/hld/images/APL_GVT-g-DM.png diff --git a/doc/developer-guides/images/APL_GVT-g-access-patterns.png b/doc/developer-guides/hld/images/APL_GVT-g-access-patterns.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-access-patterns.png rename to doc/developer-guides/hld/images/APL_GVT-g-access-patterns.png diff --git a/doc/developer-guides/images/APL_GVT-g-api-forwarding.png b/doc/developer-guides/hld/images/APL_GVT-g-api-forwarding.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-api-forwarding.png rename to doc/developer-guides/hld/images/APL_GVT-g-api-forwarding.png diff --git a/doc/developer-guides/images/APL_GVT-g-arch.png b/doc/developer-guides/hld/images/APL_GVT-g-arch.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-arch.png rename to doc/developer-guides/hld/images/APL_GVT-g-arch.png diff --git a/doc/developer-guides/images/APL_GVT-g-direct-display.png b/doc/developer-guides/hld/images/APL_GVT-g-direct-display.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-direct-display.png rename to doc/developer-guides/hld/images/APL_GVT-g-direct-display.png diff --git a/doc/developer-guides/images/APL_GVT-g-display-virt.png b/doc/developer-guides/hld/images/APL_GVT-g-display-virt.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-display-virt.png rename to doc/developer-guides/hld/images/APL_GVT-g-display-virt.png diff --git a/doc/developer-guides/images/APL_GVT-g-full-pic.png b/doc/developer-guides/hld/images/APL_GVT-g-full-pic.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-full-pic.png rename to doc/developer-guides/hld/images/APL_GVT-g-full-pic.png diff --git a/doc/developer-guides/images/APL_GVT-g-graphics-arch.png b/doc/developer-guides/hld/images/APL_GVT-g-graphics-arch.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-graphics-arch.png rename to doc/developer-guides/hld/images/APL_GVT-g-graphics-arch.png diff --git a/doc/developer-guides/images/APL_GVT-g-hyper-dma.png b/doc/developer-guides/hld/images/APL_GVT-g-hyper-dma.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-hyper-dma.png rename to doc/developer-guides/hld/images/APL_GVT-g-hyper-dma.png diff --git a/doc/developer-guides/images/APL_GVT-g-indirect-display.png b/doc/developer-guides/hld/images/APL_GVT-g-indirect-display.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-indirect-display.png rename to doc/developer-guides/hld/images/APL_GVT-g-indirect-display.png diff --git a/doc/developer-guides/images/APL_GVT-g-interrupt-virt.png b/doc/developer-guides/hld/images/APL_GVT-g-interrupt-virt.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-interrupt-virt.png rename to doc/developer-guides/hld/images/APL_GVT-g-interrupt-virt.png diff --git a/doc/developer-guides/images/APL_GVT-g-ive-use-case.png b/doc/developer-guides/hld/images/APL_GVT-g-ive-use-case.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-ive-use-case.png rename to doc/developer-guides/hld/images/APL_GVT-g-ive-use-case.png diff --git a/doc/developer-guides/images/APL_GVT-g-mediated-pass-through.png b/doc/developer-guides/hld/images/APL_GVT-g-mediated-pass-through.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-mediated-pass-through.png rename to doc/developer-guides/hld/images/APL_GVT-g-mediated-pass-through.png diff --git a/doc/developer-guides/images/APL_GVT-g-mem-part.png b/doc/developer-guides/hld/images/APL_GVT-g-mem-part.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-mem-part.png rename to doc/developer-guides/hld/images/APL_GVT-g-mem-part.png diff --git a/doc/developer-guides/images/APL_GVT-g-pass-through.png b/doc/developer-guides/hld/images/APL_GVT-g-pass-through.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-pass-through.png rename to doc/developer-guides/hld/images/APL_GVT-g-pass-through.png diff --git a/doc/developer-guides/images/APL_GVT-g-per-vm-shadow.png b/doc/developer-guides/hld/images/APL_GVT-g-per-vm-shadow.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-per-vm-shadow.png rename to doc/developer-guides/hld/images/APL_GVT-g-per-vm-shadow.png diff --git a/doc/developer-guides/images/APL_GVT-g-perf-critical.png b/doc/developer-guides/hld/images/APL_GVT-g-perf-critical.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-perf-critical.png rename to doc/developer-guides/hld/images/APL_GVT-g-perf-critical.png diff --git a/doc/developer-guides/images/APL_GVT-g-plane-based.png b/doc/developer-guides/hld/images/APL_GVT-g-plane-based.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-plane-based.png rename to doc/developer-guides/hld/images/APL_GVT-g-plane-based.png diff --git a/doc/developer-guides/images/APL_GVT-g-scheduling-policy.png b/doc/developer-guides/hld/images/APL_GVT-g-scheduling-policy.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-scheduling-policy.png rename to doc/developer-guides/hld/images/APL_GVT-g-scheduling-policy.png diff --git a/doc/developer-guides/images/APL_GVT-g-scheduling.png b/doc/developer-guides/hld/images/APL_GVT-g-scheduling.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-scheduling.png rename to doc/developer-guides/hld/images/APL_GVT-g-scheduling.png diff --git a/doc/developer-guides/images/APL_GVT-g-shared-shadow.png b/doc/developer-guides/hld/images/APL_GVT-g-shared-shadow.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-shared-shadow.png rename to doc/developer-guides/hld/images/APL_GVT-g-shared-shadow.png diff --git a/doc/developer-guides/images/APL_GVT-g-workload.png b/doc/developer-guides/hld/images/APL_GVT-g-workload.png similarity index 100% rename from doc/developer-guides/images/APL_GVT-g-workload.png rename to doc/developer-guides/hld/images/APL_GVT-g-workload.png diff --git a/doc/developer-guides/images/acpi-image1.png b/doc/developer-guides/hld/images/acpi-image1.png similarity index 100% rename from doc/developer-guides/images/acpi-image1.png rename to doc/developer-guides/hld/images/acpi-image1.png diff --git a/doc/developer-guides/images/acpi-image2.png b/doc/developer-guides/hld/images/acpi-image2.png similarity index 100% rename from doc/developer-guides/images/acpi-image2.png rename to doc/developer-guides/hld/images/acpi-image2.png diff --git a/doc/developer-guides/images/acpi-image3.png b/doc/developer-guides/hld/images/acpi-image3.png similarity index 100% rename from doc/developer-guides/images/acpi-image3.png rename to doc/developer-guides/hld/images/acpi-image3.png diff --git a/doc/developer-guides/images/acpi-image5.png b/doc/developer-guides/hld/images/acpi-image5.png similarity index 100% rename from doc/developer-guides/images/acpi-image5.png rename to doc/developer-guides/hld/images/acpi-image5.png diff --git a/doc/developer-guides/images/interrupt-image2.png b/doc/developer-guides/hld/images/interrupt-image2.png similarity index 100% rename from doc/developer-guides/images/interrupt-image2.png rename to doc/developer-guides/hld/images/interrupt-image2.png diff --git a/doc/developer-guides/images/interrupt-image3.png b/doc/developer-guides/hld/images/interrupt-image3.png similarity index 100% rename from doc/developer-guides/images/interrupt-image3.png rename to doc/developer-guides/hld/images/interrupt-image3.png diff --git a/doc/developer-guides/images/interrupt-image4.png b/doc/developer-guides/hld/images/interrupt-image4.png similarity index 100% rename from doc/developer-guides/images/interrupt-image4.png rename to doc/developer-guides/hld/images/interrupt-image4.png diff --git a/doc/developer-guides/images/interrupt-image5.png b/doc/developer-guides/hld/images/interrupt-image5.png similarity index 100% rename from doc/developer-guides/images/interrupt-image5.png rename to doc/developer-guides/hld/images/interrupt-image5.png diff --git a/doc/developer-guides/images/interrupt-image6.png b/doc/developer-guides/hld/images/interrupt-image6.png similarity index 100% rename from doc/developer-guides/images/interrupt-image6.png rename to doc/developer-guides/hld/images/interrupt-image6.png diff --git a/doc/developer-guides/images/interrupt-image7.png b/doc/developer-guides/hld/images/interrupt-image7.png similarity index 100% rename from doc/developer-guides/images/interrupt-image7.png rename to doc/developer-guides/hld/images/interrupt-image7.png diff --git a/doc/developer-guides/images/mem-image1.png b/doc/developer-guides/hld/images/mem-image1.png similarity index 100% rename from doc/developer-guides/images/mem-image1.png rename to doc/developer-guides/hld/images/mem-image1.png diff --git a/doc/developer-guides/images/mem-image2.png b/doc/developer-guides/hld/images/mem-image2.png similarity index 100% rename from doc/developer-guides/images/mem-image2.png rename to doc/developer-guides/hld/images/mem-image2.png diff --git a/doc/developer-guides/images/mem-image3.png b/doc/developer-guides/hld/images/mem-image3.png similarity index 100% rename from doc/developer-guides/images/mem-image3.png rename to doc/developer-guides/hld/images/mem-image3.png diff --git a/doc/developer-guides/images/mem-image4.png b/doc/developer-guides/hld/images/mem-image4.png similarity index 100% rename from doc/developer-guides/images/mem-image4.png rename to doc/developer-guides/hld/images/mem-image4.png diff --git a/doc/developer-guides/images/mem-image5.png b/doc/developer-guides/hld/images/mem-image5.png similarity index 100% rename from doc/developer-guides/images/mem-image5.png rename to doc/developer-guides/hld/images/mem-image5.png diff --git a/doc/developer-guides/images/mem-image6.png b/doc/developer-guides/hld/images/mem-image6.png similarity index 100% rename from doc/developer-guides/images/mem-image6.png rename to doc/developer-guides/hld/images/mem-image6.png diff --git a/doc/developer-guides/images/mem-image7.png b/doc/developer-guides/hld/images/mem-image7.png similarity index 100% rename from doc/developer-guides/images/mem-image7.png rename to doc/developer-guides/hld/images/mem-image7.png diff --git a/doc/developer-guides/images/network-virt-arch.png b/doc/developer-guides/hld/images/network-virt-arch.png similarity index 100% rename from doc/developer-guides/images/network-virt-arch.png rename to doc/developer-guides/hld/images/network-virt-arch.png diff --git a/doc/developer-guides/images/network-virt-sos-infrastruct.png b/doc/developer-guides/hld/images/network-virt-sos-infrastruct.png similarity index 100% rename from doc/developer-guides/images/network-virt-sos-infrastruct.png rename to doc/developer-guides/hld/images/network-virt-sos-infrastruct.png diff --git a/doc/developer-guides/images/security-image1.png b/doc/developer-guides/hld/images/security-image1.png similarity index 100% rename from doc/developer-guides/images/security-image1.png rename to doc/developer-guides/hld/images/security-image1.png diff --git a/doc/developer-guides/images/security-image10.png b/doc/developer-guides/hld/images/security-image10.png similarity index 100% rename from doc/developer-guides/images/security-image10.png rename to doc/developer-guides/hld/images/security-image10.png diff --git a/doc/developer-guides/images/security-image11.png b/doc/developer-guides/hld/images/security-image11.png similarity index 100% rename from doc/developer-guides/images/security-image11.png rename to doc/developer-guides/hld/images/security-image11.png diff --git a/doc/developer-guides/images/security-image12.png b/doc/developer-guides/hld/images/security-image12.png similarity index 100% rename from doc/developer-guides/images/security-image12.png rename to doc/developer-guides/hld/images/security-image12.png diff --git a/doc/developer-guides/images/security-image13.png b/doc/developer-guides/hld/images/security-image13.png similarity index 100% rename from doc/developer-guides/images/security-image13.png rename to doc/developer-guides/hld/images/security-image13.png diff --git a/doc/developer-guides/images/security-image14.png b/doc/developer-guides/hld/images/security-image14.png similarity index 100% rename from doc/developer-guides/images/security-image14.png rename to doc/developer-guides/hld/images/security-image14.png diff --git a/doc/developer-guides/images/security-image2.png b/doc/developer-guides/hld/images/security-image2.png similarity index 100% rename from doc/developer-guides/images/security-image2.png rename to doc/developer-guides/hld/images/security-image2.png diff --git a/doc/developer-guides/images/security-image3.png b/doc/developer-guides/hld/images/security-image3.png similarity index 100% rename from doc/developer-guides/images/security-image3.png rename to doc/developer-guides/hld/images/security-image3.png diff --git a/doc/developer-guides/images/security-image4.png b/doc/developer-guides/hld/images/security-image4.png similarity index 100% rename from doc/developer-guides/images/security-image4.png rename to doc/developer-guides/hld/images/security-image4.png diff --git a/doc/developer-guides/images/security-image5.png b/doc/developer-guides/hld/images/security-image5.png similarity index 100% rename from doc/developer-guides/images/security-image5.png rename to doc/developer-guides/hld/images/security-image5.png diff --git a/doc/developer-guides/images/security-image6.png b/doc/developer-guides/hld/images/security-image6.png similarity index 100% rename from doc/developer-guides/images/security-image6.png rename to doc/developer-guides/hld/images/security-image6.png diff --git a/doc/developer-guides/images/security-image7.png b/doc/developer-guides/hld/images/security-image7.png similarity index 100% rename from doc/developer-guides/images/security-image7.png rename to doc/developer-guides/hld/images/security-image7.png diff --git a/doc/developer-guides/images/security-image8.png b/doc/developer-guides/hld/images/security-image8.png similarity index 100% rename from doc/developer-guides/images/security-image8.png rename to doc/developer-guides/hld/images/security-image8.png diff --git a/doc/developer-guides/images/security-image9.png b/doc/developer-guides/hld/images/security-image9.png similarity index 100% rename from doc/developer-guides/images/security-image9.png rename to doc/developer-guides/hld/images/security-image9.png diff --git a/doc/developer-guides/images/uart-image1.png b/doc/developer-guides/hld/images/uart-image1.png similarity index 100% rename from doc/developer-guides/images/uart-image1.png rename to doc/developer-guides/hld/images/uart-image1.png diff --git a/doc/developer-guides/hld/images/virtio-blk-image01.png b/doc/developer-guides/hld/images/virtio-blk-image01.png new file mode 100644 index 0000000000000000000000000000000000000000..b83054707237e3819d52d3d2e80f614a3fabdb1b GIT binary patch literal 145266 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�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 a2a$5nLq4t-Z6QaZ{?_%o*DzNNy#EIwRbHO} literal 0 HcmV?d00001 diff --git a/doc/developer-guides/hld/images/virtio-blk-image02.png b/doc/developer-guides/hld/images/virtio-blk-image02.png new file mode 100644 index 0000000000000000000000000000000000000000..d01581bde06bd6c53404bda26a6ff99e3116a62c GIT binary patch literal 46513 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

E0&kWw;X73PUxm)tjXGl=R#+>o@{ z=VujdA!e^%+$prVlxTgC_d%k@rWeSf9;3$KCwBxNLtI0Vz3d% z^SJ~(c`R{SMRYmo%Gxjc#dp1sdGoQ|uX5R2uW1l{iN=8#d!t1ITGq;~S!C*}x1 zMK==`fgas*$aU_!6VW9x-(ghl)!^SQ!|aZx7eyAj9fz$5;p=g(*LNPDwO?_){82>J zfj#eKT0-_FZ)7#^EaHuly4|F}!pU$(f)2`G@-PY?>e{Q(uJB}xL1oMlrSws+SJif6_Wpj^KHC6(cUh;DpHBE|J5h#$eKc! zNKE_>7RW{e>;UQljN~epvPb(JrTYl#ysR{BUU(S|R?${rF|7NI?ftdF%8Otkn-=t^ zG$7f%$_)NRvoIL#$W`kvA})9Q_xjVhiG&-e&qr)Wmgs)Gg_OQkf{k#|G50SQh8D)Y zI6sNy;luIfwdTWqO8S!r!A<46;1Qak!I}}dS(osWkp=*60F~7sk+wSO0D$XL$S?Wq z_YU|KsQBp-XxrF5v~YHySDT5w^K-CykF%;F54CK6FEBTLf1}QFPYd)=?y?Y~&2ZSa zyu5|n78qk@lhzk2`rb8{hb5(hyN2F|@PO36Vh3RdqdT{Qdymq)H{sg{$A<{?+Muel z3v$(dAkveAM`Czp#IFU-ElzHa#>>;ToJ1(Jm~KNkaVZge?Ie@yc*of?2Nv7KbR-qO zXvE_Sd?kOZ;#QiI_bX)gz=Xy2KlYV#rt>M>=^_hMcuEWQLZLJR9(*|*8;CbozfE4YD=LZ&7=qQ~339vs+cxH`s)vX;SoxmVNut$C%pP9s1ko+0P8=T!>RD-9D8cnk}Tdxv(sdD|#f z5p9}|om}M;Gm`1`tOPclR>~Us<<&=RcM~#Jn);|2t#f=;G?K7S+z1ueh%8^7{n&W! z+D~$$W{$)-lvrAYQ!W`|eA9H#+fZ}}``uAwGzZ(;vv$`%oW$pB*egd%ce14FSfLyM zO+?>%G@hp(Zl7ZmgF1qI$~yWgdw)rfxR=aN6yh;u7LS9qqxc-y5TrFUycuzE$iv77 zx$$r|aL`)(dHnGGarh(`&R4;FQ-(a(h>aG!Ais7Pu%SBNUt`^@|}OB zLHE;YgtG>m8V7iX$j;m{#4!xbI&t$~lb@G{_oLpG)6Ta(UN&1BzEWJT8<&5r{bBcCnN6eLFp94X z^m2u7zYw3sYiiX1*aZ~}@`VQV?8)e0RvI0q5{Jlps&^LbIH<&(93oaaqmVrU`!Ry+dc(RB@#-p-8ru5 zz5es2fidUq$&WHi@|ciwy$Z`O=2TaO{%^$xUVDGD51!5V`jrs^y~!Jt-jS4}gT~4XqjyqX%Wa7(DIy`&{OcITO$@^r6(o3+>oNcu;Ag7)jtq-DVg}9q!0l zVKzk`O?HI!G+J7OK8odTIXnb6#Q%*f|5hUVGwin>T18G6*GZ%?$l_|;KIi_!?qp*T z^<-LyuY6PiU_D*P9&ZvSjRtQEEL__d9fd1uC=HU0rx*d^8i2rHq+#mA{}-pwpv`V~ z4?pIPgWlbiPK&3yfUia?y?pLFV>}AfX3?~xVYI+01EkPQOG3thi6=Xh`^C*s$MG?T zDqKbg)7<%c4}Xdyx?4{&M|muvC_R`!;c;}Z3?p*QZiT-DsC+ z*Xpldp^>^SO0?+#P_t}Iec4{cxzvmVIMM=)FRwa$IqUL>YV2iqv-*7@-}65FM<`&; z_hqBGa_tlTH$8hMd`*T!wbdMw!XI`q**Ol(m>#9FUN&%nKl84WXPg#=PX_5D#xWGV|je){M^8nz74I1NUl@ zE`f`XdNAwrBYFLFX5we8M(UYvdY>>RsSgB)HGbIONYrm99I5mTuCI1{XA z>a@L@h~AO?{+bf1)0njOapxus+v_Ttprw5E_9elvk;AX7MiMG-t$f-YX@mIepHl2G z(perityUh%bE-Y;i*3qST-+EA_FdZ!*i04W)CLqxZ6cIB$_vGI7o+e|8U@s{>81 zgFFp$=qO9>mKWN}y9fpMri#2Wdeby+SETfzPA3$d2wQI4)`kQxL5B$gI22Ytp4Btq zCD(rooQJhh%96GL52MeozDR1FpLe(P!6HA1r^sAz+NR{PBt!-VJ^qo@kK^Z3lVPgs zy_oWuOdm2UmHD&J=z1m7kX0g)kOFk~V@zpdlY!JJW?J*lzr&(FFOa?op5tiE#?EX6 zk-5Q0SY$ZVAc`sPo`M;B6O=%O6q@RAJgC$7hxQm)l*HRp^>I9UO(u*p3Xrs!jxF;H z1(k^lBaM3s-=0qn9rwOEe4E?uhfYV`WEnDZpUW{)yBi_E$qN)VfNBr3wZTU7qQHx_ zR5dC@{bLaCFZCDdz0sCv40{)&mBLJVhPOH|&wGCoY@Pl5&ect`_djYx z(xDS^SU^mNzSKEWcGP(b4Evv~+kCCJ-*T$2#>ddqfaAffnQ3Zv%GeRh{)=^+XLQ^L z_Etf<0~DaTIivry!Ao()Ln66qWq1n=Lkq{)9JRx12R_lFT%E={4WD!b$6(7@!R4wI z@g)*!C}Z^T)XTMb$zhp^a?4J{5mPk%y_&oOFQ5Dm)M(n{k#5y_+81H4^$`^jR#AF} z6({)3aFpk-)L6s``ftU{isziEanY8+U@3aOa6=J3D((po-`cFulvDBS$-hw(N~{yw zgqz4F+1XS{O4mxtL*NS|e|`GI0nAc2okK%WF`X>w;7HvZ-p?;B(vLxPWU+F?+FK`r z;X`g5uOZfJUoH(?_%*RGV>@u*-U5~)`_lUOQgXGAW(;H$tH=y9vq51QghrlVxLCKX z4G*~TBdk%a`hCHdB57nR3uV4;h^4eBP;yLrfjo5!mV8`bJ&>r87K(?}wGbfpYyMHf zZ?JE>&tdek?yk0<(b8782WQIkPK=!=V81{co@s^&4TaUEa~pp6gJNtB#Q=(^#=@*1 z9Xgy{13*VXZG!Sk!`}?NcW)2NYa@Me7|1`*xrFJVZln53WIGBz!?yj88SYPi*Vm6M z%J{yWr|$>MhdtBk%8^tH;&y#N5Ptx1Z?f_-5%?v}@ zm{MKTtP>m$=XrJ24DU`({;CC`ebgpU(UxXWL;)qzf)B|&l*~m3vD)0AR2)^+ixox`lOl z0X5o}6=!XA_nh1N`-U#1WYZXX*qHhqEk1#l_u;=7RHUp%Pv-)?L4GAb*ELBaYxUln zKj8c4s!h~OQI8Aalt;4JjyUWH($Afi+2~ux({hjwcE2bnDipo__6r-yFxJzowq-o4 zbuF~&kC<21(Q3a26607XV%GU`l}oRv|0*cS_;|ccSGN8B9ruMx+kAhq{e-QCN7~CxL{*?JyS*4AUCWIZCezs zlT|^35iu(K6Nd)m8CKVu4UfK}8kK`wHch)#zZGAHSZP5=7ZHj#`?i<-=lfja3OZMegkD+WZ4GnFJ!STlmjbr9D zinB1p)%Cr!#K*9uL;ONs6mR+ApVx;Y$n#^{qCJxHq$L527}%H!nS7@W2`JM9PcKr2 zm@pgA&9M~94b-(;J;rLl{^4G}KA@Ny$?;AB;yG8^0=x98IBLw-T;&O9C#+{(Rl`LM zP0yxE0(Gn+j&E@?yyRsovvGl3_uIph`l5gSru+?sUFtf_X`3UE^EZKj&Jot?0z``PnmxH+Guo*+L=8*q>Ol4h^zr&%z9HH|ywygoF3aLUX6Ks(^ z%m`c)xWayeYfGk*T!aw{{lkVi$pyJROn8z7i~kKKvFl3fJXBTGLs#a9*kcygc$fG}FFDnw zwIF5-lFQ-TG%73-6_y2L(%5qK8H875-O(BiUZ-w0InS&TsO*4WD0G0+N;6~=jKxzi zB2;XP@IK|TT_*li?1yK8cmO<}=h42NZ%xVs>LK`h9Lr;R17HWk5E5}I@>~RG!+^Xh z(=roQ24$q^$H|UnbsP7ddE(gLoBJ4%ge|ASBCzaDeWo~@T^eKTC6dk>InGk9t%?iR zEuH+h<&kwA%LvA|l@o^^W|`$*$OzQi60HDV##ckV!h@4Wmu6r_BNprLS>81}yFSa+ zgr4~5yhxo0Eu2z;fV27$eA6Is9x*U*tP_BXJO*M)Iuo|F32BDy0SOn|WScU=Zws#l zTFxRRB6i1{=u^uwK4OZr*!hI;h0H6de(aoC?=s@b4| zCh2FB-LB~v(c&LHn++`m1WsM8L~|91UzE12DU-z73@7>pxJNYZdO1C(ajTL|0iK37 z9s4wg@oy&j(;R*7qyZU;5aqA@s9A=v!afOGPH{Iqlx|~c99hcvTN;+1t{CG}Ej;gn zEJ1{Ib#_`TKeQylA3c9ylxy=psvO6Gq~XGG7%fb1&Xk@+Sd=F(M>Z^DwUQd7;z!`Y z=`q9q&3Kwo+m>4KG1>~A;$R}7WOn4^WtV0IX?#?Ak4?s~iVPD5fIdbb^#M8A%ctc4 z#NF-L1Zv@RsoX?PNS82t|3Wg;SVLMM#2fNC!D#@<4kWZO5Lf$^O8aM^nc@Xhpm$ZP zpCw0Te94d5CE+?AS56_daHpog(%3;mm*GAP1QokoIuf6Tl^~m0+ z1tqzIGNoT$86x-eHi}D+r~KEO48JkBbt?7)ttIUPTJ@5KdRtZ!HJZ3gZ$#5QfYk2-I>kj*g`<(j{j z*Q7P0==#@LmldMID7#X1pU3WP#lp$(iir7;DnU&8=U9$?AXZG2v;Z*PbY)WF>VdMA zIU}n3Q$gD<3w(LEp^^4-wxTa7EqkGOe=DE)(%~5ocqfIE?QjDX8Qwpl@7BG)NM)Pg zv6|g?w+ItGWStzbQ0dVhk3{=OIa#Ub5}+%63)M6xS9$$d*BJkEhMc1o3z@p@YL-7v zc6o#)c*$pd)l#sLR-M~YDe10cpWV?#Ti5VM4}~&!q;8voqK``~bH|tt)qh-oiZh2? zN0S@OHSg>|I72Jl&L4#zwxSRD!ecMO^;tFIHl39sfMYl!S6dfyK8q{?T727}d+6hs z6Zywk+Ry1?Kg*4$Vz7!>Zy&VXW80pDdGT1zQM(0@_clK380AQGCpwo;;TPr7KGC1> zQGS*LDA-0+xlKc}LeW<=p8!2!xoCaX?Bbgjau>%?iy^WX&Nnv7y|zyQ6k z1BF31UKOugvx;`VAEhGe{?RrcPMo2}pc947+<=qQ!F@L4W`w9Br`1AAa z(;SSS9_;3D*jGxS^f;Xt{r(N>C3wO)0Bhgk|unNU*Nm%D-O!?{>{u_pKI^ zDbB1sGwt`G8dQW4y0&s+&=%O(3lJMMf=?+uu8a)M^7!ND^|UMO4EOuxI5L=The5VM ztx-}OJFy-BUEutHp57W*Du?To=HYq49@(!k=%CBZNmD`D&zkbW)-CgGfA3?UQlk$J z)dUOenawub9ljdJng&yH zKky!^jwoC)t3Q>5lOP+{wZihhKmzwkpIujD1*P4gy~C38irP=1#awePFfA#9WE$iT zy})~#1FMPJRz@(x+FsJJ0tE~ z7;NCP3uaQ>r!4gvW!n_CQT*Wz{Bbz!x%b`bURsX9H8U>qZzUrZ{(i2JFiXcu5 zaox!X)aUt8kU`TZe*>Q)c&7TD(Djk^8vj5xe((3UcvC>4_8p1yBMK%U_C`-F(1s(} zilz)!hLnb!e&I>dr~sxS@OYoY0P+tE30Os0sE%CW1#^s<0@>ieLUcpa#&r)VOra6s;J}3y8&LBCdLT*$3M-l0jk60;1gm3 z?7}yzA;7L-$zQ9BBJUSiC~Sqp)UWnyeaXNz4(>*3OV0K|`hVGeDfs*IB zuqm$8>~s=0-;dAJ@IOYjn;1foO1_RJ#2Ucq{l8d6v6Yr)_>VE z{`Pbqt;A;gc3)3xL(g#RGW}VOI`?SM?V)TAXAX>;A&#wDunVgJ&z4LLdR&4?0stS| zSaKmSlYLJ-yQ$j02HjmX%#eO~yI|&P$}vr9)fh^gmF1ujasvo@s>A~FG;IgqiLc^{9r|Lg)hB=Hd6X7P zp7$WM76n@Ao4c0v>7P-YhY|kMB+OZC+XMqoq_Oh`O5NmssJgarvaO+!C(Cxs(ei9L zTpnkqW=_=ym5c2=;4K>J7rVm?7>OG8T5%Q#vl>{ixUzYQd_XUqs^a9@U!KE!hwq1D zc0QqRx!i&*J)R|N*bdH1xzM+clx+XRQAs15$f%YJl~o7eM3j)IdUQnn^pFW7c&i$dl$y%#YK!c3S^ClAY zr2{%Ke;bFv?MF1Xkvx%r@*+|%GIU$|X+G;C%mIguwjaABQq`&v85)obubZx9P4G@D z-!=>nHHODY?3umzP>rW3A};elT|+-cN&d>P_A$v6##A~#I3D){46QcbM>>AU^=6Lg zYQ^`VU(U+eAoQL8)7QOLPX{8K=s81mgt`U*iq%@oz4u#=)GUHx`@3zWHhsx&Gr~M; zsR}pxmL8(qw)`8Ij;F(a1Y)44x)}ibhqtmr9^kBh2Jk9)zR6PPW4N%90B6P5ev}v<4DJfB4>up(Vc$g|xto@tW&;I+fvu^BZ&(BzG^|EhF0ia1E zK4mILRbjA0g^`W1mf&vuR9U{E z>$qG^A~ZoDh(@#v1j8rSwSc|J)S2engqUmf0$y0j?}Po1=knTW$~l~O>2izhko(G% zJO0|dt%qs6V=u3O%k4r#raruf!#;6gc=~drp{0@Z2?=OBNHwC-{)Yap>IsZ3Z>S7k zCz(A5K!9gj+76@H;;d%rS-6}w*VT&Q_}9Z&l@3_=a1~RA=Ug@H3`{m_$* zZ1l$TVNg{vCl*4dR(PE|e^q9Bl+%8!Bm+}(WLTh1TTF@Q?3zrJ|ML7 zM4Y+c0ls}67+C4<5kG2tq!hkSrLlp?GC##(#*^WtZI&0?{Qxx$S*sEjUDbGru$*BF zjd`}lJ6mLmZ5r~0Ejg~_xQ^PK4Ws03k^Vb3f<&va&xB>_0@Jh#OeCOiBSgx1?ZM7L zP#}OfY4bib!EUi!tM#J4yRirwd6|r9I#b8%qC;N`yJj;39|ieVtMxx}o|_hw<_kfV z!@rbJzLeuj({O(!CcdT&+2NBuHkj@EtvH+nr0k9)Ak~ZQVRWlsMslnfO4vc%KdT$B+SA-2`j^n_?aM`rZ?9bNE- z-DCjbu7JE&`Z__0~=Y{ zXXk$CF2cvweR+Q@RJ_12U{~J+B4{;~s$8hYS`lH*1I`QbJps6tim1?KrLM%`*)`@u zSr-r?N*~FZMA*8FQgP#?VJUOnyeFU_fID@`LMi}AZSUG4sqHFZUj%+DdW&b^H^k&e zLU4i^%}XwLQSY&QGEWnL?V)s#==Lt| znY2gy1)o-Ur~^#=xHP8+N`7OZ%Je*y%f6%hNzGWjSO|{3VK^F%aY!wCDF7IB zsA%d@pL?Cimc>G-A}3qY6SfV4OmOzQRhQAOXV3fyirG{l$_^*)5!U=_^nKJS6i?S` znFGH*R3zHSiDW7DJoUZwn{K z8#5cEK+`ex1!@^utD(*jr&t3eh|`shH#_>w&agQ*!?3BuxNK^Kk0~C!p|J|5oQXzA z$hLu$V~^P;sFY)_R?|Vn*uTlm>Sk4g5S6HjA$X$Yl6Sw|Hu#9gv$8o(-)dlXYCB9r zU?;VRWdP0{=$aSkn+rT8K>z!??<`H;CxAM7NniyNKaiVGNZ4o6UmyCK&fZosDG!Nx zaoQBioHA7Is8W7(t(rZWLUoy?l5OF}wPfv_829Ddv6s1|{&1V*Z1Jrj*)bAvrU?u| zUTCr|TUW*TUgw?8;LYpwpEA07(@w*-Me1dE?iCEv-)m}%uOyJa>;bl_kv6Fg(c>&V z6H^M}wg}}ziaSFTXubA3EMQV`5bDnAB(f8!h)^Ggu9p~zX{a;r>2dP$(707HaMrjT zkxt7g9)+JR3|Is{(}yU-p#0;qJCdyLiFHEoK9HdR)i_bBcRNkrVIV29+W*X=;VNTv zSe#ojXSJ$PC#5i}lQvBrHNvr2kyBjAc2YS`|GiUxNfLGW-c+InfWk*PP9j-z28q?b z*SwDfNKv=m2P%07d$(Izbbd5~4r2xA>#up}Na)cnmm|JTTAUS92n7`Et!g9;yI>?? zy&w38l?NKalmBE(q&{Bm7;esVltv=zdOB=92Ty{*q# zsC4vJo<(gJt0s;`XUJqHE6>E*#<1xTmV2lmC<8rN3P%%Wy^v2c^_v|>EhfR4IVIIsnR81A)A-}7M`pvYbN!6gUVF6Z}mp7imT!Mo5k1|rgc2&Lm_CkK!nr`##{-|xY4`(}grNMh}8@@&kC z+@0pl^7WszH@n(z0f;)W!0HdaLzD~y-WNi{O)*(w#6L=a8zeXn!GC6Leku~$N!zfm zf{+rlPp@NwZ7HS?^@;6**BCTO2yv8O>JZY1rE+A9j5i;&zW-Led3|3nHKE-Q3~se8JY~sh&<@NU{(_C_{7^d8 zz|nQl!6|~R#CVpmlgMgYFsLp@hVbIJ^?-1K)ix!Td#s=S6h~lD^v=zmm&81vHhQg$a>ZoM2kI!B^|oil#-t4&O234n3hnqa z548OOlzs_wLvnW$)rcu5?6 zJAvH3R4akxq*-mh1oWKWP?i(ds4XrGVDNIS&Wc}RVv^Jq6u*$LDc>(+ja#z+dnv53Q8VL4|z)km|AU?>dQd`c=XZ3zk_!}TGbkLpwaE&}P7qw0wZ&F)Kl2Le_M zC(NchrmQ0v4{^z9&kGWZKWZxl%Ix`d!2w0OSg!wyx!ZAe%z63M{73)B={xmBl*nvqi@wSWUQ!TEtp$=hO zp*nUH4kk-}8TLx(K!eN8FAVs!!z!3?9Zc;r78SbB z7qeb=wWAFu>Frk(-6%1}t%|rLJOex5PjW98xpu3c(PTcNs=^HnbNu$pfDR1e1z_xmtX}P2zGR<&ev1w)MaPtl z>`jj80-QFqGH4_1K76_fG-3mpfXY9(hT75-k^VP~09J(p=zFN-1h%@9oUa|*8Rs9# zKsf&$qP}2i2Z@uTkEbt`@{~BilUQQb(l?J?Q6J}xV(mZ}a$Cv$gg|X@Uz$BvIRe_DXdeKV~L<#7hB1B~VEi^FC zm1S^vpMFo|lexVE;>J@N6zsoKKX3|u&Mzq*RO|Pr;k6vl2pOvpeOs6IPvyeJ0{l``8#7{vrF8kkTX|X)M*Ac^*eZzfLo9%c? zv%%+K!Z1(!7LgR`+q&Z4-Ht!!ezcQ zj6nD6%9qn>vB+*f$)xq+c9%K153Q&}d!UJm1h3&fff_=0$| zl?+@X2ZOgL)0qB0FP;zrV5g?l)}1Sx4m?V$AsX;!^IfSpc9V zfv2Gx#+Gwu1n*;I=y{xFtLj1O_y2_azs@D}fQ9M(-@Q#n5F7(cH4tVbp#M0ft?yr* zQM{nKRTNK#zWujr6!^qi3y^2VNs<3pnp^^-BtH71#J+rMp*DD4TD%K{5R&nK23D3> zZ+!8{{@@<)$)KBKC7w2~b3haAkLu0g$F|7UB6mZtig%GEaY{t0yJ{K9u4(P+$Pf3< zwFep8TN&KHAEg`p&1h3^-y1v{Z2glbt~p5ZCL>t?gKb5Xa+-${=a#c_>m$bZL_hbE z0di~MYR6t*#(sd?_Trn!Y%9>xf~UjMcKXP;Xa}T1=4A!+Fz4e9kEwIePd{}ID%{Lj z&@>vWB}AZsAksx}1O+oE8mX-v=E2KqT)A2;`q&!Q@k&gwCYMr3E6HOYtNsN^Vz&j8 zh3Nsjqa~=s&Z*-sf#Tj`+j6&!V4BL)6%;s!?}y`1b6@a8Q>Xz<0EeeumLDAR>W6o+ z2@A6!3!{FtE-V~aU7KJaluo$nu|3u@1K{iDlT*LZ%ke37DY@=(XNtamNcLz4xPpwO z+1|0wiT!s8dwnDOg52M}a)4K?x475^wAS`yq8^*Q9u>^bcO;sJ6zsrGZOXHTXC+gO z32xr2UA<2Ieogr8*Yqw?cju7@tsJf96+r(nB3`-%3fTvjT?$1T&Lr~~=qk5q!O+ub zVje3j0Z2o!cWmRZE4_`qKu(X%&k~w}U^XZ_nPzyOX@I72@u|4IKQa}ahBci~{f81( zX;Omob?1@S%l5NXFD(O@M5m3UXZzKj$*+8^#dN233RVbnR7i*q#$k^3UZ9s5QAv_w zkfg8nsPWDuZIp{NUn{?$oLe39Mn>xA)4R~Ch?yDQFa<8yj&LV2N0x2Ml)<}`NzpR~ z-L?rSH>rx6xPo;3EDau^td4Kcuip%0wrVTi7#?4JPW2D0oe2hr=J5Wl4|el@U`spOM{_I+(o~itkb~{hb7L=HefSL4GF?jqq>7 z#Rq>PpNR?1tDV5!&-CJXpsit^jeURq=0)~Uonze|!NZ|feiM-<0T&0dIxqT{R9lrV z=s*~_-r$Rizh-g>UMOuIW) zsqT)TL6^LBCH~;mK$8b$Rl+W9fv)kky063667R8-no{mR{jn7)Zf*<$=nhy397sS? z3I~aRODjGO5?U*ttn$Vbq8gZ;i!IuxRyYBx{Y%ZU0B0|6dumM27q;Yo_Qw=VUo;1j z=yedt^5&PLA9!~&wrFv|nUgySQ>0_whNKA3f&4>efBHUybdB9AHf5bZIvKq?Qe!6y za*PM{a@jR&vSvI0yrts*yyM<1*LKJ!pI94bT+6^9_6@wLQJ3JEy5#ez+1<@M_?uxo z!$4-iBd7TKWkW`d2HO`C#7WM2aUp@P)0bYoqLblzzOgp&_LONi6j!Rxt$*qIlCW1e zA>BX3!O2SK_WtUI_wl09&#@uI7%d>u70$u{-JFk2} zB+iPDNfWrA$#C!+5ZS5D#cuGWLzs;Tv~1XI@NPHG`+dYxnII|gIypKLip`HqXa@Z6 zjuwS|k%qR%c{VP40UN78=G^f6XfH3`xW~ps3iZRj?v=+<(0i@TP-_8ajs8OC>#00C zrFg&o)6Pcb(Y>}7l^Q4*v zj+xyS?cbKed=QI^4s5E zO6?Exqk{1d1fw~e51hx%1Ft!y{#^1%1spKE57M3Yy#JN|_h$YhL%@SDnD)T#q+#91*o5d9Z>yH9T&#q>WuRQDU%X2 zzG~kTD=ZvBTi1fqi$-pV-JD8=A}Nias2>GomjFp?@vq;jdCyM)EEl7WyZVNeHF{LT zA{K1M&eOX?Cel7rD#wVmo0;vhiV$ZowKUrt#uy ztmpmyY-7fSMOCzOgQt1(X1|MI4%3?g|GDe^%F_Ey@!`=EKmvCtcQ7>{Q$*(T-gP9M zpE-%Zu+RN$P|kVmr&#K>D5_pbpw{*36DPw*x}9bK)R6v*dt`x2E0 z!=Hkey6*r$yVSYs+ves*zHXl#;HsvunvQzxAVB*PzYm#&t#GnI-=!C^R7T%L?VyKK zO8Kzflz&9uMS2oxy(sO`^CV&kxKew|C*Em}=cfm5d$X{J*}P}qK_l~K+rB--re1T< z>XF$CGq&Ajld6;|Lvyx;`Klwk-6>7g%H8lKS`n|NHL=E(6i>IFCo|=g4_Is#4ztfz3Zh_le(>LNnhTUK2EYQw3qE) zE00^6^@~NLTdBg~>yFms_I6ofAek$|(c%sIF8EtmO!7zeE4&hnHEV}6FeFuLJe!kj z;38*&zUzdz-HAHS^p7OGk0IVCOs6UTa+o>8=nducx!Rk~sr-?1$eTVffI->wW-jpP zr;8ZeUbTvhro8Gr?&TmP>CvKV;phBnJ>%-L_if{RuPZ$_js-H#SXHag+gu?>j*$14vxvigE4(;Ebcn$=1`3-H06KjhG zT}FNYR9yulm&NX5+Sk3A)_B4(!2=zd}sS{1$opytRz;A45=3#lDyXAYN{Q~QTd%*Ch|1F90Q)kNgm#CY) z>EM7-(!j~9KS>K>jlgvceSR09s4gPCKZH*XKyJHVXxVWz?Q+_%8?7QYFH(ij8(h1$J=U1V>3xO}#tKvFu;Z0QZ z%hYNclHD%*frYc`%8gXhHquqN2}}?H1i-+9I0z5A}YG^K(2+z7HF_jOE!G!5N@Al7-CFWaXC3>gtpTmtm9A*Nds@d~Xg+o|b@IH{B)CscK zNdP>s^{W^=;h^vdQEGsJ2jN}s{quO{_GO6@P|modVgnU=)eEr3W!F0|-er>>X|`im z4*uhQ_ged{&IK7kUD<|dOM)W+8!lx={q`^Q7DK+mtI~xdQ5QFk#8U;mQz{6DhiKZ@ zpQ6c2`XZ@(>q-Z?-{x!0nV|U1BhSF@kE{=AGT5RNF0CFpQ#$6n^6+|Vp8@ju=J@6x z4-n{MzTcgili!Dac>I%wyOF5Dle5y`7t(8!PK+?(p94nIVN75kJgvX$`#owG^{8*{ z7W@2puQ1T&tL8(gUs+$(cHz6P9k%}NYt&{rLt)0m2YidJrdJA`D@R5c&TP$vvD>5# z^?=rFqoZ6FB-Z+dHxTilx_ViIsLXvCWzt|tH*kjMENC@n*OY^((N-m`&26zF5ZS47(j5@8WAF%=|V}rP>G%Jz$$7P zN}9EnPLBoUx9BrVx25JO(A#a(Qhkip0QNvJas~rF3`llUGn2&i6 z<1hXv1_m}Q&@<*oqh6n}@V*n~(e`@Kkuf)ZC0^siu|XS${>mcu+w1cW3}_}aYl^(h z)Bj`%8E|2b@k%_Q$K0&o!rvnQLVk(eKk;hxdfshtdKzF1%M+^ ziMqZV!Eonx@E&KvqBAxF=g2cp+ByH2?{Wgn*1Ys_v6Sh0V&cAC;i_a zCpVaUgLfiqF8TPLw>?ld`~cBoOfbw74t%01q(Z{SOs!+ny==GiQ^f0MH9xs(f6S}W zXv`b&oEoM`Osx&l0t>5HK#(XD-^FSD&DH2Gi3{-GCP`Cct9ZImuDt*mw@cv*#-X$N z6l@cPPyo^x&fFHSbu<3!yYzToL<1qzFqgno!Q$J5J?g)x>rdGRb>dk?uI>eE*~5qL z4sl4*lqbO#g#_JJ2RyxP2abxGe)$&sPna#($`(y$oO#+rTrHSYWE`k`Bvk4+^%7&N zZZ^mDFNwZ;M$Ywe;mp>lpDNjK5t7~oa)v*_+YShLlT+cjzQ{xt%|n3OYJoa`w=a&8 zIz>YfuiRZl4kuW#C(a0+W>m%@kkdvMcqB^ly+Co3{`TuZrSXbqp%cE3zJD?v49-=E z)K%lN9=|nN#oqmJiPVXRh%06a861g{~_ZNgvOg(sPk(K)Z$9jNNsD_&LdY4rt3 zg*}MVF$lKcv3g1bv)UDw!6L(GVTyy6Kh8T}&8{6jwVtM7Fd>mOCZQO-$)Zc^ab|ZB z@VB$bkD9svnot2n4zC6Es|OJu$~(XyGhTwrFQTfW8DS5?Q_J*d-wLfi3Vx{L?<;oQ zwy7tNl|Du_Zt`A{v!&MD6}$-Gx3(hW9nfPZX6jKHAhbD8oB%QJ(m86y39P#C`+}Tw z#j(UQ>mnnB;-Q!|X8jm+IDjZ?Dt|ag(G$->FcZ?1s~)A)Pe!@&KF8V~U;>ULFJXQ) zu6K_9Le%j0gzJvUALY&lSt5Z5>)(zZ1JtP| z5&g9hCnQmV#HfQQx{1-htMV~NI;Ff7saUlKjzM8UPU=x$yUr@7#XsM_k)?(hKAk2# zc%9nb`1{0l1TO}*_!%_Va82jo@tD5l1*k9U(2ZyLdCUczdQwR$ zvxnw~p4KOFIDii#%!O_MSSRHhMS5G2ek+yZD>dZ)4@;4pCC8QJ!!x(@W5|vG53}N< zAeJwRsbNb$M15rs%@0JZf%xVlcb{Y>c^K-g?G;9E&r5kaL-%f&Sv{Yf<3%|2zmUBQ z@O%~5v!Wgz!}J5Yu)3%_GAh@S2>8h0J<{p^St$@DS5|7)-@&}Lih;|Tg6Hp3%&y;Z z{3Mbl?u^awCdwsc;kw_BX!!D6@g=r`FQ)a6nu% zFH?2s5mt{1oUB*e`d03t#$8tGFz-=Q-#xIy18#d8H%Z$SA~)luaWUg!CtFar-s5en z_tO85z{EQhHm{Yfez|(X8DW9=SfXKT`gXmjbWNGh8oBPE$=eldV=CXS#kF1oz(_(f z;o!z+otT3Q++oZP#^l95P#uJ{b-cy6a8u(wsOPwLUgz^ZM>Z z?ZwJx>bNQ_&~z}o&T-oG854emRkl!Hs_{fGTq8xdSwbk*-^tP3zw%?y|^ z#qoDLTm6!Vw9`UWr!yL_qs}<}?=Gt{6%NbJucUCW_|0Z1mu__%k`pK*Kqxw5?q;`v zTkU%Kz6&Mw#vyr~=-cmu*pEPHOSgKn^TN-%)LU|30##;fH=9pr{q9eBqK9ak>{eYR z;ME3t0RhTfACzySQYCYJuJ&@E#CgON*2+UC?4+1_qx`<_j0k;6w`%{W!_LNP(W2id zw6C7im-;OF5iigZRMC%p3lMs!k=C5Y&cCwAm4y;9NL=)Pq4`qmRTq|q(niw)rq73% zkG<&h4To}tc>iMIvb`eL`}@~1n(HH8@18HYoeav?-spSlqo6>M%qyfbDV93+%VYsk zp4(ON)nTPkwFq|Rv4uAQXFZpUqxw7N_(h7l=!JU|mbk<8u$NdmP`zE9X5aUaBA8tNe|9aa(jLntLOs+_biF3pFWz=bRgx>fmr1+U`#gcn{V zF$y(6lvk(59c7MrITvTaof2Oaw?#d5bTgqzEDdC^++JV}PSh@^?FpwLRXb|Uh;&hj z%BSETQu)u*I{{7FK7Dp((SJkB=)4){Yur6;zOf1!7w2%$Y$@vcu;HvS^jho<^P)l1 zbG10G5*)|clI!1#I>aN-OuR2nUXHzV2TJelfpgr=urgcxdNPPfCWJozRj1fq{Xta^ zCRWI-@A}6AG5+II=knUoWg0GebnW&W1Tc;QKG1_hW@2uwYBHp@+r21R5GTO47WH_Q`MbL6`v>VG1;=pH|(R%>gtovEg&|9-^ zp|apP(11|?Sc1#J(ugX8pWAXoOtbxq;xcS(2*W#&<{|&e@*CkG=Ic{JFWWyv#ZEC@FQ1ubgDvhG zkNWg6JQ}l5VLk}fmB z3Y1pPZnke7dNvPi-0JG3%uMksz`5&cB7J~RlM5lV_tPvS_8)J$Y1P(sqD9qnFbLji~W*#_{e)DO1;cXN^5rh@c? zcVW+;UxZd2ZI~8Z{&P73_hWLI2_HA5i6;~pYD4zfR(D90pVr3=KQoAeSz)Qdu;Pk6 zbRQ?;48;E$ZoVh)2%(rY@ObyG6t16ToEGKAJfdssDt30jVOkTGOfXDt<0Cfh7Vvmt zlo%QP4t2ltF}LcY(87&h@cL6NCOB9I=)B(50DJ-ib|zBFoET&#(_QHSqFg~@b$+8;4&7#bHz?Fz!pghgxVwc?A`($c!PD}7JPUrBptt8zSFZzBEwbq0WiRt z93BgE4Jj+45NBgCW6Ur$?p3(cOXL|uEs+a!dwe1&v}NJfDuUng9&bOM>OemQ5|>o57@RzA;d?Z*+<(Sq{Z zmvd(lRrI#v&1$yZ{%6~_kSDoD1c88b*;p!>&p@u%=M_x9Q&;7hEwx7Os%alL6yoS8 zASr=r7DsVfyK2A2Syq09N@Q>$J`XM*sJycP;RzBB8Cx~H{bNHuDYjDCxOI5fm$kwa zgYtOFN|o`wWIfO;Qb_ECm4nEhf!A&_N9J@|NU7*a?QE0i&vdSP9E8~pW)d@#ziS_x z^990YBLx$BX%2d2Rr-n3D_UXtSzTE3JvA9I(KGC~gO@9Ml{1Q|Rb|kcv$sW5=L7p3 z4o{!Mf$WlNa1xKNbht_N#&{ECMWb>aQvjAJs=@84Jf!S68 zk0&38p`A6KPrem?BNb+>y@do);La+V1u$#6$$Br?m-&`g4-wPFAz~E>aa1kold*R` zH--(wwFVYI_%^axXiBWaDv)@pC=j*>2)-Yfi6RBLz+Ny#MMbaDd$+!Hsh#(J%853w zT;u6%Yo<6)iybr)$WuwB^u32t7eU2FwP*YiS3Esh4;+6+#fTMG6SZ@{(Bib*oW=}-F}Ev*8JKLQDm{gu z7oItH<;f2I_*b4i?Zzy9*%)jfn74kEnD@IlVu$@;x#?}IQ14GAF4C4TAr?bmUR^~l4Ns59A?ICx# zbJj@5OdYeyDi1<`hwD+GCSN@ESTd|wSIEDHDq6ay-Go;ui*%f0CMQDmnEO*lxt6Cn zVi^f+VxYOU;TAK65iH-D@9sk++o8{I%qu-gW!t@0eZpvwyFh;N*7%-<{{bLQl=pIH zjZ>4R$E0*AtjQKiMiL~>L(Y8L{W)ST@|}@cIsqiy;J=5nrj8ptKey&>r&G$E-ilL^$gmZq3Ik1t zwrUb#ncIRpG|tdKJ)vuxa;jCu+y;;US(ti->WeTu;?#yct=>VyC8hIMBX5Up$-=|V zv?P*_2^T-lG(}5yWN6DZi;GHCl`-@v#np+{5vc-eFYwXq6YA<^8Cr9YpM}5gqoLqE zgGbR%vX&l*PfU;ppGM221!6SspaQ#eEy><6k$>=yg=3tBtIIHNnDwV@K@rw)857ow zW7W8LcMWb=2wXykNzh-|7xm8mVG3n?1*w}5MO#|Xu$nUfQYgN;vugesY2~lafI~ZS zGR4^4U0M(YC~LsZNp-|H=1_TEi)s%kXDOo2v=o-8knkZU|Z*8m z$e_9k(his=Z-JUC^gAq&m2*mtj$@GmUE^4wY~ih;CwuRAlPkN|JqjU#(0(pAYXx@Q`@lk6VQne5I(!}}ngz>h<-M&^HyVm5CSLBsmRNIoj-+bo& z#B!hM?+;IVAcJZk`4xFy6KFCwp^va1ts)9y1z2*oQ=hS3TLLr?JOcQtFNDNr1~1CHL$>eHZrL@81U|qGbbd~eGcU4l#Vsgyf`gu1SCGUS3u_}59fhWhaQ-^AW}vnv zzgLopSxeRiWe^ycp@e6_V^~K0jU@=T&nnNYRs+s%#%xfJN7AeEr2Y^~2YJcHq@TvC z!;bz_Oqs?pQT_byC}g+Rb~bl*Tz9vcro?q0B<~y_u#~#EP1W3m>{765s-2uOM`<>2 zB`YEt)hGHJ34z!I0 zX|h&pwhUMN-6_FN*2Ajr%?ALBFZB1&HH-oFDS_ z!}h2nwC-mTOW;`2=nMWfN?5OvY(6pX!4n&LGo=|4-UU$ChF=h_-9Bi&vB!8>OaBGd zhNNIq?tI)jp%M+n<)?~IKG*R|fds(9rt*>R^Q@$s=jF-F9^NYUR1f~9Dy%>(kbKnC z5>s74Hh|gj*`Zqf+ZW(}9PoF)@M!V#Q=z8&LmJj9z%~P>xjt<4R3VC6YiBs3U`}>j zSB5D(UuY+g;2T`u{+0}zTSVZEJ;`q}yHx zA-IKwo4SnlgROATF-g;$rd%SQ_5P^s_)tFdLze{5TH`Z zX_2vhA?p!6LcY4V=p2&Tq-Ywo=8J|M0_iqi1nm7XsZFZcQRTR2)CBqgX)Im#W_x^u z&o@hAHo73%g?SjD%IByLr;ZXt=z$Yaqp&p#2>FLOMb;#1YnO1V{#DyCo2>F_9*@CeDZ87R%6p0IFBE^V77M(1a{Lc--(W}h24>RJ9@e4b zWXi7mq_(4eDeCD)gf6vOE_i8(o>g4&jipHa=M?sTR%uVdwo?jl>PRk_=mXvu%u<|* z!Dh{GJ+V(dm8{Eo>7k|+ORVykJ|;zc**O$9zEo3*_-RCjM{F?X$mWwMA%(vsD`&F2 z)V9@s-YtG@blSNkX^#huM&Cv|to2guyhp7mH2ZOuP2 zt&--|d!*OE!67dD;La3B*S{2T;xQ}7ue2S|8^@kS_p1EsqiFPuA6jk^=7M@kdSJoA zT7NkxXi~2=O(yiAJlSp3aJtF^#euyLU^g9`P=Ng}EPO*H^G#$b zW^~r7#p(xr`OMp((YumL&@zyJpP?9|oyawmp7Bd*uf1dFfXnQ;tVPHS0hQj8$&~W; zp|QzZex`?Ls6jy%L0X{63>3_;&R_S1HT`NtRtM+*!46}TzyR63wRTMS4SswG;N%=F z9t}=~q))l+4Cp#>*V$Qm!D7=TleMu)R}vP>kwwBHVYi@J^F0!m=bnJ31Up9uSj!0P z$sohe>RHF!fZ-+FdAI?=zZH3Wq2igA4x9>3fr>;xyaE#r9PH-UAGERuny+o12M@9Y zfH(Q1a<^p__pG1NABL+~BCL6D5CiIn{|r+>+K{QZYqV%1Ikz^Z740j962o`0^mUF% z;wXv(?>$rrZPmMgi!gfkv*K5jSlk&x+4tku6>_giEP-7}&_@Z5Fe2{!)nl{C#xTLr zTeKZtnfq4opR+m=4c!nKz{ONlg*)b0C}SBo!a!5}kwY?uU5kexW@pXj+KgV8=vB`% z%T!~jOtvcJaJoVXJx5lRS8N-Q4SN;(A$yp9zZO-YCpuV4 zq!JsG$p%t%FU1+AhZviQkS ziqzPCZwq{x?B&YoP&3GfOZP>9qN!NxU4rW?w8{hLlZ!+}3NzWg}pUphcLu(__k&{|_9{kzU$$b9S z@3bQzE^lkjfB9c#X~G-od5;)}#wS-vI~UfHc&R+z&IvyT^e7;7nHeh@wDsIx&VZ z=%=#B6teJ}!ANgjX;iIV1O}w^U7lJ&w|QB0x!IDVvp|cr%Tadh6#YZ+>Ff0L2aAk7 zFF;qX03Zt({uasxTpLhEedhI`XdQQbi0bLk^TAO>8%ZV0`@LJ*4S0XUJnhfl8!$QrU+0q<=w|%kv91Ucu095r+8xNF^*I;?MYG2&P1SJo; z49z6GmQDA_6Mzw(cuFDrO(9d(;4Hx~6=N~Z++ej|P z>%RXHC4pG4rbY~y8szp6RPFs-SF`b}ugqS9ytZP!^V*zu1Ond@Hs%J5|DtL@@5=twy#mq|+?plQ znmZq)sSHP9h*Q&?2C*6qUrry zB9a48rCSdp{v)q&(HAS+e(`z3wdu*7`v8(>GW<1cnr_%uyh!0NXIuAA-GCbV@M0 zUwiqH0ODG6B2)A`SuR%QHOhf0eb#d>dqcPpW8QrgBlEy%UN|N48qm7L6%zxi+#DYM zI**GXLiQhR7YJBTc_)7Y=cgaKsJfYPhd+iju>4YMWw^-4d>Dt|!ZoR8Htrh-%4VEC zb9#`244v=ChAg+Fnk{ak*HUaBq~PXNnU?lu?{{~Jw~K^km9L}mdZWZQ00P6;SWVLl z+YXj1^AH8DnBee%9}YlgD^n*R@ttYoWoB4M=&JZ$SnJ>OaDQ9Cd?; z4dJ80e8jDUk7wwam>s<^cz@=)2HWfGZzGejuj8|-Wg9U(v4#Y9!t;bQ>0e?Uoxa{4 zgVrwER*LUPicCl^4$}27J^*i=5O_3n7eoh&^0mN`y~F^ z<#Q7fZxFHq3DwLXROV4T5<)$5%#lmmQx=hT*oexkVB`!YOt-@UI{@MR{g z0Mr!7Wh&N@uk6OZqIw3@lqTtg%7Y#BhzgklIQOnxG*Uk>TkF49*2u8c;l~#(qvUA^CIlZ|p+veW9 zq{p)uy_~&%qt556oGpPDQ|*M5gn)Grpx5wjWzzlU=B~8uu*Q>Ib4Hr@=ggkW8p|0k zP(2Tg^3@+%QpHM1AtwTvWP^3$(B1xT{U)lmiu70e65tpT{LVt~K#}2!u+-F^AwUJ; zJ`V`k3+&5$oVzyiVdzuVZsYxd{@S*abCy?)(uY6kkiK?utu6cVwczR5F?rGTv|G8R zt>nH0t=4iG0@(o{T$Mhzd;Y8V3ejX`QO^OCI-i6#Gqq<|Typ#myDkeVfVe+Mjd2mC zEWW&#Ms6x%GId2rda>AS$hjgs4hj<_+J!7s1|vDG!!d-GS9zcUeNd00oJez&rx&z{ z`0~ldGkHJ~Qu(oKKD3(Oz7AQ?PMUdSzx_2;N$H*f-L{k#bI+7FE#`E1vem<@0 zDnmn;5yw4nboju%!?&jRUS;k?+gjFO{c}p_f^1`{kG-`UrHd-NhR$&$QISBZ{~i@O zM@vAzGW1vMN-isl6;lYgA2^AP+f!)ziB--0f$T9wI=}0LzizdDYek%x)=Ac~TDyYi z&XZr`O9F;y?(A=~o{I;YHr?y3<(M2ZrZtUMiyTb?(DVT=ud#}ggO_wWl%%OGoz9>5 zFNjGAmTKf1*is{-)`VsHp-D1H2 zuZ97w7xRm!nu>TTu8eF(rXjPBpO{UW1|0XzFRXDXf(q#$o9$ozZn5>-oZ8W+dLeyY zkbGgU`m;!e!6Waqu&+ZIOl8ClYQV2-&Hd)!+tYlFdwxxtdYfULE$bKWYB8G=oe?Y-nYr=^idd(^TuY^3-e ze!_9vI)pd02;Sd7@aN=y-;yRTylIkk@|5Ck6R80h^u;$S5iN8N#WtvOt5byLesh@+ z75JNsZb*{IRMh%iKp)!Y_b}>X!u$A;YYe3s^AThA#IX1Q8lYVv1R|@TCv#JCO5vkK z$eY5bHJ3Jg$GE7{)bO`ql)sddr)e|?&*G>|n@N*Pt*qybSj?ExU(;uv@ZvmZpJIW0 zQChdMpWwa05-z)o+)c6yQqB#()evf+>HLuX zv)F!G)`MbQXXXo$7m&ieTjgH`uqkx2(tjkSxR>;CtB+si0e5{*$M&+zDQxCa2r3d( zG!cACz5Yrf)-*b|KCFA0TH)mZ=iYGDeBj<>p6-;+>z8r*uU}fep(BF|-N4a~@g(v& zzd$`Jk>ZV_Q_qKe*N_}_7$y)Rf(2KL#fnMhiZ|Ui#==k2H`vY$2K=m)LI)&D1{nLY z-kVXz6Wse^=Xi9}Z_un!ewp3Q?DGxOTcVyU&iXhqV=|lP>?X!vcC2t4CN)Wz`?_FA0 zeSFicd^&MAo9gn9Tic|ML@{d+4{=YA zwF&4U^&&RqH)1xQ%GKup$K)CBNFhxd!lJeM5wz2SwWN2G2>%eFIgcpVxx{YkGvyo% zd(5WYAbP2hTpZ$YU6KA%_g!Sq(#Ntk_=q!z0u>vGHh+9@)|IS<$aogQojb{006eR3 z&W!hqDP1ggw%SQY-R`bCOT_LekMw1YHp(A$Bhz1NY1b_ROxtoFXh)QwF<55v6!4Ky zuysj2Zhv-LXjLOyu<`D|7dr-x_?z8!>hTuXyWA3ojPp_VoJK-BXI63!Bqh6BRgR|Q z7i|KGQO~r4O)fq?#3C>0cfW?A01CPL(%ChJpfj-6-|yy@=Dr;XR=@pF=Nt2M^0YFf%?6drTRQA33r#7Ft_kOV*o-*(FdP~&wUx?N+g+yG3qM%VZ&cSHeb zUeq&sV0$`%EkpBGjHP0X3~Q=3-C7kvthM;qM}gKy`RU_2q4%S$mC66t=W&WV(lIIexK5w@cuakyTS}3kc3HDju87dpYt? z+&;W!^v$!%4fr)?&bJSQlt{SS8F%~Z)s2ZfapH#y7B&SORlLXf0b3ePfKuVc^Q{Z~ zct?X`F`tCC%{hfu0cztMJ@3?5M52or<`FWN#EIvCbe>9=3T>|6nc-BCVHye9tTE|B@Kv=*iSe%Z}4I38*^w0VP&?rqEpB<4FE z>oWi;*u z+Q!Uhh$^$DZnS>lm4OG#fH`$C81($hOiJkrZ~nkw+x1M?3Z4W{{lX&ST5RPS#`CH# zY4VEk@ceb<-ILeS{!s7EEVM+3A7egEBgGo0NW1gp%Gjdd{o1qfy@nLrww*xACXf zoe*XRxl5>CVKSy$CdbNu_s}B$R_|Bt5&*R_5J7>Of2S5q%=owsN(k8Y0H#8-fF(`I zvH04CzQ6^X%Xu28GBak}w`Q>%t=c6(FJ49TE_aJa(#3E9?;unO5Vt>nCJg90f=dfA z{QPzD4Mzqz^er<$=tmKM4rPFi%n1);8OfN?K){eM;3oD5u$h=Tr^p1dE^Brrs{xOU z2p55HX0}_D;JxEwoCkG&E3t7WXT3rvU6X;5u0539iV)y*xjSuTOeRLH`QHX?i*a^P*X-$Pu`pY>voKFaBr*V z8P3B3Dr#SLU8V>YT;7)$6AQ%LshY8v-!KiRqM5}WPT)IvTf@qv)6%4Y!d7iJH<(nu z!U}4G-vuZ%g0Q`aPjzBAw#(*^+kfRRw+H{OB2F#}GMRCm2Q08fJC=*p%m6$c3I__< z?BotOwTw?N(MZ^qSHexIV!SWs0?vAF0{?P+!SeUG%MOOSnKw$oAVYk4Feo219?~yB zc(zm7N@y=H>`0&DQS@yiUmZCBbwtXvN_0Xt!oDSq4~=lwEPe{q2J46C?}G?&mP$4t!dl+YbbH4zkzs+gjwjL+K zJLRfO5vrG^!zV`t#qjyDKC62aqmUujteqjJJzHt;#Eq|%+CY9(LYYcj z;OOhfO2mZ}nO+Tg!t&}YDKdy;e+sbK@Pw##Te z-n9Ah-;S01&rlCfH`~S5*&XSt5Ly~HwUWe~i|YeE9sc$)ux~Nx9DO&A*%Kmx%m483$++w@0<#_r=bf)fIHd@;CRHF_|I&{7Hj9a z7zzY7hU+*@t9J!NNKw4~%!YCG)YP4VCLFD8*Jh~sMSK3}C?|nP2x0Cn4)!>$yzl|C zbVZHGIwC7iHSkiq5PpY)@V>NDij#(yva<8A5w&Hme@8(Z0hNM?I;eE~g1bf>Za#=h zWt1(ynrhDcPNEw??r^jL;_B%+=3f0yh5!HmE)IBM_V+IVEyu6Nc69!Y*MJ{&Wo@PJ I3g$uo2h;D=`v3p{ literal 0 HcmV?d00001 diff --git a/doc/developer-guides/images/virtio-console-arch.png b/doc/developer-guides/hld/images/virtio-console-arch.png similarity index 100% rename from doc/developer-guides/images/virtio-console-arch.png rename to doc/developer-guides/hld/images/virtio-console-arch.png diff --git a/doc/developer-guides/images/virtio-hld-image0.png b/doc/developer-guides/hld/images/virtio-hld-image0.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image0.png rename to doc/developer-guides/hld/images/virtio-hld-image0.png diff --git a/doc/developer-guides/images/virtio-hld-image1.png b/doc/developer-guides/hld/images/virtio-hld-image1.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image1.png rename to doc/developer-guides/hld/images/virtio-hld-image1.png diff --git a/doc/developer-guides/images/virtio-hld-image2.png b/doc/developer-guides/hld/images/virtio-hld-image2.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image2.png rename to doc/developer-guides/hld/images/virtio-hld-image2.png diff --git a/doc/developer-guides/images/virtio-hld-image3.png b/doc/developer-guides/hld/images/virtio-hld-image3.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image3.png rename to doc/developer-guides/hld/images/virtio-hld-image3.png diff --git a/doc/developer-guides/images/virtio-hld-image4.png b/doc/developer-guides/hld/images/virtio-hld-image4.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image4.png rename to doc/developer-guides/hld/images/virtio-hld-image4.png diff --git a/doc/developer-guides/images/virtio-hld-image5.png b/doc/developer-guides/hld/images/virtio-hld-image5.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image5.png rename to doc/developer-guides/hld/images/virtio-hld-image5.png diff --git a/doc/developer-guides/images/virtio-hld-image6.png b/doc/developer-guides/hld/images/virtio-hld-image6.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image6.png rename to doc/developer-guides/hld/images/virtio-hld-image6.png diff --git a/doc/developer-guides/images/virtio-hld-image7.png b/doc/developer-guides/hld/images/virtio-hld-image7.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image7.png rename to doc/developer-guides/hld/images/virtio-hld-image7.png diff --git a/doc/developer-guides/images/virtio-hld-image8.png b/doc/developer-guides/hld/images/virtio-hld-image8.png similarity index 100% rename from doc/developer-guides/images/virtio-hld-image8.png rename to doc/developer-guides/hld/images/virtio-hld-image8.png diff --git a/doc/developer-guides/images/watchdog-image1.png b/doc/developer-guides/hld/images/watchdog-image1.png similarity index 100% rename from doc/developer-guides/images/watchdog-image1.png rename to doc/developer-guides/hld/images/watchdog-image1.png diff --git a/doc/developer-guides/images/watchdog-image2.png b/doc/developer-guides/hld/images/watchdog-image2.png similarity index 100% rename from doc/developer-guides/images/watchdog-image2.png rename to doc/developer-guides/hld/images/watchdog-image2.png diff --git a/doc/developer-guides/hld/index.rst b/doc/developer-guides/hld/index.rst new file mode 100644 index 000000000..a979156a8 --- /dev/null +++ b/doc/developer-guides/hld/index.rst @@ -0,0 +1,28 @@ +.. _hld: + +High-Level Design Guides +######################## + +The ACRN Hypervisor acts as a host with full control of the processor(s) +and the hardware (physical memory, interrupt management and I/O). It +provides the User OS with an abstraction of a virtual platform, allowing +the guest to behave as if were executing directly on a logical +processor. + +These chapters describe the ACRN architecture, high-level design, +background, and motivation for specific areas within the ACRN hypervisor +system. + +.. toctree:: + :maxdepth: 1 + + Overview + Hypervisor + Device Model + Emulated Devices + Virtio Devices + VM Management + Power Management + Tracing and Logging + Virtual Bootloader + Security diff --git a/doc/developer-guides/interrupt-hld.rst b/doc/developer-guides/hld/interrupt-hld.rst similarity index 100% rename from doc/developer-guides/interrupt-hld.rst rename to doc/developer-guides/hld/interrupt-hld.rst diff --git a/doc/developer-guides/memmgt-hld.rst b/doc/developer-guides/hld/memmgt-hld.rst similarity index 100% rename from doc/developer-guides/memmgt-hld.rst rename to doc/developer-guides/hld/memmgt-hld.rst diff --git a/doc/developer-guides/uart-virtualization.rst b/doc/developer-guides/hld/uart-virt-hld.rst similarity index 100% rename from doc/developer-guides/uart-virtualization.rst rename to doc/developer-guides/hld/uart-virt-hld.rst diff --git a/doc/developer-guides/hld/virtio-blk.rst b/doc/developer-guides/hld/virtio-blk.rst new file mode 100644 index 000000000..167dedd2c --- /dev/null +++ b/doc/developer-guides/hld/virtio-blk.rst @@ -0,0 +1,107 @@ +.. _virtio-blk: + +Virtio-blk +########## + +The virtio-blk device is a simple virtual block device. The FE driver +(in the UOS space) places read, write, and other requests onto the +virtqueue, so that the BE driver (in the SOS space) can process them +accordingly. Communication between the FE and BE is based on the virtio +kick and notify mechanism. + +The virtio device ID of the virtio-blk is ``2``, and it supports one +virtqueue, the size of which is 64, configurable in the source code. + +.. figure:: images/virtio-blk-image01.png + :align: center + :width: 900px + :name: virtio-blk-arch + + Virtio-blk architecture + +The feature bits supported by the BE device are shown as follows: + +``VIRTIO_BLK_F_SEG_MAX`` + Maximum number of segments in a request is in seg_max. +``VIRTIO_BLK_F_BLK_SIZE`` + Block size of disk is in blk_size. +``VIRTIO_BLK_F_TOPOLOGY`` + Device exports information on optimal I/O alignment. +``VIRTIO_RING_F_INDIRECT_DESC`` + Support for indirect descriptors +``VIRTIO_BLK_F_FLUSH`` + Cache flush command support. +``VIRTIO_BLK_F_CONFIG_WCE`` + Device can toggle its cache between writeback and writethrough modes. + + +Virtio-blk-BE design +******************** + +.. figure:: images/virtio-blk-image02.png + :align: center + :width: 900px + :name: virtio-blk-be + +The virtio-blk BE device is implemented as a legacy virtio device. Its +backend media could be a file or a partition. The virtio-blk device +supports writeback and writethrough cache mode. In writeback mode, +virtio-blk has good write and read performance. To be safer, +writethrough is set as the default mode, as it can make sure every write +operation queued to the virtio-blk FE driver layer is submitted to +hardware storage. + +During initialization, virito-blk will allocate 64 ioreq buffers in a +shared ring used to store the I/O requests. The freeq, busyq, and pendq +shown in :numref:`virtio-blk-be` are used to manage requests. Each +virtio-blk device starts 8 worker threads to process request +asynchronously. + + +Usage: +****** + +The device model configuration command syntax for virtio-blk is:: + + -s ,virtio-blk,[,options] + +- ``filepath`` is the path of a file or disk partition +- ``options`` include: + + - ``writethru``: write operation is reported completed only when the + data has been written to physical storage. + - ``writeback``: write operation is reported completed when data is + placed in the page cache. Needs to be flushed to the physical storage. + - ``ro``: open file with readonly mode. + - ``sectorsize``: configured as either + ``sectorsize=/`` or + ``sectorsize=``. + The default values for sector size and physical sector size are 512 + - ``range``: configured as ``range=/`` + meaning the virtio-blk will only access part of the file, from the + ```` to `` + ``. + +A simple example for virtio-blk: + +1. Prepare a file in SOS folder:: + + dd if=/dev/zero of=test.img bs=1M count=1024 + mkfs.ext4 test.img + +#. Add virtio-blk in the DM cmdline, slot number should not duplicate + another device:: + + -s 9,virtio-blk,/root/test.img + +#. Launch UOS, you can find ``/dev/vdx`` in UOS. + + The ``x`` in ``/dev/vdx`` is related to the slot number used. If + If you start DM with two virtio-blks, and the slot numbers are 9 and 10, + then, the device with slot 9 will be recognized as ``/dev/vda``, and + the device with slot 10 will be ``/dev/vdb`` + +#. Mount ``/dev/vdx`` to a folder in the UOS, and then you can access it. + + +Successful booting of the User OS verifies the correctness of the +device. diff --git a/doc/developer-guides/virtio-console.rst b/doc/developer-guides/hld/virtio-console.rst similarity index 98% rename from doc/developer-guides/virtio-console.rst rename to doc/developer-guides/hld/virtio-console.rst index 14f6a9e2a..d84332c32 100644 --- a/doc/developer-guides/virtio-console.rst +++ b/doc/developer-guides/hld/virtio-console.rst @@ -1,7 +1,7 @@ -.. virtio-console: +.. _virtio-console: -Virtio-Console High-Level design -################################ +Virtio-console +############## The Virtio-console is a simple device for data input and output. The console's virtio device ID is ``3`` and can have from 1 to 16 ports. @@ -181,3 +181,4 @@ The File backend only supports console output to a file (no input). #. Add the console parameter to the guest OS kernel command line:: console=hvc0 + diff --git a/doc/developer-guides/network-virt-hld.rst b/doc/developer-guides/hld/virtio-net.rst similarity index 89% rename from doc/developer-guides/network-virt-hld.rst rename to doc/developer-guides/hld/virtio-net.rst index 8ec6cde14..b1d5ad013 100644 --- a/doc/developer-guides/network-virt-hld.rst +++ b/doc/developer-guides/hld/virtio-net.rst @@ -1,556 +1,525 @@ -.. net-virt-hld: - -Network Virtualization -###################### - -Introduction -************ - -Virtio-net is the para-virtualization solution used in ACRN for -networking. The ACRN device model emulates virtual NICs for UOS and the -frontend virtio network driver, simulating the virtual NIC and following -the virtio specification. (Refer to :ref:`introduction` and -:ref:`virtio-hld` background introductions to ACRN and Virtio.) - -Supported Features Notes -************************ - -Here are some notes about Virtio-net support in ACRN: - -- Legacy devices are supported, modern devices are not supported -- Two virtqueues are used in virtio-net: RX queue and TX queue -- Indirect descriptor is supported -- TAP backend is supported -- Control queue is not supported -- NIC multiple queues are not supported - -Network Virtualization Architecture -=================================== - -ACRN's network virtualization architecture is shown below in -:numref:`net-virt-arch`, and illustrates the many necessary network -virtualization components that must cooperate for the UOS to send and -receive data from the outside world. - -.. figure:: images/network-virt-arch.png - :align: center - :width: 900px - :name: net-virt-arch - - Network Virtualization Architecture - -(The green components are parts of the ACRN solution, while the gray -components are parts of the Linux kernel.) - -Let's explore these components further. - -SOS/UOS Network Stack: - This is the standard Linux TCP/IP stack, currently the most - feature-rich TCP/IP implementation. - -virtio-net Frontend Driver: - This is the standard driver in the Linux Kernel for virtual Ethernet - devices. This driver matches devices with PCI vendor ID 0x1AF4 and PCI - Device ID 0x1000 (for legacy devices in our case) or 0x1041 (for modern - devices). The virtual NIC supports two virtqueues, one for transmitting - packets and the other for receiving packets. The frontend driver places - empty buffers into one virtqueue for receiving packets, and enqueues - outgoing packets into another virtqueue for transmission. The size of - each virtqueue is 1024, configurable in the virtio-net backend driver. - -ACRN Hypervisor: - The ACRN hypervisor is a type 1 hypervisor, running directly on the - bare-metal hardware, and suitable for a variety of IoT and embedded - device solutions. It fetches and analyzes the guest instructions, puts - the decoded information into the shared page as an IOREQ, and notifies - or interrupts the VHM module in the SOS for processing. - -VHM Module: - The Virtio and Hypervisor Service Module (VHM) is a kernel module in the - Service OS (SOS) acting as a middle layer to support the device model - and hypervisor. The VHM forwards a IOREQ to the virtio-net backend - driver for processing. - -ACRN Device Model and virtio-net Backend Driver: - The ACRN Device Model (DM) gets an IOREQ from a shared page and calls - the virtio-net backend driver to process the request. The backend driver - receives the data in a shared virtqueue and sends it to the TAP device. - -Bridge and Tap Device: - Bridge and Tap are standard virtual network infrastructures. They play - an important role in communication among the SOS, the UOS, and the - outside world. - -IGB Driver: - IGB is the physical Network Interface Card (NIC) Linux kernel driver - responsible for sending data to and receiving data from the physical - NIC. - -The virtual network card (NIC) is implemented as a virtio legacy device -in the ACRN device model (DM). It is registered as a PCI virtio device -to the guest OS (UOS) and uses the standard virtio-net in the Linux kernel as -its driver (the guest kernel should be built with -``CONFIG_VIRTIO_NET=y``). - -The virtio-net backend in DM forwards the data received from the -frontend to the TAP device, then from the TAP device to the bridge, and -finally from the bridge to the physical NIC driver, and vice versa for -returning data from the NIC to the frontend. - -ACRN Virtio-Network Calling Stack -********************************* - -Various components of ACRN network virtualization are shown in the -architecture diagram shows in :numref:`net-virt-arch`. In this section, -we will use UOS data transmission (TX) and reception (RX) examples to -explain step-by-step how these components work together to implement -ACRN network virtualization. - -Initialization in Device Model -============================== - -virtio_net_init ---------------- - -- Present frontend a virtual PCI based NIC -- Setup control plan callbacks -- Setup data plan callbacks, including TX, RX -- Setup tap backend - -Initialization in virtio-net Frontend Driver -============================================ - -virtio_pci_probe ----------------- - -- Construct virtio device using virtual pci device and register it to - virtio bus - -virtio_dev_probe --> virtnet_probe --> init_vqs ------------------------------------------------ - -- Register network driver -- Setup shared virtqueues - -ACRN UOS TX FLOW -================ - -The following shows the ACRN UOS network TX flow, using TCP as an -example, showing the flow through each layer: - -UOS TCP Layer -------------- - -.. code-block:: c - - tcp_sendmsg --> - tcp_sendmsg_locked --> - tcp_push_one --> - tcp_write_xmit --> - tcp_transmit_skb --> - -UOS IP Layer ------------- - -.. code-block:: c - - ip_queue_xmit --> - ip_local_out --> - __ip_local_out --> - dst_output --> - ip_output --> - ip_finish_output --> - ip_finish_output2 --> - neigh_output --> - neigh_resolve_output --> - -UOS MAC Layer -------------- - -.. code-block:: c - - dev_queue_xmit --> - __dev_queue_xmit --> - dev_hard_start_xmit --> - xmit_one --> - netdev_start_xmit --> - __netdev_start_xmit --> - - -UOS MAC Layer virtio-net Frontend Driver ----------------------------------------- - -.. code-block:: c - - start_xmit --> // virtual NIC driver xmit in virtio_net - xmit_skb --> - virtqueue_add_outbuf --> // add out buffer to shared virtqueue - virtqueue_add --> - - virtqueue_kick --> // notify the backend - virtqueue_notify --> - vp_notify --> - iowrite16 --> // trap here, HV will first get notified - -ACRN Hypervisor ---------------- - -.. code-block:: c - - vmexit_handler --> // vmexit because VMX_EXIT_REASON_IO_INSTRUCTION - pio_instr_vmexit_handler --> - emulate_io --> // ioreq cant be processed in HV, forward it to VHM - acrn_insert_request_wait --> - fire_vhm_interrupt --> // interrupt SOS, VHM will get notified - -VHM Module ----------- - -.. code-block:: c - - vhm_intr_handler --> // VHM interrupt handler - tasklet_schedule --> - io_req_tasklet --> - acrn_ioreq_distribute_request --> // ioreq can't be processed in VHM, forward it to device DM - acrn_ioreq_notify_client --> - wake_up_interruptible --> // wake up DM to handle ioreq - -ACRN Device Model / virtio-net Backend Driver ---------------------------------------------- - -.. code-block:: c - - handle_vmexit --> - vmexit_inout --> - emulate_inout --> - pci_emul_io_handler --> - virtio_pci_write --> - virtio_pci_legacy_write --> - virtio_net_ping_txq --> // start TX thread to process, notify thread return - virtio_net_tx_thread --> // this is TX thread - virtio_net_proctx --> // call corresponding backend (tap) to process - virtio_net_tap_tx --> - writev --> // write data to tap device - -SOS TAP Device Forwarding -------------------------- - -.. code-block:: c - - do_writev --> - vfs_writev --> - do_iter_write --> - do_iter_readv_writev --> - call_write_iter --> - tun_chr_write_iter --> - tun_get_user --> - netif_receive_skb --> - netif_receive_skb_internal --> - __netif_receive_skb --> - __netif_receive_skb_core --> - - -SOS Bridge Forwarding ---------------------- - -.. code-block:: c - - br_handle_frame --> - br_handle_frame_finish --> - br_forward --> - __br_forward --> - br_forward_finish --> - br_dev_queue_push_xmit --> - -SOS MAC Layer -------------- - -.. code-block:: c - - dev_queue_xmit --> - __dev_queue_xmit --> - dev_hard_start_xmit --> - xmit_one --> - netdev_start_xmit --> - __netdev_start_xmit --> - - -SOS MAC Layer IGB Driver ------------------------- - -.. code-block:: c - - igb_xmit_frame --> // IGB physical NIC driver xmit function - -ACRN UOS RX FLOW -================ - -The following shows the ACRN UOS network RX flow, using TCP as an example. -Let's start by receiving a device interrupt. (Note that the hypervisor -will first get notified when receiving an interrupt even in passthrough -cases.) - -Hypervisor Interrupt Dispatch ------------------------------ - -.. code-block:: c - - vmexit_handler --> // vmexit because VMX_EXIT_REASON_EXTERNAL_INTERRUPT - external_interrupt_vmexit_handler --> - dispatch_interrupt --> - common_handler_edge --> - ptdev_interrupt_handler --> - ptdev_enqueue_softirq --> // Interrupt will be delivered in bottom-half softirq - - -Hypervisor Interrupt Injection ------------------------------- - -.. code-block:: c - - do_softirq --> - ptdev_softirq --> - vlapic_intr_msi --> // insert the interrupt into SOS - - start_vcpu --> // VM Entry here, will process the pending interrupts - -SOS MAC Layer IGB Driver ------------------------- - -.. code-block:: c - - do_IRQ --> - ... - igb_msix_ring --> - igbpoll --> - napi_gro_receive --> - napi_skb_finish --> - netif_receive_skb_internal --> - __netif_receive_skb --> - __netif_receive_skb_core -- - -SOS Bridge Forwarding ---------------------- - -.. code-block:: c - - br_handle_frame --> - br_handle_frame_finish --> - br_forward --> - __br_forward --> - br_forward_finish --> - br_dev_queue_push_xmit --> - -SOS MAC Layer -------------- - -.. code-block:: c - - dev_queue_xmit --> - __dev_queue_xmit --> - dev_hard_start_xmit --> - xmit_one --> - netdev_start_xmit --> - __netdev_start_xmit --> - -SOS MAC Layer TAP Driver ------------------------- - -.. code-block:: c - - tun_net_xmit --> // Notify and wake up reader process - -ACRN Device Model / virtio-net Backend Driver ---------------------------------------------- - -.. code-block:: c - - virtio_net_rx_callback --> // the tap fd get notified and this function invoked - virtio_net_tap_rx --> // read data from tap, prepare virtqueue, insert interrupt into the UOS - vq_endchains --> - vq_interrupt --> - pci_generate_msi --> - -VHM Module ----------- - -.. code-block:: c - - vhm_dev_ioctl --> // process the IOCTL and call hypercall to inject interrupt - hcall_inject_msi --> - -ACRN Hypervisor ---------------- - -.. code-block:: c - - vmexit_handler --> // vmexit because VMX_EXIT_REASON_VMCALL - vmcall_vmexit_handler --> - hcall_inject_msi --> // insert interrupt into UOS - vlapic_intr_msi --> - -UOS MAC Layer virtio_net Frontend Driver ----------------------------------------- - -.. code-block:: c - - vring_interrupt --> // virtio-net frontend driver interrupt handler - skb_recv_done --> //registed by virtnet_probe-->init_vqs-->virtnet_find_vqs - virtqueue_napi_schedule --> - __napi_schedule --> - virtnet_poll --> - virtnet_receive --> - receive_buf --> - -UOS MAC Layer -------------- - -.. code-block:: c - - napi_gro_receive --> - napi_skb_finish --> - netif_receive_skb_internal --> - __netif_receive_skb --> - __netif_receive_skb_core --> - -UOS IP Layer ------------- - -.. code-block:: c - - ip_rcv --> - ip_rcv_finish --> - dst_input --> - ip_local_deliver --> - ip_local_deliver_finish --> - - -UOS TCP Layer -------------- - -.. code-block:: c - - tcp_v4_rcv --> - tcp_v4_do_rcv --> - tcp_rcv_established --> - tcp_data_queue --> - tcp_queue_rcv --> - __skb_queue_tail --> - - sk->sk_data_ready --> // application will get notified - -How to Use -========== - -The network infrastructure shown in :numref:`net-virt-infra` needs to be -prepared in the SOS before we start. We need to create a bridge and at -least one tap device (two tap devices are needed to create a dual -virtual NIC) and attach a physical NIC and tap device to the bridge. - -.. figure:: images/network-virt-sos-infrastruct.png - :align: center - :width: 900px - :name: net-virt-infra - - Network Infrastructure in SOS - -You can use Linux commands (e.g. ip, brctl) to create this network. In -our case, we use systemd to automatically create the network by default. -You can check the files with prefix 50- in the SOS -``/usr/lib/systemd/network/``: - -- `50-acrn.netdev `__ -- `50-acrn.network `__ -- `50-acrn_tap0.netdev `__ -- `50-eth.network `__ - -When the SOS is started, run ``ifconfig`` to show the devices created by -this systemd configuration: - -.. code-block:: none - - acrn-br0 Link encap:Ethernet HWaddr B2:50:41:FE:F7:A3 - inet addr:10.239.154.43 Bcast:10.239.154.255 Mask:255.255.255.0 - inet6 addr: fe80::b050:41ff:fefe:f7a3/64 Scope:Link - UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 - RX packets:226932 errors:0 dropped:21383 overruns:0 frame:0 - TX packets:14816 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:100457754 (95.8 Mb) TX bytes:83481244 (79.6 Mb) - - acrn_tap0 Link encap:Ethernet HWaddr F6:A7:7E:52:50:C6 - UP BROADCAST MULTICAST MTU:1500 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) - - enp3s0 Link encap:Ethernet HWaddr 98:4F:EE:14:5B:74 - inet6 addr: fe80::9a4f:eeff:fe14:5b74/64 Scope:Link - UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 - RX packets:279174 errors:0 dropped:0 overruns:0 frame:0 - TX packets:69923 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:107312294 (102.3 Mb) TX bytes:87117507 (83.0 Mb) - Memory:82200000-8227ffff - - lo Link encap:Local Loopback - inet addr:127.0.0.1 Mask:255.0.0.0 - inet6 addr: ::1/128 Scope:Host - UP LOOPBACK RUNNING MTU:65536 Metric:1 - RX packets:16 errors:0 dropped:0 overruns:0 frame:0 - TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:1216 (1.1 Kb) TX bytes:1216 (1.1 Kb) - -Run ``brctl show`` to see the bridge ``acrn-br0`` and attached devices: - -.. code-block:: none - - bridge name bridge id STP enabled interfaces - - acrn-br0 8000.b25041fef7a3 no acrn_tap0 - enp3s0 - -Add a pci slot to the device model acrn-dm command line (mac address is -optional): - -.. code-block:: none - - -s 4,virtio-net,,[mac=] - -When the UOS is lauched, run ``ifconfig`` to check the network. enp0s4r -is the virtual NIC created by acrn-dm: - -.. code-block:: none - - enp0s4 Link encap:Ethernet HWaddr 00:16:3E:39:0F:CD - inet addr:10.239.154.186 Bcast:10.239.154.255 Mask:255.255.255.0 - inet6 addr: fe80::216:3eff:fe39:fcd/64 Scope:Link - UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 - RX packets:140 errors:0 dropped:8 overruns:0 frame:0 - TX packets:46 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:110727 (108.1 Kb) TX bytes:4474 (4.3 Kb) - - lo Link encap:Local Loopback - inet addr:127.0.0.1 Mask:255.0.0.0 - inet6 addr: ::1/128 Scope:Host - UP LOOPBACK RUNNING MTU:65536 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) - -Performance Estimation -====================== - -We've introduced the network virtualization solution in ACRN, from the -top level architecture to the detailed TX and RX flow. Currently, the -control plane and data plane are all processed in ACRN device model, -which may bring some overhead. But this is not a bottleneck for 1000Mbit -NICs or below. Network bandwidth for virtualization can be very close to -the native bandwidgh. For high speed NIC (e.g. 10Gb or above), it is -necessary to separate the data plane from the control plane. We can use -vhost for acceleration. For most IoT scenarios, processing in user space -is simple and reasonable. +.. _virtio-net: + +Virtio-net +########## + +Virtio-net is the para-virtualization solution used in ACRN for +networking. The ACRN device model emulates virtual NICs for UOS and the +frontend virtio network driver, simulating the virtual NIC and following +the virtio specification. (Refer to :ref:`introduction` and +:ref:`virtio-hld` background introductions to ACRN and Virtio.) + +Here are some notes about Virtio-net support in ACRN: + +- Legacy devices are supported, modern devices are not supported +- Two virtqueues are used in virtio-net: RX queue and TX queue +- Indirect descriptor is supported +- TAP backend is supported +- Control queue is not supported +- NIC multiple queues are not supported + +Network Virtualization Architecture +*********************************** + +ACRN's network virtualization architecture is shown below in +:numref:`net-virt-arch`, and illustrates the many necessary network +virtualization components that must cooperate for the UOS to send and +receive data from the outside world. + +.. figure:: images/network-virt-arch.png + :align: center + :width: 900px + :name: net-virt-arch + + Network Virtualization Architecture + +(The green components are parts of the ACRN solution, while the gray +components are parts of the Linux kernel.) + +Let's explore these components further. + +SOS/UOS Network Stack: + This is the standard Linux TCP/IP stack, currently the most + feature-rich TCP/IP implementation. + +virtio-net Frontend Driver: + This is the standard driver in the Linux Kernel for virtual Ethernet + devices. This driver matches devices with PCI vendor ID 0x1AF4 and PCI + Device ID 0x1000 (for legacy devices in our case) or 0x1041 (for modern + devices). The virtual NIC supports two virtqueues, one for transmitting + packets and the other for receiving packets. The frontend driver places + empty buffers into one virtqueue for receiving packets, and enqueues + outgoing packets into another virtqueue for transmission. The size of + each virtqueue is 1024, configurable in the virtio-net backend driver. + +ACRN Hypervisor: + The ACRN hypervisor is a type 1 hypervisor, running directly on the + bare-metal hardware, and suitable for a variety of IoT and embedded + device solutions. It fetches and analyzes the guest instructions, puts + the decoded information into the shared page as an IOREQ, and notifies + or interrupts the VHM module in the SOS for processing. + +VHM Module: + The Virtio and Hypervisor Service Module (VHM) is a kernel module in the + Service OS (SOS) acting as a middle layer to support the device model + and hypervisor. The VHM forwards a IOREQ to the virtio-net backend + driver for processing. + +ACRN Device Model and virtio-net Backend Driver: + The ACRN Device Model (DM) gets an IOREQ from a shared page and calls + the virtio-net backend driver to process the request. The backend driver + receives the data in a shared virtqueue and sends it to the TAP device. + +Bridge and Tap Device: + Bridge and Tap are standard virtual network infrastructures. They play + an important role in communication among the SOS, the UOS, and the + outside world. + +IGB Driver: + IGB is the physical Network Interface Card (NIC) Linux kernel driver + responsible for sending data to and receiving data from the physical + NIC. + +The virtual network card (NIC) is implemented as a virtio legacy device +in the ACRN device model (DM). It is registered as a PCI virtio device +to the guest OS (UOS) and uses the standard virtio-net in the Linux kernel as +its driver (the guest kernel should be built with +``CONFIG_VIRTIO_NET=y``). + +The virtio-net backend in DM forwards the data received from the +frontend to the TAP device, then from the TAP device to the bridge, and +finally from the bridge to the physical NIC driver, and vice versa for +returning data from the NIC to the frontend. + +ACRN Virtio-Network Calling Stack +********************************* + +Various components of ACRN network virtualization are shown in the +architecture diagram shows in :numref:`net-virt-arch`. In this section, +we will use UOS data transmission (TX) and reception (RX) examples to +explain step-by-step how these components work together to implement +ACRN network virtualization. + +Initialization in Device Model +============================== + +**virtio_net_init** + +- Present frontend for a virtual PCI based NIC +- Setup control plan callbacks +- Setup data plan callbacks, including TX, RX +- Setup tap backend + +Initialization in virtio-net Frontend Driver +============================================ + +**virtio_pci_probe** + +- Construct virtio device using virtual pci device and register it to + virtio bus + +**virtio_dev_probe --> virtnet_probe --> init_vqs** + +- Register network driver +- Setup shared virtqueues + +ACRN UOS TX FLOW +================ + +The following shows the ACRN UOS network TX flow, using TCP as an +example, showing the flow through each layer: + +**UOS TCP Layer** + +.. code-block:: c + + tcp_sendmsg --> + tcp_sendmsg_locked --> + tcp_push_one --> + tcp_write_xmit --> + tcp_transmit_skb --> + +**UOS IP Layer** + +.. code-block:: c + + ip_queue_xmit --> + ip_local_out --> + __ip_local_out --> + dst_output --> + ip_output --> + ip_finish_output --> + ip_finish_output2 --> + neigh_output --> + neigh_resolve_output --> + +**UOS MAC Layer** + +.. code-block:: c + + dev_queue_xmit --> + __dev_queue_xmit --> + dev_hard_start_xmit --> + xmit_one --> + netdev_start_xmit --> + __netdev_start_xmit --> + + +**UOS MAC Layer virtio-net Frontend Driver** + +.. code-block:: c + + start_xmit --> // virtual NIC driver xmit in virtio_net + xmit_skb --> + virtqueue_add_outbuf --> // add out buffer to shared virtqueue + virtqueue_add --> + + virtqueue_kick --> // notify the backend + virtqueue_notify --> + vp_notify --> + iowrite16 --> // trap here, HV will first get notified + +**ACRN Hypervisor** + +.. code-block:: c + + vmexit_handler --> // vmexit because VMX_EXIT_REASON_IO_INSTRUCTION + pio_instr_vmexit_handler --> + emulate_io --> // ioreq cant be processed in HV, forward it to VHM + acrn_insert_request_wait --> + fire_vhm_interrupt --> // interrupt SOS, VHM will get notified + +**VHM Module** + +.. code-block:: c + + vhm_intr_handler --> // VHM interrupt handler + tasklet_schedule --> + io_req_tasklet --> + acrn_ioreq_distribute_request --> // ioreq can't be processed in VHM, forward it to device DM + acrn_ioreq_notify_client --> + wake_up_interruptible --> // wake up DM to handle ioreq + +**ACRN Device Model / virtio-net Backend Driver** + +.. code-block:: c + + handle_vmexit --> + vmexit_inout --> + emulate_inout --> + pci_emul_io_handler --> + virtio_pci_write --> + virtio_pci_legacy_write --> + virtio_net_ping_txq --> // start TX thread to process, notify thread return + virtio_net_tx_thread --> // this is TX thread + virtio_net_proctx --> // call corresponding backend (tap) to process + virtio_net_tap_tx --> + writev --> // write data to tap device + +**SOS TAP Device Forwarding** + +.. code-block:: c + + do_writev --> + vfs_writev --> + do_iter_write --> + do_iter_readv_writev --> + call_write_iter --> + tun_chr_write_iter --> + tun_get_user --> + netif_receive_skb --> + netif_receive_skb_internal --> + __netif_receive_skb --> + __netif_receive_skb_core --> + + +**SOS Bridge Forwarding** + +.. code-block:: c + + br_handle_frame --> + br_handle_frame_finish --> + br_forward --> + __br_forward --> + br_forward_finish --> + br_dev_queue_push_xmit --> + +**SOS MAC Layer** + +.. code-block:: c + + dev_queue_xmit --> + __dev_queue_xmit --> + dev_hard_start_xmit --> + xmit_one --> + netdev_start_xmit --> + __netdev_start_xmit --> + + +**SOS MAC Layer IGB Driver** + +.. code-block:: c + + igb_xmit_frame --> // IGB physical NIC driver xmit function + +ACRN UOS RX FLOW +================ + +The following shows the ACRN UOS network RX flow, using TCP as an example. +Let's start by receiving a device interrupt. (Note that the hypervisor +will first get notified when receiving an interrupt even in passthrough +cases.) + +**Hypervisor Interrupt Dispatch** + +.. code-block:: c + + vmexit_handler --> // vmexit because VMX_EXIT_REASON_EXTERNAL_INTERRUPT + external_interrupt_vmexit_handler --> + dispatch_interrupt --> + common_handler_edge --> + ptdev_interrupt_handler --> + ptdev_enqueue_softirq --> // Interrupt will be delivered in bottom-half softirq + + +**Hypervisor Interrupt Injection** + +.. code-block:: c + + do_softirq --> + ptdev_softirq --> + vlapic_intr_msi --> // insert the interrupt into SOS + + start_vcpu --> // VM Entry here, will process the pending interrupts + +**SOS MAC Layer IGB Driver** + +.. code-block:: c + + do_IRQ --> + ... + igb_msix_ring --> + igbpoll --> + napi_gro_receive --> + napi_skb_finish --> + netif_receive_skb_internal --> + __netif_receive_skb --> + __netif_receive_skb_core -- + +**SOS Bridge Forwarding** + +.. code-block:: c + + br_handle_frame --> + br_handle_frame_finish --> + br_forward --> + __br_forward --> + br_forward_finish --> + br_dev_queue_push_xmit --> + +**SOS MAC Layer** + +.. code-block:: c + + dev_queue_xmit --> + __dev_queue_xmit --> + dev_hard_start_xmit --> + xmit_one --> + netdev_start_xmit --> + __netdev_start_xmit --> + +**SOS MAC Layer TAP Driver** + +.. code-block:: c + + tun_net_xmit --> // Notify and wake up reader process + +**ACRN Device Model / virtio-net Backend Driver** + +.. code-block:: c + + virtio_net_rx_callback --> // the tap fd get notified and this function invoked + virtio_net_tap_rx --> // read data from tap, prepare virtqueue, insert interrupt into the UOS + vq_endchains --> + vq_interrupt --> + pci_generate_msi --> + +**VHM Module** + +.. code-block:: c + + vhm_dev_ioctl --> // process the IOCTL and call hypercall to inject interrupt + hcall_inject_msi --> + +**ACRN Hypervisor** + +.. code-block:: c + + vmexit_handler --> // vmexit because VMX_EXIT_REASON_VMCALL + vmcall_vmexit_handler --> + hcall_inject_msi --> // insert interrupt into UOS + vlapic_intr_msi --> + +**UOS MAC Layer virtio_net Frontend Driver** + +.. code-block:: c + + vring_interrupt --> // virtio-net frontend driver interrupt handler + skb_recv_done --> //registed by virtnet_probe-->init_vqs-->virtnet_find_vqs + virtqueue_napi_schedule --> + __napi_schedule --> + virtnet_poll --> + virtnet_receive --> + receive_buf --> + +**UOS MAC Layer** + +.. code-block:: c + + napi_gro_receive --> + napi_skb_finish --> + netif_receive_skb_internal --> + __netif_receive_skb --> + __netif_receive_skb_core --> + +**UOS IP Layer** + +.. code-block:: c + + ip_rcv --> + ip_rcv_finish --> + dst_input --> + ip_local_deliver --> + ip_local_deliver_finish --> + + +**UOS TCP Layer** + +.. code-block:: c + + tcp_v4_rcv --> + tcp_v4_do_rcv --> + tcp_rcv_established --> + tcp_data_queue --> + tcp_queue_rcv --> + __skb_queue_tail --> + + sk->sk_data_ready --> // application will get notified + +How to Use +========== + +The network infrastructure shown in :numref:`net-virt-infra` needs to be +prepared in the SOS before we start. We need to create a bridge and at +least one tap device (two tap devices are needed to create a dual +virtual NIC) and attach a physical NIC and tap device to the bridge. + +.. figure:: images/network-virt-sos-infrastruct.png + :align: center + :width: 900px + :name: net-virt-infra + + Network Infrastructure in SOS + +You can use Linux commands (e.g. ip, brctl) to create this network. In +our case, we use systemd to automatically create the network by default. +You can check the files with prefix 50- in the SOS +``/usr/lib/systemd/network/``: + +- `50-acrn.netdev `__ +- `50-acrn.network `__ +- `50-acrn_tap0.netdev `__ +- `50-eth.network `__ + +When the SOS is started, run ``ifconfig`` to show the devices created by +this systemd configuration: + +.. code-block:: none + + acrn-br0 Link encap:Ethernet HWaddr B2:50:41:FE:F7:A3 + inet addr:10.239.154.43 Bcast:10.239.154.255 Mask:255.255.255.0 + inet6 addr: fe80::b050:41ff:fefe:f7a3/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 + RX packets:226932 errors:0 dropped:21383 overruns:0 frame:0 + TX packets:14816 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:100457754 (95.8 Mb) TX bytes:83481244 (79.6 Mb) + + acrn_tap0 Link encap:Ethernet HWaddr F6:A7:7E:52:50:C6 + UP BROADCAST MULTICAST MTU:1500 Metric:1 + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) + + enp3s0 Link encap:Ethernet HWaddr 98:4F:EE:14:5B:74 + inet6 addr: fe80::9a4f:eeff:fe14:5b74/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 + RX packets:279174 errors:0 dropped:0 overruns:0 frame:0 + TX packets:69923 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:107312294 (102.3 Mb) TX bytes:87117507 (83.0 Mb) + Memory:82200000-8227ffff + + lo Link encap:Local Loopback + inet addr:127.0.0.1 Mask:255.0.0.0 + inet6 addr: ::1/128 Scope:Host + UP LOOPBACK RUNNING MTU:65536 Metric:1 + RX packets:16 errors:0 dropped:0 overruns:0 frame:0 + TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:1216 (1.1 Kb) TX bytes:1216 (1.1 Kb) + +Run ``brctl show`` to see the bridge ``acrn-br0`` and attached devices: + +.. code-block:: none + + bridge name bridge id STP enabled interfaces + + acrn-br0 8000.b25041fef7a3 no acrn_tap0 + enp3s0 + +Add a pci slot to the device model acrn-dm command line (mac address is +optional): + +.. code-block:: none + + -s 4,virtio-net,,[mac=] + +When the UOS is lauched, run ``ifconfig`` to check the network. enp0s4r +is the virtual NIC created by acrn-dm: + +.. code-block:: none + + enp0s4 Link encap:Ethernet HWaddr 00:16:3E:39:0F:CD + inet addr:10.239.154.186 Bcast:10.239.154.255 Mask:255.255.255.0 + inet6 addr: fe80::216:3eff:fe39:fcd/64 Scope:Link + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 + RX packets:140 errors:0 dropped:8 overruns:0 frame:0 + TX packets:46 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:110727 (108.1 Kb) TX bytes:4474 (4.3 Kb) + + lo Link encap:Local Loopback + inet addr:127.0.0.1 Mask:255.0.0.0 + inet6 addr: ::1/128 Scope:Host + UP LOOPBACK RUNNING MTU:65536 Metric:1 + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 + collisions:0 txqueuelen:1000 + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) + +Performance Estimation +====================== + +We've introduced the network virtualization solution in ACRN, from the +top level architecture to the detailed TX and RX flow. Currently, the +control plane and data plane are all processed in ACRN device model, +which may bring some overhead. But this is not a bottleneck for 1000Mbit +NICs or below. Network bandwidth for virtualization can be very close to +the native bandwidgh. For high speed NIC (e.g. 10Gb or above), it is +necessary to separate the data plane from the control plane. We can use +vhost for acceleration. For most IoT scenarios, processing in user space +is simple and reasonable. + + diff --git a/doc/developer-guides/hld/virtio-rnd.rst b/doc/developer-guides/hld/virtio-rnd.rst new file mode 100644 index 000000000..dea36d7f8 --- /dev/null +++ b/doc/developer-guides/hld/virtio-rnd.rst @@ -0,0 +1,21 @@ +.. _virtio-rnd: + +Virtio-rnd +########## + +The virtio-rnd entropy device supplies high-quality randomness for guest +use. The virtio device ID of the virtio-rnd device is 4, and it supports +one virtqueue, the size of which is 64, configurable in the source code. +It has no feature bits defined. + +When the FE driver requires some random bytes, the BE device will place +bytes of random data onto the virtqueue. + +To launch the virtio-rnd device, use the following virtio command:: + + -s ,virtio-rnd + +To verify the correctness in user OS, use the following +command:: + + od /dev/random diff --git a/doc/developer-guides/watchdog-hld.rst b/doc/developer-guides/hld/watchdog-hld.rst similarity index 100% rename from doc/developer-guides/watchdog-hld.rst rename to doc/developer-guides/hld/watchdog-hld.rst diff --git a/doc/developer-guides/index.rst b/doc/developer-guides/index.rst index 4a509194b..e014e8379 100644 --- a/doc/developer-guides/index.rst +++ b/doc/developer-guides/index.rst @@ -6,30 +6,13 @@ Developer Guides .. toctree:: :maxdepth: 1 - primer.rst - ../api/index.rst - ../reference/kconfig/index.rst + hld/index + primer + GVT-g-porting + trusty + ../api/index + ../reference/kconfig/index -High-Level Design Guides -************************ - -These documents describe the high-level design, background, and motivation for -specific areas within the ACRN hypervisor system. - -.. toctree:: - :maxdepth: 1 - - ACPI-virt-hld.rst - APL_GVT-g-hld.rst - GVT-g-porting.rst - interrupt-hld.rst - memmgt-hld.rst - network-virt-hld.rst - security-hld.rst - uart-virtualization.rst - virtio-hld.rst - virtio-console.rst - watchdog-hld.rst Contributing to the project *************************** @@ -41,6 +24,6 @@ project. .. toctree:: :maxdepth: 1 - contribute_guidelines.rst - doc_guidelines.rst - graphviz.rst + contribute_guidelines + doc_guidelines + graphviz diff --git a/doc/developer-guides/trusty.rst b/doc/developer-guides/trusty.rst index 44a0d4696..e9784aafd 100644 --- a/doc/developer-guides/trusty.rst +++ b/doc/developer-guides/trusty.rst @@ -1,9 +1,7 @@ -:orphan: - .. _trusty_tee: -Trusty TEE on ACRN -################## +Trusty TEE +########## Introduction ************