qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

linux-headers: update to 3.11

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by

Alexey Kardashevskiy and committed by
Paolo Bonzini
c5daeae1 4fe6e9ec

+254 -44
+168
linux-headers/asm-arm64/kvm.h
··· 1 + /* 2 + * Copyright (C) 2012,2013 - ARM Ltd 3 + * Author: Marc Zyngier <marc.zyngier@arm.com> 4 + * 5 + * Derived from arch/arm/include/uapi/asm/kvm.h: 6 + * Copyright (C) 2012 - Virtual Open Systems and Columbia University 7 + * Author: Christoffer Dall <c.dall@virtualopensystems.com> 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License version 2 as 11 + * published by the Free Software Foundation. 12 + * 13 + * This program is distributed in the hope that it will be useful, 14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 + * GNU General Public License for more details. 17 + * 18 + * You should have received a copy of the GNU General Public License 19 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 20 + */ 21 + 22 + #ifndef __ARM_KVM_H__ 23 + #define __ARM_KVM_H__ 24 + 25 + #define KVM_SPSR_EL1 0 26 + #define KVM_SPSR_SVC KVM_SPSR_EL1 27 + #define KVM_SPSR_ABT 1 28 + #define KVM_SPSR_UND 2 29 + #define KVM_SPSR_IRQ 3 30 + #define KVM_SPSR_FIQ 4 31 + #define KVM_NR_SPSR 5 32 + 33 + #ifndef __ASSEMBLY__ 34 + #include <asm/types.h> 35 + #include <asm/ptrace.h> 36 + 37 + #define __KVM_HAVE_GUEST_DEBUG 38 + #define __KVM_HAVE_IRQ_LINE 39 + 40 + #define KVM_REG_SIZE(id) \ 41 + (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) 42 + 43 + struct kvm_regs { 44 + struct user_pt_regs regs; /* sp = sp_el0 */ 45 + 46 + __u64 sp_el1; 47 + __u64 elr_el1; 48 + 49 + __u64 spsr[KVM_NR_SPSR]; 50 + 51 + struct user_fpsimd_state fp_regs; 52 + }; 53 + 54 + /* Supported Processor Types */ 55 + #define KVM_ARM_TARGET_AEM_V8 0 56 + #define KVM_ARM_TARGET_FOUNDATION_V8 1 57 + #define KVM_ARM_TARGET_CORTEX_A57 2 58 + 59 + #define KVM_ARM_NUM_TARGETS 3 60 + 61 + /* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */ 62 + #define KVM_ARM_DEVICE_TYPE_SHIFT 0 63 + #define KVM_ARM_DEVICE_TYPE_MASK (0xffff << KVM_ARM_DEVICE_TYPE_SHIFT) 64 + #define KVM_ARM_DEVICE_ID_SHIFT 16 65 + #define KVM_ARM_DEVICE_ID_MASK (0xffff << KVM_ARM_DEVICE_ID_SHIFT) 66 + 67 + /* Supported device IDs */ 68 + #define KVM_ARM_DEVICE_VGIC_V2 0 69 + 70 + /* Supported VGIC address types */ 71 + #define KVM_VGIC_V2_ADDR_TYPE_DIST 0 72 + #define KVM_VGIC_V2_ADDR_TYPE_CPU 1 73 + 74 + #define KVM_VGIC_V2_DIST_SIZE 0x1000 75 + #define KVM_VGIC_V2_CPU_SIZE 0x2000 76 + 77 + #define KVM_ARM_VCPU_POWER_OFF 0 /* CPU is started in OFF state */ 78 + #define KVM_ARM_VCPU_EL1_32BIT 1 /* CPU running a 32bit VM */ 79 + 80 + struct kvm_vcpu_init { 81 + __u32 target; 82 + __u32 features[7]; 83 + }; 84 + 85 + struct kvm_sregs { 86 + }; 87 + 88 + struct kvm_fpu { 89 + }; 90 + 91 + struct kvm_guest_debug_arch { 92 + }; 93 + 94 + struct kvm_debug_exit_arch { 95 + }; 96 + 97 + struct kvm_sync_regs { 98 + }; 99 + 100 + struct kvm_arch_memory_slot { 101 + }; 102 + 103 + /* If you need to interpret the index values, here is the key: */ 104 + #define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000 105 + #define KVM_REG_ARM_COPROC_SHIFT 16 106 + 107 + /* Normal registers are mapped as coprocessor 16. */ 108 + #define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT) 109 + #define KVM_REG_ARM_CORE_REG(name) (offsetof(struct kvm_regs, name) / sizeof(__u32)) 110 + 111 + /* Some registers need more space to represent values. */ 112 + #define KVM_REG_ARM_DEMUX (0x0011 << KVM_REG_ARM_COPROC_SHIFT) 113 + #define KVM_REG_ARM_DEMUX_ID_MASK 0x000000000000FF00 114 + #define KVM_REG_ARM_DEMUX_ID_SHIFT 8 115 + #define KVM_REG_ARM_DEMUX_ID_CCSIDR (0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT) 116 + #define KVM_REG_ARM_DEMUX_VAL_MASK 0x00000000000000FF 117 + #define KVM_REG_ARM_DEMUX_VAL_SHIFT 0 118 + 119 + /* AArch64 system registers */ 120 + #define KVM_REG_ARM64_SYSREG (0x0013 << KVM_REG_ARM_COPROC_SHIFT) 121 + #define KVM_REG_ARM64_SYSREG_OP0_MASK 0x000000000000c000 122 + #define KVM_REG_ARM64_SYSREG_OP0_SHIFT 14 123 + #define KVM_REG_ARM64_SYSREG_OP1_MASK 0x0000000000003800 124 + #define KVM_REG_ARM64_SYSREG_OP1_SHIFT 11 125 + #define KVM_REG_ARM64_SYSREG_CRN_MASK 0x0000000000000780 126 + #define KVM_REG_ARM64_SYSREG_CRN_SHIFT 7 127 + #define KVM_REG_ARM64_SYSREG_CRM_MASK 0x0000000000000078 128 + #define KVM_REG_ARM64_SYSREG_CRM_SHIFT 3 129 + #define KVM_REG_ARM64_SYSREG_OP2_MASK 0x0000000000000007 130 + #define KVM_REG_ARM64_SYSREG_OP2_SHIFT 0 131 + 132 + /* KVM_IRQ_LINE irq field index values */ 133 + #define KVM_ARM_IRQ_TYPE_SHIFT 24 134 + #define KVM_ARM_IRQ_TYPE_MASK 0xff 135 + #define KVM_ARM_IRQ_VCPU_SHIFT 16 136 + #define KVM_ARM_IRQ_VCPU_MASK 0xff 137 + #define KVM_ARM_IRQ_NUM_SHIFT 0 138 + #define KVM_ARM_IRQ_NUM_MASK 0xffff 139 + 140 + /* irq_type field */ 141 + #define KVM_ARM_IRQ_TYPE_CPU 0 142 + #define KVM_ARM_IRQ_TYPE_SPI 1 143 + #define KVM_ARM_IRQ_TYPE_PPI 2 144 + 145 + /* out-of-kernel GIC cpu interrupt injection irq_number field */ 146 + #define KVM_ARM_IRQ_CPU_IRQ 0 147 + #define KVM_ARM_IRQ_CPU_FIQ 1 148 + 149 + /* Highest supported SPI, from VGIC_NR_IRQS */ 150 + #define KVM_ARM_IRQ_GIC_MAX 127 151 + 152 + /* PSCI interface */ 153 + #define KVM_PSCI_FN_BASE 0x95c1ba5e 154 + #define KVM_PSCI_FN(n) (KVM_PSCI_FN_BASE + (n)) 155 + 156 + #define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0) 157 + #define KVM_PSCI_FN_CPU_OFF KVM_PSCI_FN(1) 158 + #define KVM_PSCI_FN_CPU_ON KVM_PSCI_FN(2) 159 + #define KVM_PSCI_FN_MIGRATE KVM_PSCI_FN(3) 160 + 161 + #define KVM_PSCI_RET_SUCCESS 0 162 + #define KVM_PSCI_RET_NI ((unsigned long)-1) 163 + #define KVM_PSCI_RET_INVAL ((unsigned long)-2) 164 + #define KVM_PSCI_RET_DENIED ((unsigned long)-3) 165 + 166 + #endif 167 + 168 + #endif /* __ARM_KVM_H__ */
+1
linux-headers/asm-arm64/kvm_para.h
··· 1 + #include <asm-generic/kvm_para.h>
+39 -42
linux-headers/asm-mips/kvm.h
··· 58 58 * bits[2..0] - Register 'sel' index. 59 59 * bits[7..3] - Register 'rd' index. 60 60 * bits[15..8] - Must be zero. 61 - * bits[63..16] - 1 -> CP0 registers. 61 + * bits[31..16] - 1 -> CP0 registers. 62 + * bits[51..32] - Must be zero. 63 + * bits[63..52] - As per linux/kvm.h 62 64 * 63 65 * Other sets registers may be added in the future. Each set would 64 - * have its own identifier in bits[63..16]. 65 - * 66 - * The addr field of struct kvm_one_reg must point to an aligned 67 - * 64-bit wide location. For registers that are narrower than 68 - * 64-bits, the value is stored in the low order bits of the location, 69 - * and sign extended to 64-bits. 66 + * have its own identifier in bits[31..16]. 70 67 * 71 68 * The registers defined in struct kvm_regs are also accessible, the 72 69 * id values for these are below. 73 70 */ 74 71 75 - #define KVM_REG_MIPS_R0 0 76 - #define KVM_REG_MIPS_R1 1 77 - #define KVM_REG_MIPS_R2 2 78 - #define KVM_REG_MIPS_R3 3 79 - #define KVM_REG_MIPS_R4 4 80 - #define KVM_REG_MIPS_R5 5 81 - #define KVM_REG_MIPS_R6 6 82 - #define KVM_REG_MIPS_R7 7 83 - #define KVM_REG_MIPS_R8 8 84 - #define KVM_REG_MIPS_R9 9 85 - #define KVM_REG_MIPS_R10 10 86 - #define KVM_REG_MIPS_R11 11 87 - #define KVM_REG_MIPS_R12 12 88 - #define KVM_REG_MIPS_R13 13 89 - #define KVM_REG_MIPS_R14 14 90 - #define KVM_REG_MIPS_R15 15 91 - #define KVM_REG_MIPS_R16 16 92 - #define KVM_REG_MIPS_R17 17 93 - #define KVM_REG_MIPS_R18 18 94 - #define KVM_REG_MIPS_R19 19 95 - #define KVM_REG_MIPS_R20 20 96 - #define KVM_REG_MIPS_R21 21 97 - #define KVM_REG_MIPS_R22 22 98 - #define KVM_REG_MIPS_R23 23 99 - #define KVM_REG_MIPS_R24 24 100 - #define KVM_REG_MIPS_R25 25 101 - #define KVM_REG_MIPS_R26 26 102 - #define KVM_REG_MIPS_R27 27 103 - #define KVM_REG_MIPS_R28 28 104 - #define KVM_REG_MIPS_R29 29 105 - #define KVM_REG_MIPS_R30 30 106 - #define KVM_REG_MIPS_R31 31 72 + #define KVM_REG_MIPS_R0 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0) 73 + #define KVM_REG_MIPS_R1 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 1) 74 + #define KVM_REG_MIPS_R2 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 2) 75 + #define KVM_REG_MIPS_R3 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 3) 76 + #define KVM_REG_MIPS_R4 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 4) 77 + #define KVM_REG_MIPS_R5 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 5) 78 + #define KVM_REG_MIPS_R6 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 6) 79 + #define KVM_REG_MIPS_R7 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 7) 80 + #define KVM_REG_MIPS_R8 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 8) 81 + #define KVM_REG_MIPS_R9 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 9) 82 + #define KVM_REG_MIPS_R10 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 10) 83 + #define KVM_REG_MIPS_R11 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 11) 84 + #define KVM_REG_MIPS_R12 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 12) 85 + #define KVM_REG_MIPS_R13 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 13) 86 + #define KVM_REG_MIPS_R14 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 14) 87 + #define KVM_REG_MIPS_R15 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 15) 88 + #define KVM_REG_MIPS_R16 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 16) 89 + #define KVM_REG_MIPS_R17 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 17) 90 + #define KVM_REG_MIPS_R18 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 18) 91 + #define KVM_REG_MIPS_R19 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 19) 92 + #define KVM_REG_MIPS_R20 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 20) 93 + #define KVM_REG_MIPS_R21 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 21) 94 + #define KVM_REG_MIPS_R22 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 22) 95 + #define KVM_REG_MIPS_R23 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 23) 96 + #define KVM_REG_MIPS_R24 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 24) 97 + #define KVM_REG_MIPS_R25 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 25) 98 + #define KVM_REG_MIPS_R26 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 26) 99 + #define KVM_REG_MIPS_R27 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 27) 100 + #define KVM_REG_MIPS_R28 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 28) 101 + #define KVM_REG_MIPS_R29 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 29) 102 + #define KVM_REG_MIPS_R30 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 30) 103 + #define KVM_REG_MIPS_R31 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 31) 107 104 108 - #define KVM_REG_MIPS_HI 32 109 - #define KVM_REG_MIPS_LO 33 110 - #define KVM_REG_MIPS_PC 34 105 + #define KVM_REG_MIPS_HI (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 32) 106 + #define KVM_REG_MIPS_LO (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 33) 107 + #define KVM_REG_MIPS_PC (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 34) 111 108 112 109 /* 113 110 * KVM MIPS specific structures and definitions
+3
linux-headers/linux/kvm.h
··· 666 666 #define KVM_CAP_IRQ_MPIC 90 667 667 #define KVM_CAP_PPC_RTAS 91 668 668 #define KVM_CAP_IRQ_XICS 92 669 + #define KVM_CAP_ARM_EL1_32BIT 93 669 670 670 671 #ifdef KVM_CAP_IRQ_ROUTING 671 672 ··· 783 784 #define KVM_REG_IA64 0x3000000000000000ULL 784 785 #define KVM_REG_ARM 0x4000000000000000ULL 785 786 #define KVM_REG_S390 0x5000000000000000ULL 787 + #define KVM_REG_ARM64 0x6000000000000000ULL 788 + #define KVM_REG_MIPS 0x7000000000000000ULL 786 789 787 790 #define KVM_REG_SIZE_SHIFT 52 788 791 #define KVM_REG_SIZE_MASK 0x00f0000000000000ULL
+40 -2
linux-headers/linux/vfio.h
··· 22 22 /* Extensions */ 23 23 24 24 #define VFIO_TYPE1_IOMMU 1 25 + #define VFIO_SPAPR_TCE_IOMMU 2 25 26 26 27 /* 27 28 * The IOCTL interface is designed for extensibility by embedding the ··· 361 362 #define VFIO_IOMMU_MAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 13) 362 363 363 364 /** 364 - * VFIO_IOMMU_UNMAP_DMA - _IOW(VFIO_TYPE, VFIO_BASE + 14, struct vfio_dma_unmap) 365 + * VFIO_IOMMU_UNMAP_DMA - _IOWR(VFIO_TYPE, VFIO_BASE + 14, 366 + * struct vfio_dma_unmap) 365 367 * 366 368 * Unmap IO virtual addresses using the provided struct vfio_dma_unmap. 367 - * Caller sets argsz. 369 + * Caller sets argsz. The actual unmapped size is returned in the size 370 + * field. No guarantee is made to the user that arbitrary unmaps of iova 371 + * or size different from those used in the original mapping call will 372 + * succeed. 368 373 */ 369 374 struct vfio_iommu_type1_dma_unmap { 370 375 __u32 argsz; ··· 374 379 }; 375 380 376 381 #define VFIO_IOMMU_UNMAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 14) 382 + 383 + /* 384 + * IOCTLs to enable/disable IOMMU container usage. 385 + * No parameters are supported. 386 + */ 387 + #define VFIO_IOMMU_ENABLE _IO(VFIO_TYPE, VFIO_BASE + 15) 388 + #define VFIO_IOMMU_DISABLE _IO(VFIO_TYPE, VFIO_BASE + 16) 389 + 390 + /* -------- Additional API for SPAPR TCE (Server POWERPC) IOMMU -------- */ 391 + 392 + /* 393 + * The SPAPR TCE info struct provides the information about the PCI bus 394 + * address ranges available for DMA, these values are programmed into 395 + * the hardware so the guest has to know that information. 396 + * 397 + * The DMA 32 bit window start is an absolute PCI bus address. 398 + * The IOVA address passed via map/unmap ioctls are absolute PCI bus 399 + * addresses too so the window works as a filter rather than an offset 400 + * for IOVA addresses. 401 + * 402 + * A flag will need to be added if other page sizes are supported, 403 + * so as defined here, it is always 4k. 404 + */ 405 + struct vfio_iommu_spapr_tce_info { 406 + __u32 argsz; 407 + __u32 flags; /* reserved for future use */ 408 + __u32 dma32_window_start; /* 32 bit window start (bytes) */ 409 + __u32 dma32_window_size; /* 32 bit window size (bytes) */ 410 + }; 411 + 412 + #define VFIO_IOMMU_SPAPR_TCE_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12) 413 + 414 + /* ***************************************************************** */ 377 415 378 416 #endif /* VFIO_H */
+3
linux-headers/linux/virtio_config.h
··· 51 51 * suppressed them? */ 52 52 #define VIRTIO_F_NOTIFY_ON_EMPTY 24 53 53 54 + /* Can the device handle any descriptor layout? */ 55 + #define VIRTIO_F_ANY_LAYOUT 27 56 + 54 57 #endif /* _LINUX_VIRTIO_CONFIG_H */