mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2024-11-25 05:03:05 +00:00
fdb527c202
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>
73 lines
2.1 KiB
Bash
Executable file
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
|