• Jean-Philippe Brucker's avatar
    Introduce reserved memory regions · fa1076ab
    Jean-Philippe Brucker authored
    When passing devices to the guest, there might be address ranges
    unavailable to the device. For instance, if address 0x10000000 corresponds
    to an MSI doorbell, any transaction from a device to that address will be
    directed to the MSI controller and might not even reach the IOMMU. In that
    case 0x10000000 is reserved by the physical IOMMU in the guest's physical
    This patch introduces a simple API to register reserved ranges of
    addresses that should not or cannot be provided to the guest. For the
    moment it only checks that a reserved range does not overlap any user
    memory (we don't consider MMIO) and aborts otherwise.
    It should be possible instead to poke holes in the guest-physical memory
    map and report them via the architecture's preferred route:
    * ARM and PowerPC can add reserved-memory nodes to the DT they provide to
      the guest.
    * x86 could poke holes in the memory map reported with e820. This requires
      to postpone creating the memory map until at least VFIO is initialized.
    * MIPS could describe the reserved ranges with the "memmap=mm$ss" kernel
    This would also require to call KVM_SET_USER_MEMORY_REGION for all memory
    regions at the end of kvmtool initialisation. Extra care should be taken
    to ensure we don't break any architecture, since they currently rely on
    having a linear address space with at most two memory blocks.
    This patch doesn't implement any address space carving. If an abort is
    encountered, user can try to rebuild kvmtool with different addresses or
    change its IOMMU resv regions if possible.
    Reviewed-by: default avatarPunit Agrawal <punit.agrawal@arm.com>
    Signed-off-by: default avatarJean-Philippe Brucker <jean-philippe.brucker@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>