mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-06 02:25:23 +00:00
895c90c5f2
ARM supports paravirtual clocks or "stolen time" accounting by allocating a page of memory in the guest memory map for a pvtime structure and then sharing that address with the guest and updating it in the host to tell the guest about how much time has been stolen from the guest because the guest hasn't been running. Read all about it here[1]. Add support to crosvm to allocate this page (for now a 64K size chunk of memory that all VCPUs share access to) and then set the address of the page in each VCPU when starting up. [1] https://www.kernel.org/doc/html/latest/virt/kvm/arm/pvtime.html#stolen-time BUG=chromium:1130828, b:169094241 TEST=emerge-trogdor crosvm && cros deploy $DUT crosvm && \ tast run $DUT crostini.Basic.buster_stable; dmesg | grep pv # in the guest shows "steal time" Change-Id: Ie3497bb22fb0e38eeff8ebac14b4213824bb6ca6 Disallow-Recycled-Builds: test-failures Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2871394 Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Stephen Boyd <swboyd@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
84 lines
3.1 KiB
Rust
84 lines
3.1 KiB
Rust
// Copyright 2020 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 base::Result;
|
|
use downcast_rs::impl_downcast;
|
|
use vm_memory::GuestAddress;
|
|
|
|
use crate::{Hypervisor, IrqRoute, IrqSource, IrqSourceChip, Vcpu, Vm};
|
|
|
|
/// Represents a version of Power State Coordination Interface (PSCI).
|
|
pub struct PsciVersion {
|
|
pub major: u32,
|
|
pub minor: u32,
|
|
}
|
|
|
|
/// A wrapper for using a VM on aarch64 and getting/setting its state.
|
|
pub trait VmAArch64: Vm {
|
|
/// Gets the `Hypervisor` that created this VM.
|
|
fn get_hypervisor(&self) -> &dyn Hypervisor;
|
|
|
|
/// Enables protected mode for the VM, creating a memslot for the firmware as needed.
|
|
/// Only works on VMs that support `VmCap::Protected`.
|
|
fn enable_protected_vm(&mut self, fw_addr: GuestAddress, fw_max_size: u64) -> Result<()>;
|
|
|
|
/// Create a Vcpu with the specified Vcpu ID.
|
|
fn create_vcpu(&self, id: usize) -> Result<Box<dyn VcpuAArch64>>;
|
|
}
|
|
|
|
/// A wrapper around creating and using a VCPU on aarch64.
|
|
pub trait VcpuAArch64: Vcpu {
|
|
/// Does ARM-specific initialization of this VCPU. Inits the VCPU with the preferred target
|
|
/// VCPU type and the specified `features`, and resets the value of all registers to defaults.
|
|
/// All VCPUs should be created before calling this function.
|
|
fn init(&self, features: &[VcpuFeature]) -> Result<()>;
|
|
|
|
/// Initializes the ARM Performance Monitor Unit v3 on this VCPU, with overflow interrupt number
|
|
/// `irq`.
|
|
fn init_pmu(&self, irq: u64) -> Result<()>;
|
|
|
|
/// Checks if ARM ParaVirtualized Time is supported on this VCPU
|
|
fn has_pvtime_support(&self) -> bool;
|
|
|
|
/// Initializes the ARM ParaVirtualized Time on this VCPU, with base address of the stolen time
|
|
/// structure as `pvtime_ipa`.
|
|
fn init_pvtime(&self, pvtime_ipa: u64) -> Result<()>;
|
|
|
|
/// Sets the value of a register on this VCPU. `reg_id` is the register ID, as specified in the
|
|
/// KVM API documentation for KVM_SET_ONE_REG.
|
|
fn set_one_reg(&self, reg_id: u64, data: u64) -> Result<()>;
|
|
|
|
/// Gets the value of a register on this VCPU. `reg_id` is the register ID, as specified in the
|
|
/// KVM API documentation for KVM_GET_ONE_REG.
|
|
fn get_one_reg(&self, reg_id: u64) -> Result<u64>;
|
|
|
|
/// Gets the current PSCI version.
|
|
fn get_psci_version(&self) -> Result<PsciVersion>;
|
|
}
|
|
|
|
impl_downcast!(VcpuAArch64);
|
|
|
|
// Convenience constructors for IrqRoutes
|
|
impl IrqRoute {
|
|
pub fn gic_irq_route(irq_num: u32) -> IrqRoute {
|
|
IrqRoute {
|
|
gsi: irq_num,
|
|
source: IrqSource::Irqchip {
|
|
chip: IrqSourceChip::Gic,
|
|
pin: irq_num,
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
/// A feature that can be enabled on a VCPU with `VcpuAArch64::init`.
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
pub enum VcpuFeature {
|
|
/// Emulate PSCI v0.2 (or a future revision backward compatible with v0.2) for the VCPU.
|
|
PsciV0_2,
|
|
/// Emulate Performance Monitor Unit v3 for the VCPU.
|
|
PmuV3,
|
|
/// Starts the VCPU in a power-off state.
|
|
PowerOff,
|
|
}
|