summary refs log tree commit diff
path: root/kvm/src/cap.rs
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2017-05-03 18:11:39 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-05-08 12:40:51 -0700
commit66b86b50cad0ee726194bee54c60bfbb7abb4fbe (patch)
treea0e96663e2e7ba837d2a137b42321f9fb0c0a064 /kvm/src/cap.rs
parent48faad1bc60c818cd472ac43389e44e4446ff020 (diff)
downloadcrosvm-66b86b50cad0ee726194bee54c60bfbb7abb4fbe.tar
crosvm-66b86b50cad0ee726194bee54c60bfbb7abb4fbe.tar.gz
crosvm-66b86b50cad0ee726194bee54c60bfbb7abb4fbe.tar.bz2
crosvm-66b86b50cad0ee726194bee54c60bfbb7abb4fbe.tar.lz
crosvm-66b86b50cad0ee726194bee54c60bfbb7abb4fbe.tar.xz
crosvm-66b86b50cad0ee726194bee54c60bfbb7abb4fbe.tar.zst
crosvm-66b86b50cad0ee726194bee54c60bfbb7abb4fbe.zip
kvm: add kvm crate to safely use kvm
This change adds a library that makes the usage of kvm safe. Features
that are in this initial patch are:
- checking for kvm extensions
- creating vms and vcpus
- adding memory regions
- accessing cpu registers
- running vcpus
- using kvm_run structure on kvm exit
- registering ioevents and irqevents

TEST=cargo test [--target=armv7a-cros-linux-gnueabi]
BUG=chromium:711556

Change-Id: I1f18aad0341ef5129bc5504e9419a3c422d8bdfd
Reviewed-on: https://chromium-review.googlesource.com/478551
Commit-Ready: Dylan Reid <dgreid@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'kvm/src/cap.rs')
-rw-r--r--kvm/src/cap.rs121
1 files changed, 121 insertions, 0 deletions
diff --git a/kvm/src/cap.rs b/kvm/src/cap.rs
new file mode 100644
index 0000000..b095f82
--- /dev/null
+++ b/kvm/src/cap.rs
@@ -0,0 +1,121 @@
+// Copyright 2017 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+use kvm_sys::*;
+
+/// A capability the kernel's KVM interface can possibly expose.
+#[derive(Clone, Copy, Debug, PartialEq)]
+#[repr(u32)]
+pub enum Cap {
+    Irqchip = KVM_CAP_IRQCHIP,
+    Hlt = KVM_CAP_HLT,
+    MmuShadowCacheControl = KVM_CAP_MMU_SHADOW_CACHE_CONTROL,
+    UserMemory = KVM_CAP_USER_MEMORY,
+    SetTssAddr = KVM_CAP_SET_TSS_ADDR,
+    Vapic = KVM_CAP_VAPIC,
+    ExtCpuid = KVM_CAP_EXT_CPUID,
+    Clocksource = KVM_CAP_CLOCKSOURCE,
+    NrVcpus = KVM_CAP_NR_VCPUS,
+    NrMemslots = KVM_CAP_NR_MEMSLOTS,
+    Pit = KVM_CAP_PIT,
+    NopIoDelay = KVM_CAP_NOP_IO_DELAY,
+    PvMmu = KVM_CAP_PV_MMU,
+    MpState = KVM_CAP_MP_STATE,
+    CoalescedMmio = KVM_CAP_COALESCED_MMIO,
+    SyncMmu = KVM_CAP_SYNC_MMU,
+    Iommu = KVM_CAP_IOMMU,
+    DestroyMemoryRegionWorks = KVM_CAP_DESTROY_MEMORY_REGION_WORKS,
+    UserNmi = KVM_CAP_USER_NMI,
+    SetGuestDebug = KVM_CAP_SET_GUEST_DEBUG,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    ReinjectControl = KVM_CAP_REINJECT_CONTROL,
+    IrqRouting = KVM_CAP_IRQ_ROUTING,
+    IrqInjectStatus = KVM_CAP_IRQ_INJECT_STATUS,
+    AssignDevIrq = KVM_CAP_ASSIGN_DEV_IRQ,
+    JoinMemoryRegionsWorks = KVM_CAP_JOIN_MEMORY_REGIONS_WORKS,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    Mce = KVM_CAP_MCE,
+    Irqfd = KVM_CAP_IRQFD,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    Pit2 = KVM_CAP_PIT2,
+    SetBootCpuId = KVM_CAP_SET_BOOT_CPU_ID,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    PitState2 = KVM_CAP_PIT_STATE2,
+    Ioeventfd = KVM_CAP_IOEVENTFD,
+    SetIdentityMapAddr = KVM_CAP_SET_IDENTITY_MAP_ADDR,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    XenHvm = KVM_CAP_XEN_HVM,
+    AdjustClock = KVM_CAP_ADJUST_CLOCK,
+    InternalErrorData = KVM_CAP_INTERNAL_ERROR_DATA,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    VcpuEvents = KVM_CAP_VCPU_EVENTS,
+    S390Psw = KVM_CAP_S390_PSW,
+    PpcSegstate = KVM_CAP_PPC_SEGSTATE,
+    Hyperv = KVM_CAP_HYPERV,
+    HypervVapic = KVM_CAP_HYPERV_VAPIC,
+    HypervSpin = KVM_CAP_HYPERV_SPIN,
+    PciSegment = KVM_CAP_PCI_SEGMENT,
+    PpcPairedSingles = KVM_CAP_PPC_PAIRED_SINGLES,
+    IntrShadow = KVM_CAP_INTR_SHADOW,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    Debugregs = KVM_CAP_DEBUGREGS,
+    X86RobustSinglestep = KVM_CAP_X86_ROBUST_SINGLESTEP,
+    PpcOsi = KVM_CAP_PPC_OSI,
+    PpcUnsetIrq = KVM_CAP_PPC_UNSET_IRQ,
+    EnableCap = KVM_CAP_ENABLE_CAP,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    Xsave = KVM_CAP_XSAVE,
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    Xcrs = KVM_CAP_XCRS,
+    PpcGetPvinfo = KVM_CAP_PPC_GET_PVINFO,
+    PpcIrqLevel = KVM_CAP_PPC_IRQ_LEVEL,
+    AsyncPf = KVM_CAP_ASYNC_PF,
+    TscControl = KVM_CAP_TSC_CONTROL,
+    GetTscKhz = KVM_CAP_GET_TSC_KHZ,
+    PpcBookeSregs = KVM_CAP_PPC_BOOKE_SREGS,
+    SpaprTce = KVM_CAP_SPAPR_TCE,
+    PpcSmt = KVM_CAP_PPC_SMT,
+    PpcRma = KVM_CAP_PPC_RMA,
+    MaxVcpus = KVM_CAP_MAX_VCPUS,
+    PpcHior = KVM_CAP_PPC_HIOR,
+    PpcPapr = KVM_CAP_PPC_PAPR,
+    SwTlb = KVM_CAP_SW_TLB,
+    OneReg = KVM_CAP_ONE_REG,
+    S390Gmap = KVM_CAP_S390_GMAP,
+    TscDeadlineTimer = KVM_CAP_TSC_DEADLINE_TIMER,
+    S390Ucontrol = KVM_CAP_S390_UCONTROL,
+    SyncRegs = KVM_CAP_SYNC_REGS,
+    Pci23 = KVM_CAP_PCI_2_3,
+    KvmclockCtrl = KVM_CAP_KVMCLOCK_CTRL,
+    SignalMsi = KVM_CAP_SIGNAL_MSI,
+    PpcGetSmmuInfo = KVM_CAP_PPC_GET_SMMU_INFO,
+    S390Cow = KVM_CAP_S390_COW,
+    PpcAllocHtab = KVM_CAP_PPC_ALLOC_HTAB,
+    ReadonlyMem = KVM_CAP_READONLY_MEM,
+    IrqfdResample = KVM_CAP_IRQFD_RESAMPLE,
+    PpcBookeWatchdog = KVM_CAP_PPC_BOOKE_WATCHDOG,
+    PpcHtabFd = KVM_CAP_PPC_HTAB_FD,
+    S390CssSupport = KVM_CAP_S390_CSS_SUPPORT,
+    PpcEpr = KVM_CAP_PPC_EPR,
+    ArmPsci = KVM_CAP_ARM_PSCI,
+    ArmSetDeviceAddr = KVM_CAP_ARM_SET_DEVICE_ADDR,
+    DeviceCtrl = KVM_CAP_DEVICE_CTRL,
+    IrqMpic = KVM_CAP_IRQ_MPIC,
+    PpcRtas = KVM_CAP_PPC_RTAS,
+    IrqXics = KVM_CAP_IRQ_XICS,
+    ArmEl132bit = KVM_CAP_ARM_EL1_32BIT,
+    SpaprMultitce = KVM_CAP_SPAPR_MULTITCE,
+    ExtEmulCpuid = KVM_CAP_EXT_EMUL_CPUID,
+    HypervTime = KVM_CAP_HYPERV_TIME,
+    IoapicPolarityIgnored = KVM_CAP_IOAPIC_POLARITY_IGNORED,
+    EnableCapVm = KVM_CAP_ENABLE_CAP_VM,
+    S390Irqchip = KVM_CAP_S390_IRQCHIP,
+    IoeventfdNoLength = KVM_CAP_IOEVENTFD_NO_LENGTH,
+    VmAttributes = KVM_CAP_VM_ATTRIBUTES,
+    ArmPsci02 = KVM_CAP_ARM_PSCI_0_2,
+    PpcFixupHcall = KVM_CAP_PPC_FIXUP_HCALL,
+    PpcEnableHcall = KVM_CAP_PPC_ENABLE_HCALL,
+    CheckExtensionVm = KVM_CAP_CHECK_EXTENSION_VM,
+    S390UserSigp = KVM_CAP_S390_USER_SIGP,
+}