| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ================= |
| Gunyah Hypervisor |
| ================= |
| |
| .. toctree:: |
| :maxdepth: 1 |
| |
| message-queue |
| |
| Gunyah is a Type-1 hypervisor which is independent of any OS kernel, and runs in |
| a more privileged CPU level (EL2 on Aarch64). It does not depend on a less |
| privileged operating system for its core functionality. This increases its |
| security and can support a much smaller trusted computing base than a Type-2 |
| hypervisor. |
| |
| Gunyah is an open source hypervisor. The source repository is available at |
| https://github.com/quic/gunyah-hypervisor. |
| |
| Gunyah provides these following features. |
| |
| - Scheduling: |
| |
| A scheduler for virtual CPUs (vCPUs) on physical CPUs enables time-sharing |
| of the CPUs. Gunyah supports two models of scheduling which can coexist on |
| a running system: |
| |
| 1. Hypervisor vCPU scheduling in which Gunyah hypervisor schedules vCPUS on |
| its own. The default is a real-time priority with round-robin scheduler. |
| 2. "Proxy" scheduling in which an owner-VM can donate the remainder of its |
| own vCPU's time slice to an owned-VM's vCPU via a hypercall. |
| |
| - Memory Management: |
| |
| APIs handling memory, abstracted as objects, limiting direct use of physical |
| addresses. Memory ownership and usage tracking of all memory under its control. |
| Memory partitioning between VMs is a fundamental security feature. |
| |
| - Interrupt Virtualization: |
| |
| Interrupt ownership is tracked and interrupt delivery is directly to the |
| assigned VM. Gunyah makes use of hardware interrupt virtualization where |
| possible. |
| |
| - Inter-VM Communication: |
| |
| There are several different mechanisms provided for communicating between VMs. |
| |
| 1. Message queues |
| 2. Doorbells |
| 3. Virtio MMIO transport |
| 4. Shared memory |
| |
| - Virtual platform: |
| |
| Architectural devices such as interrupt controllers and CPU timers are |
| directly provided by the hypervisor as well as core virtual platform devices |
| and system APIs such as ARM PSCI. |
| |
| - Device Virtualization: |
| |
| Para-virtualization of devices is supported using inter-VM communication and |
| virtio transport support. Select stage 2 faults by virtual machines that use |
| proxy-scheduled vCPUs can be handled directly by Linux to provide Type-2 |
| hypervisor style on-demand paging and/or device emulation. |
| |
| Architectures supported |
| ======================= |
| AArch64 with a GICv3 or GICv4.1 |
| |
| Resources and Capabilities |
| ========================== |
| |
| Services/resources provided by the Gunyah hypervisor are accessible to a |
| virtual machine through capabilities. A capability is an access control |
| token granting the holder a set of permissions to operate on a specific |
| hypervisor object (conceptually similar to a file-descriptor). |
| For example, inter-VM communication using Gunyah doorbells and message queues |
| is performed using hypercalls taking Capability ID arguments for the required |
| IPC objects. These resources are described in Linux as a struct gunyah_resource. |
| |
| Unlike UNIX file descriptors, there is no path-based or similar lookup of |
| an object to create a new Capability, meaning simpler security analysis. |
| Creation of a new Capability requires the holding of a set of privileged |
| Capabilities which are typically never given out by the Resource Manager (RM). |
| |
| Gunyah itself provides no APIs for Capability ID discovery. Enumeration of |
| Capability IDs is provided by RM as a higher level service to VMs. |
| |
| Resource Manager |
| ================ |
| |
| The Gunyah Resource Manager (RM) is a privileged application VM supporting the |
| Gunyah Hypervisor. It provides policy enforcement aspects of the virtualization |
| system. The resource manager can be treated as an extension of the Hypervisor |
| but is separated to its own partition to ensure that the hypervisor layer itself |
| remains small and secure and to maintain a separation of policy and mechanism in |
| the platform. The resource manager runs at arm64 NS-EL1, similar to other |
| virtual machines. |
| |
| Communication with the resource manager from other virtual machines happens as |
| described in message-queue.rst. Details about the specific messages can be found |
| in drivers/virt/gunyah/rsc_mgr.c |
| |
| :: |
| |
| +-------+ +--------+ +--------+ |
| | RM | | VM_A | | VM_B | |
| +-.-.-.-+ +---.----+ +---.----+ |
| | | | | |
| +-.-.-----------.------------.----+ |
| | | \==========/ | | |
| | \========================/ | |
| | Gunyah | |
| +---------------------------------+ |
| |
| The source for the resource manager is available at |
| https://github.com/quic/gunyah-resource-manager. |
| |
| The resource manager provides the following features: |
| |
| - VM lifecycle management: allocating a VM, starting VMs, destruction of VMs |
| - VM access control policy, including memory sharing and lending |
| - Interrupt routing configuration |
| - Forwarding of system-level events (e.g. VM shutdown) to owner VM |
| - Resource (capability) discovery |
| |
| A VM requires boot configuration to establish communication with the resource |
| manager. This is provided to VMs via a 'hypervisor' device tree node which is |
| overlaid to the VMs DT by the RM. This node lets guests know they are running |
| as a Gunyah guest VM, how to communicate with resource manager, and basic |
| description and capabilities of this VM. See |
| Documentation/devicetree/bindings/firmware/gunyah-hypervisor.yaml for a |
| description of this node. |