hypervisor/caps.rs
1// Copyright 2020 The ChromiumOS Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/// An enumeration of different hypervisor capabilities.
6#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7pub enum HypervisorCap {
8 ImmediateExit,
9 UserMemory,
10 #[cfg(target_arch = "x86_64")]
11 Xcrs,
12 #[cfg(target_arch = "x86_64")]
13 /// CPUID leaf 0x15 is available on some Intel chips and contains the TSC
14 /// frequency, which can be used to calibrate the guest's TSC clocksource;
15 /// however, it is not typically accurate enough (being off by 1-2% is a
16 /// big problem for a clocksource), and inside the guest, calibration by
17 /// other means is not always reliable.
18 ///
19 /// Hypervisors which do not provide the TSC frequency (e.g. via the kvm
20 /// pvclock) or have another suitable calibration source can declare this
21 /// capability, which causes crosvm to substitute a calibrated value in leaf
22 /// 0x15 that will be accurate enough for use in a clocksource.
23 CalibratedTscLeafRequired,
24 // By default, when swiotlb is enabled, crosvm will only specify its size in the device tree
25 // and allow the guest to decide where to allocate the buffer in guest phsyical memory.
26 //
27 // If this capability is declared, then instead crosvm will carve out space at the end of
28 // physical memory and register it as a distinct memory region. Then, both the address and
29 // size will be specified in the device tree. This region will still be reported as part
30 // of the main memory region in the device tree.
31 StaticSwiotlbAllocationRequired,
32 /// Some hypervisors (presently: Gunyah) will configure initial boot-time registers
33 /// for vCPUs without need for CrosVM to specify.
34 ///
35 /// If this capability is declared, then crosvm will not try to initialize vcpu
36 /// registers when creating the VM.
37 HypervisorInitializedBootContext,
38}
39
40/// A capability the `Vm` can possibly expose.
41#[derive(Clone, Copy, Debug, Eq, PartialEq)]
42pub enum VmCap {
43 #[cfg(target_arch = "aarch64")]
44 ArmPmuV3,
45 /// Track dirty pages
46 DirtyLog,
47 /// Paravirtualized clock device
48 PvClock,
49 /// VM can be run in protected mode, where the host does not have access to its memory.
50 Protected,
51 /// VM completes initialization of CPUID at creation time, not required after.
52 EarlyInitCpuid,
53 /// VM can detect the bus lock
54 #[cfg(target_arch = "x86_64")]
55 BusLockDetect,
56 /// Supports read-only memory regions.
57 ReadOnlyMemoryRegion,
58 /// VM can set guest memory cache noncoherent DMA flag
59 MemNoncoherentDma,
60 /// If supported, this VM supports enabling ARM SVE (Scalable Vector Extension)
61 /// by requesting `VcpuFeature::Sve` when calling `VcpuAarch64::init()`.
62 #[cfg(target_arch = "aarch64")]
63 Sve,
64}