crosvm/vfio_sys/bindgen.sh
Pierre-Clément Tosi fdb527c202 vfio: Add support for pKVM-VFIO pvIOMMUs
Teach crosvm to spawn para-virtualized IOMMUs emulated by pKVM, which
are used by protected VMs to control the DMA translation regime of their
assigned (physical) devices without relying on the (untrusted) host or
VMM.

Implement a virtual topology with a 1-to-1 mapping between VFIO devices
and pvIOMMUs (i.e. no support for multiple devices per pvIOMMU nor for
multiple pvIOMMUs per device).

To allow guests to refer to individual pvIOMMUs in calls to the
hypervisor (for example, to map/unmap DMA), they are given an ID, which
the uAPI defines as the FD returned from one of its ioctls.

Like the rest of pKVM, this feature is specific to Android on AArch64.

Note: This makes use of a uAPI that is currently only available on some
      experimental (non-production) Android kernels and is likely to
      change!

TEST=tools/run_tests
BUG=b:306110430

Change-Id: I00c065754cffa39307272ad00698647e56404894
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/5009546
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
2023-11-15 10:50:46 +00:00

73 lines
2.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# Copyright 2022 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Regenerate vfio_sys bindgen bindings.
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")/.."
source tools/impl/bindgen-common.sh
# VFIO_TYPE is translated as a u8 since it is a char constant, but it needs to be u32 for use in
# ioctl macros.
fix_vfio_type() {
sed -E -e 's/^pub const VFIO_TYPE: u8 = (.*)u8;/pub const VFIO_TYPE: u32 = \1;/'
}
VFIO_EXTRA="// Added by vfio_sys/bindgen.sh
use zerocopy::AsBytes;
use zerocopy::FromBytes;
use zerocopy::FromZeroes;
// TODO(b/292077398): Upstream or remove ACPI notification forwarding support
pub const VFIO_PCI_ACPI_NTFY_IRQ_INDEX: std::os::raw::c_uint = 5;
#[repr(C)]
#[derive(Debug, Default)]
pub struct vfio_acpi_dsm {
pub argsz: u32,
pub padding: u32,
pub args: __IncompleteArrayField<u8>,
}
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct vfio_acpi_notify_eventfd {
pub notify_eventfd: i32,
pub reserved: u32,
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct vfio_region_info_with_cap {
pub region_info: vfio_region_info,
pub cap_info: __IncompleteArrayField<u8>,
}
// vfio_iommu_type1_info_cap_iova_range minus the incomplete iova_ranges
// array, so that Copy/AsBytes/FromBytes can be implemented.
#[repr(C)]
#[derive(Debug, Default, Copy, Clone, AsBytes, FromZeroes, FromBytes)]
pub struct vfio_iommu_type1_info_cap_iova_range_header {
pub header: vfio_info_cap_header,
pub nr_iovas: u32,
pub reserved: u32,
}
// Experimental Android uABI
pub const VFIO_PKVM_PVIOMMU: u32 = 11;"
bindgen_generate \
--raw-line "${VFIO_EXTRA}" \
--allowlist-var='VFIO_.*' \
--blocklist-item='VFIO_DEVICE_API_.*_STRING' \
--allowlist-type='vfio_.*' \
--with-derive-custom "vfio_info_cap_header=FromZeroes,FromBytes,AsBytes" \
--with-derive-custom "vfio_iova_range=FromZeroes,FromBytes,AsBytes" \
"${BINDGEN_LINUX}/include/uapi/linux/vfio.h" \
-- \
-D__user= \
| replace_linux_int_types | fix_vfio_type \
> vfio_sys/src/vfio.rs