doc/services/virtualization/ivshmem.rst
.. _ivshmem_driver:
Inter-VM Shared Memory ######################
.. contents:: :local: :depth: 2
Overview
As Zephyr is enabled to run as a guest OS on Qemu and
ACRN <https://projectacrn.github.io/latest/tutorials/using_zephyr_as_uos.html>_
it might be necessary to make VMs aware of each other, or aware of the host.
This is made possible by exposing a shared memory among parties via a feature
called ivshmem, which stands for inter-VM Shared Memory.
The two types are supported: a plain shared memory (ivshmem-plain) or a shared memory with the ability for a VM to generate an interruption on another, and thus to be interrupted as well itself (ivshmem-doorbell).
Please refer to the official Qemu ivshmem documentation <https://www.qemu.org/docs/master/system/devices/ivshmem.html>_ for more information.
Support
Zephyr supports both versions: plain and doorbell. Ivshmem driver can be built
by enabling :kconfig:option:CONFIG_IVSHMEM. By default, this will expose the plain
version. :kconfig:option:CONFIG_IVSHMEM_DOORBELL needs to be enabled to get the
doorbell version.
Because the doorbell version uses MSI-X vectors to support notification vectors,
the :kconfig:option:CONFIG_IVSHMEM_MSI_X_VECTORS has to be tweaked to the number of
vectors that will be needed.
Note that a tiny shell module can be exposed to test the ivshmem feature by
enabling :kconfig:option:CONFIG_IVSHMEM_SHELL.
ivshmem-v2
Zephyr also supports ivshmem-v2:
https://github.com/siemens/jailhouse/blob/master/Documentation/ivshmem-v2-specification.md
This is primarily used for IPC in the Jailhouse hypervisor
(e.g. :zephyr:code-sample:eth-ivshmem). It is also possible to use ivshmem-v2 without
Jailhouse by building the Siemens fork of QEMU, and modifying the QEMU launch flags:
https://github.com/siemens/qemu/tree/wip/ivshmem2
API Reference
.. doxygengroup:: ivshmem