1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2017 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker //! Bindings for the Linux KVM (Kernel Virtual Machine) API. 6*bb4ee6a4SAndroid Build Coastguard Worker 7*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(any(target_os = "android", target_os = "linux"))] 8*bb4ee6a4SAndroid Build Coastguard Worker #![allow(non_upper_case_globals)] 9*bb4ee6a4SAndroid Build Coastguard Worker #![allow(non_camel_case_types)] 10*bb4ee6a4SAndroid Build Coastguard Worker #![allow(non_snake_case)] 11*bb4ee6a4SAndroid Build Coastguard Worker 12*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_io_nr; 13*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_ior_nr; 14*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_iow_nr; 15*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_iowr_nr; 16*bb4ee6a4SAndroid Build Coastguard Worker 17*bb4ee6a4SAndroid Build Coastguard Worker // Each of the below modules defines ioctls specific to their platform. 18*bb4ee6a4SAndroid Build Coastguard Worker // Along with the common ioctls, we reexport the ioctls of the current 19*bb4ee6a4SAndroid Build Coastguard Worker // platform. 20*bb4ee6a4SAndroid Build Coastguard Worker 21*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")] 22*bb4ee6a4SAndroid Build Coastguard Worker pub mod x86 { 23*bb4ee6a4SAndroid Build Coastguard Worker pub mod bindings; 24*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_ior_nr; 25*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_iow_nr; 26*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_iowr_nr; 27*bb4ee6a4SAndroid Build Coastguard Worker use data_model::flexible_array_impl; 28*bb4ee6a4SAndroid Build Coastguard Worker 29*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::bindings::*; 30*bb4ee6a4SAndroid Build Coastguard Worker 31*bb4ee6a4SAndroid Build Coastguard Worker flexible_array_impl!(kvm_cpuid2, kvm_cpuid_entry2, nent, entries); 32*bb4ee6a4SAndroid Build Coastguard Worker 33*bb4ee6a4SAndroid Build Coastguard Worker pub const KVM_MSR_FILTER_RANGE_MAX_BITS: usize = 0x2000; 34*bb4ee6a4SAndroid Build Coastguard Worker pub const KVM_MSR_FILTER_RANGE_MAX_BYTES: usize = KVM_MSR_FILTER_RANGE_MAX_BITS / 8; 35*bb4ee6a4SAndroid Build Coastguard Worker 36*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_MSR_INDEX_LIST, KVMIO, 0x02, kvm_msr_list); 37*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_SUPPORTED_CPUID, KVMIO, 0x05, kvm_cpuid2); 38*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_EMULATED_CPUID, KVMIO, 0x09, kvm_cpuid2); 39*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_XEN_HVM_CONFIG, KVMIO, 0x7a, kvm_xen_hvm_config); 40*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_PIT2, KVMIO, 0x9f, kvm_pit_state2); 41*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_PIT2, KVMIO, 0xa0, kvm_pit_state2); 42*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_MSRS, KVMIO, 0x88, kvm_msrs); 43*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_MSRS, KVMIO, 0x89, kvm_msrs); 44*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_CPUID, KVMIO, 0x8a, kvm_cpuid); 45*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_LAPIC, KVMIO, 0x8e, kvm_lapic_state); 46*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_LAPIC, KVMIO, 0x8f, kvm_lapic_state); 47*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_CPUID2, KVMIO, 0x90, kvm_cpuid2); 48*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_CPUID2, KVMIO, 0x91, kvm_cpuid2); 49*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_X86_SETUP_MCE, KVMIO, 0x9c, u64); 50*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_X86_GET_MCE_CAP_SUPPORTED, KVMIO, 0x9d, u64); 51*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_X86_SET_MCE, KVMIO, 0x9e, kvm_x86_mce); 52*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_VCPU_EVENTS, KVMIO, 0x9f, kvm_vcpu_events); 53*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_VCPU_EVENTS, KVMIO, 0xa0, kvm_vcpu_events); 54*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_DEBUGREGS, KVMIO, 0xa1, kvm_debugregs); 55*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_DEBUGREGS, KVMIO, 0xa2, kvm_debugregs); 56*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_XSAVE, KVMIO, 0xa4, kvm_xsave); 57*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_XSAVE, KVMIO, 0xa5, kvm_xsave); 58*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_XCRS, KVMIO, 0xa6, kvm_xcrs); 59*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_XCRS, KVMIO, 0xa7, kvm_xcrs); 60*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_SUPPORTED_HV_CPUID, KVMIO, 0xc1, kvm_cpuid2); 61*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_X86_SET_MSR_FILTER, KVMIO, 0xc6, kvm_msr_filter); 62*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_XSAVE2, KVMIO, 0xcf, kvm_xsave); 63*bb4ee6a4SAndroid Build Coastguard Worker } 64*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "x86_64")] 65*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::x86::*; 66*bb4ee6a4SAndroid Build Coastguard Worker 67*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] 68*bb4ee6a4SAndroid Build Coastguard Worker pub mod aarch64 { 69*bb4ee6a4SAndroid Build Coastguard Worker pub mod bindings; 70*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_ior_nr; 71*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_iow_nr; 72*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_os = "android")] 73*bb4ee6a4SAndroid Build Coastguard Worker use base::ioctl_iowr_nr; 74*bb4ee6a4SAndroid Build Coastguard Worker pub use bindings::*; 75*bb4ee6a4SAndroid Build Coastguard Worker 76*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_ARM_SET_DEVICE_ADDR, KVMIO, 0xab, kvm_arm_device_addr); 77*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_ARM_VCPU_INIT, KVMIO, 0xae, kvm_vcpu_init); 78*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_ARM_PREFERRED_TARGET, KVMIO, 0xaf, kvm_vcpu_init); 79*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!( 80*bb4ee6a4SAndroid Build Coastguard Worker KVM_ARM_SET_COUNTER_OFFSET, 81*bb4ee6a4SAndroid Build Coastguard Worker KVMIO, 82*bb4ee6a4SAndroid Build Coastguard Worker 0xb5, 83*bb4ee6a4SAndroid Build Coastguard Worker kvm_arm_counter_offset 84*bb4ee6a4SAndroid Build Coastguard Worker ); 85*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_ARM_VCPU_FINALIZE, KVMIO, 0xc2, libc::c_int); 86*bb4ee6a4SAndroid Build Coastguard Worker 87*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_os = "android")] 88*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_PVIOMMU_SET_CONFIG, KVMIO, 0x1, kvm_vfio_iommu_config); 89*bb4ee6a4SAndroid Build Coastguard Worker } 90*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] 91*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::aarch64::*; 92*bb4ee6a4SAndroid Build Coastguard Worker 93*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "riscv64")] 94*bb4ee6a4SAndroid Build Coastguard Worker pub mod riscv64 { 95*bb4ee6a4SAndroid Build Coastguard Worker pub mod bindings; 96*bb4ee6a4SAndroid Build Coastguard Worker pub use bindings::*; 97*bb4ee6a4SAndroid Build Coastguard Worker } 98*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(target_arch = "riscv64")] 99*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::riscv64::*; 100*bb4ee6a4SAndroid Build Coastguard Worker 101*bb4ee6a4SAndroid Build Coastguard Worker // These ioctls are commonly defined on all/multiple platforms. 102*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_GET_API_VERSION, KVMIO, 0x00); 103*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_CREATE_VM, KVMIO, 0x01); 104*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_CHECK_EXTENSION, KVMIO, 0x03); 105*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_GET_VCPU_MMAP_SIZE, KVMIO, 0x04); 106*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_CREATE_VCPU, KVMIO, 0x41); 107*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_GET_DIRTY_LOG, KVMIO, 0x42, kvm_dirty_log); 108*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_SET_NR_MMU_PAGES, KVMIO, 0x44); 109*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_GET_NR_MMU_PAGES, KVMIO, 0x45); 110*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!( 111*bb4ee6a4SAndroid Build Coastguard Worker KVM_SET_USER_MEMORY_REGION, 112*bb4ee6a4SAndroid Build Coastguard Worker KVMIO, 113*bb4ee6a4SAndroid Build Coastguard Worker 0x46, 114*bb4ee6a4SAndroid Build Coastguard Worker kvm_userspace_memory_region 115*bb4ee6a4SAndroid Build Coastguard Worker ); 116*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_SET_TSS_ADDR, KVMIO, 0x47); 117*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_IDENTITY_MAP_ADDR, KVMIO, 0x48, u64); 118*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_CREATE_IRQCHIP, KVMIO, 0x60); 119*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_IRQ_LINE, KVMIO, 0x61, kvm_irq_level); 120*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_IRQCHIP, KVMIO, 0x62, kvm_irqchip); 121*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_SET_IRQCHIP, KVMIO, 0x63, kvm_irqchip); 122*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_CREATE_PIT, KVMIO, 0x64); 123*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_IRQ_LINE_STATUS, KVMIO, 0x67, kvm_irq_level); 124*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!( 125*bb4ee6a4SAndroid Build Coastguard Worker KVM_REGISTER_COALESCED_MMIO, 126*bb4ee6a4SAndroid Build Coastguard Worker KVMIO, 127*bb4ee6a4SAndroid Build Coastguard Worker 0x67, 128*bb4ee6a4SAndroid Build Coastguard Worker kvm_coalesced_mmio_zone 129*bb4ee6a4SAndroid Build Coastguard Worker ); 130*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!( 131*bb4ee6a4SAndroid Build Coastguard Worker KVM_UNREGISTER_COALESCED_MMIO, 132*bb4ee6a4SAndroid Build Coastguard Worker KVMIO, 133*bb4ee6a4SAndroid Build Coastguard Worker 0x68, 134*bb4ee6a4SAndroid Build Coastguard Worker kvm_coalesced_mmio_zone 135*bb4ee6a4SAndroid Build Coastguard Worker ); 136*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_ASSIGN_PCI_DEVICE, KVMIO, 0x69, kvm_assigned_pci_dev); 137*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_GSI_ROUTING, KVMIO, 0x6a, kvm_irq_routing); 138*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_ASSIGN_DEV_IRQ, KVMIO, 0x70, kvm_assigned_irq); 139*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_REINJECT_CONTROL, KVMIO, 0x71); 140*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_DEASSIGN_PCI_DEVICE, KVMIO, 0x72, kvm_assigned_pci_dev); 141*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_ASSIGN_SET_MSIX_NR, KVMIO, 0x73, kvm_assigned_msix_nr); 142*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!( 143*bb4ee6a4SAndroid Build Coastguard Worker KVM_ASSIGN_SET_MSIX_ENTRY, 144*bb4ee6a4SAndroid Build Coastguard Worker KVMIO, 145*bb4ee6a4SAndroid Build Coastguard Worker 0x74, 146*bb4ee6a4SAndroid Build Coastguard Worker kvm_assigned_msix_entry 147*bb4ee6a4SAndroid Build Coastguard Worker ); 148*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_DEASSIGN_DEV_IRQ, KVMIO, 0x75, kvm_assigned_irq); 149*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_IRQFD, KVMIO, 0x76, kvm_irqfd); 150*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_CREATE_PIT2, KVMIO, 0x77, kvm_pit_config); 151*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_SET_BOOT_CPU_ID, KVMIO, 0x78); 152*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_IOEVENTFD, KVMIO, 0x79, kvm_ioeventfd); 153*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_CLOCK, KVMIO, 0x7b, kvm_clock_data); 154*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_CLOCK, KVMIO, 0x7c, kvm_clock_data); 155*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_SET_TSC_KHZ, KVMIO, 0xa2); 156*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_GET_TSC_KHZ, KVMIO, 0xa3); 157*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_ASSIGN_SET_INTX_MASK, KVMIO, 0xa4, kvm_assigned_pci_dev); 158*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SIGNAL_MSI, KVMIO, 0xa5, kvm_msi); 159*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_CREATE_DEVICE, KVMIO, 0xe0, kvm_create_device); 160*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_DEVICE_ATTR, KVMIO, 0xe1, kvm_device_attr); 161*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_GET_DEVICE_ATTR, KVMIO, 0xe2, kvm_device_attr); 162*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_HAS_DEVICE_ATTR, KVMIO, 0xe3, kvm_device_attr); 163*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_RUN, KVMIO, 0x80); 164*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_REGS, KVMIO, 0x81, kvm_regs); 165*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_REGS, KVMIO, 0x82, kvm_regs); 166*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_SREGS, KVMIO, 0x83, kvm_sregs); 167*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_SREGS, KVMIO, 0x84, kvm_sregs); 168*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_TRANSLATE, KVMIO, 0x85, kvm_translation); 169*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_INTERRUPT, KVMIO, 0x86, kvm_interrupt); 170*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_SIGNAL_MASK, KVMIO, 0x8b, kvm_signal_mask); 171*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_FPU, KVMIO, 0x8c, kvm_fpu); 172*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_FPU, KVMIO, 0x8d, kvm_fpu); 173*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_TPR_ACCESS_REPORTING, KVMIO, 0x92, kvm_tpr_access_ctl); 174*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_VAPIC_ADDR, KVMIO, 0x93, kvm_vapic_addr); 175*bb4ee6a4SAndroid Build Coastguard Worker ioctl_ior_nr!(KVM_GET_MP_STATE, KVMIO, 0x98, kvm_mp_state); 176*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_MP_STATE, KVMIO, 0x99, kvm_mp_state); 177*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_NMI, KVMIO, 0x9a); 178*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_GUEST_DEBUG, KVMIO, 0x9b, kvm_guest_debug); 179*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_ENABLE_CAP, KVMIO, 0xa3, kvm_enable_cap); 180*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_DIRTY_TLB, KVMIO, 0xaa, kvm_dirty_tlb); 181*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_GET_ONE_REG, KVMIO, 0xab, kvm_one_reg); 182*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iow_nr!(KVM_SET_ONE_REG, KVMIO, 0xac, kvm_one_reg); 183*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_KVMCLOCK_CTRL, KVMIO, 0xad); 184*bb4ee6a4SAndroid Build Coastguard Worker ioctl_iowr_nr!(KVM_GET_REG_LIST, KVMIO, 0xb0, kvm_reg_list); 185*bb4ee6a4SAndroid Build Coastguard Worker ioctl_io_nr!(KVM_SMI, KVMIO, 0xb7); 186