arch: Switch to hypervisor crate

Removed the dependency on kvm-bindings and kvm-ioctls, use hypervisor
crate instead.

Signed-off-by: Michael Zhao <michael.zhao@arm.com>
This commit is contained in:
Michael Zhao 2020-07-17 14:10:54 +08:00 committed by Samuel Ortiz
parent e7288888cf
commit 6c8749adf2
10 changed files with 52 additions and 45 deletions

2
Cargo.lock generated
View File

@ -61,8 +61,6 @@ dependencies = [
"arch_gen", "arch_gen",
"byteorder", "byteorder",
"hypervisor", "hypervisor",
"kvm-bindings",
"kvm-ioctls",
"libc", "libc",
"linux-loader", "linux-loader",
"log 0.4.11", "log 0.4.11",

View File

@ -11,8 +11,6 @@ acpi = ["acpi_tables"]
anyhow = "1.0" anyhow = "1.0"
byteorder = "1.3.4" byteorder = "1.3.4"
hypervisor = { path = "../hypervisor" } hypervisor = { path = "../hypervisor" }
kvm-bindings = { git = "https://github.com/cloud-hypervisor/kvm-bindings", branch = "ch" }
kvm-ioctls = { git = "https://github.com/cloud-hypervisor/kvm-ioctls", branch = "ch" }
libc = "0.2.73" libc = "0.2.73"
log = "0.4.11" log = "0.4.11"
vm-memory = { version = "0.2.1", features = ["backend-mmap"] } vm-memory = { version = "0.2.1", features = ["backend-mmap"] }

View File

@ -1,8 +1,8 @@
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. // Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
use kvm_ioctls::DeviceFd;
use std::result; use std::result;
use std::sync::Arc;
/// Errors thrown while setting up the GIC. /// Errors thrown while setting up the GIC.
#[derive(Debug)] #[derive(Debug)]
@ -10,13 +10,13 @@ pub enum Error {
/// Error while calling KVM ioctl for setting up the global interrupt controller. /// Error while calling KVM ioctl for setting up the global interrupt controller.
CreateGIC(hypervisor::HypervisorVmError), CreateGIC(hypervisor::HypervisorVmError),
/// Error while setting device attributes for the GIC. /// Error while setting device attributes for the GIC.
SetDeviceAttribute(hypervisor::kvm_ioctls::Error), SetDeviceAttribute(hypervisor::HypervisorDeviceError),
} }
type Result<T> = result::Result<T, Error>; type Result<T> = result::Result<T, Error>;
pub trait GICDevice { pub trait GICDevice {
/// Returns the file descriptor of the GIC device /// Returns the hypervisor agnostic Device of the GIC device
fn device_fd(&self) -> &DeviceFd; fn device(&self) -> &Arc<dyn hypervisor::Device>;
/// Returns the fdt compatibility property of the device /// Returns the fdt compatibility property of the device
fn fdt_compatibility(&self) -> &str; fn fdt_compatibility(&self) -> &str;
@ -50,10 +50,10 @@ pub mod kvm {
use super::super::gicv2::kvm::KvmGICv2; use super::super::gicv2::kvm::KvmGICv2;
use super::super::gicv3::kvm::KvmGICv3; use super::super::gicv3::kvm::KvmGICv3;
use super::super::gicv3_its::kvm::KvmGICv3ITS; use super::super::gicv3_its::kvm::KvmGICv3ITS;
use super::super::layout;
use super::GICDevice; use super::GICDevice;
use super::Result; use super::Result;
use kvm_ioctls::DeviceFd; use crate::layout;
use hypervisor::kvm::kvm_bindings;
use std::boxed::Box; use std::boxed::Box;
use std::sync::Arc; use std::sync::Arc;
@ -65,7 +65,10 @@ pub mod kvm {
Self: Sized; Self: Sized;
/// Create the GIC device object /// Create the GIC device object
fn create_device(fd: DeviceFd, vcpu_count: u64) -> Box<dyn GICDevice> fn create_device(
device: Arc<dyn hypervisor::Device>,
vcpu_count: u64,
) -> Box<dyn GICDevice>
where where
Self: Sized; Self: Sized;
@ -78,7 +81,7 @@ pub mod kvm {
Self: Sized; Self: Sized;
/// Initialize a GIC device /// Initialize a GIC device
fn init_device(vm: &Arc<dyn hypervisor::Vm>) -> Result<DeviceFd> fn init_device(vm: &Arc<dyn hypervisor::Vm>) -> Result<Arc<dyn hypervisor::Device>>
where where
Self: Sized, Self: Sized,
{ {
@ -94,7 +97,7 @@ pub mod kvm {
/// Set a GIC device attribute /// Set a GIC device attribute
fn set_device_attribute( fn set_device_attribute(
fd: &DeviceFd, device: &Arc<dyn hypervisor::Device>,
group: u32, group: u32,
attr: u64, attr: u64,
addr: u64, addr: u64,
@ -109,7 +112,8 @@ pub mod kvm {
addr: addr, addr: addr,
flags: flags, flags: flags,
}; };
fd.set_device_attr(&attr) device
.set_device_attr(&attr)
.map_err(super::Error::SetDeviceAttribute)?; .map_err(super::Error::SetDeviceAttribute)?;
Ok(()) Ok(())
@ -126,7 +130,7 @@ pub mod kvm {
let nr_irqs: u32 = layout::IRQ_MAX - layout::IRQ_BASE + 1; let nr_irqs: u32 = layout::IRQ_MAX - layout::IRQ_BASE + 1;
let nr_irqs_ptr = &nr_irqs as *const u32; let nr_irqs_ptr = &nr_irqs as *const u32;
Self::set_device_attribute( Self::set_device_attribute(
gic_device.device_fd(), gic_device.device(),
kvm_bindings::KVM_DEV_ARM_VGIC_GRP_NR_IRQS, kvm_bindings::KVM_DEV_ARM_VGIC_GRP_NR_IRQS,
0, 0,
nr_irqs_ptr as u64, nr_irqs_ptr as u64,
@ -137,7 +141,7 @@ pub mod kvm {
* See https://code.woboq.org/linux/linux/virt/kvm/arm/vgic/vgic-kvm-device.c.html#211. * See https://code.woboq.org/linux/linux/virt/kvm/arm/vgic/vgic-kvm-device.c.html#211.
*/ */
Self::set_device_attribute( Self::set_device_attribute(
gic_device.device_fd(), gic_device.device(),
kvm_bindings::KVM_DEV_ARM_VGIC_GRP_CTRL, kvm_bindings::KVM_DEV_ARM_VGIC_GRP_CTRL,
u64::from(kvm_bindings::KVM_DEV_ARM_VGIC_CTRL_INIT), u64::from(kvm_bindings::KVM_DEV_ARM_VGIC_CTRL_INIT),
0, 0,

View File

@ -2,18 +2,18 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
pub mod kvm { pub mod kvm {
use super::super::gic::kvm::KvmGICDevice;
use super::super::gic::{Error, GICDevice}; use super::super::gic::{Error, GICDevice};
use std::{boxed::Box, result}; use std::{boxed::Box, result};
type Result<T> = result::Result<T, Error>; type Result<T> = result::Result<T, Error>;
use super::super::gic::kvm::KvmGICDevice; use crate::layout;
use super::super::layout; use hypervisor::kvm::kvm_bindings;
use kvm_ioctls::DeviceFd;
use std::sync::Arc; use std::sync::Arc;
/// Represent a GIC v2 device /// Represent a GIC v2 device
pub struct KvmGICv2 { pub struct KvmGICv2 {
/// The file descriptor for the KVM device /// The file descriptor for the KVM device
fd: DeviceFd, device: Arc<dyn hypervisor::Device>,
/// GIC device properties, to be used for setting up the fdt entry /// GIC device properties, to be used for setting up the fdt entry
properties: [u64; 4], properties: [u64; 4],
@ -53,8 +53,8 @@ pub mod kvm {
} }
impl GICDevice for KvmGICv2 { impl GICDevice for KvmGICv2 {
fn device_fd(&self) -> &DeviceFd { fn device(&self) -> &Arc<dyn hypervisor::Device> {
&self.fd &self.device
} }
fn device_properties(&self) -> &[u64] { fn device_properties(&self) -> &[u64] {
@ -79,9 +79,12 @@ pub mod kvm {
kvm_bindings::kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2 kvm_bindings::kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2
} }
fn create_device(fd: DeviceFd, vcpu_count: u64) -> Box<dyn GICDevice> { fn create_device(
device: Arc<dyn hypervisor::Device>,
vcpu_count: u64,
) -> Box<dyn GICDevice> {
Box::new(KvmGICv2 { Box::new(KvmGICv2 {
fd: fd, device: device,
properties: [ properties: [
KvmGICv2::get_dist_addr(), KvmGICv2::get_dist_addr(),
KvmGICv2::get_dist_size(), KvmGICv2::get_dist_size(),
@ -99,7 +102,7 @@ pub mod kvm {
/* Setting up the distributor attribute. /* Setting up the distributor attribute.
We are placing the GIC below 1GB so we need to substract the size of the distributor. */ We are placing the GIC below 1GB so we need to substract the size of the distributor. */
Self::set_device_attribute( Self::set_device_attribute(
&gic_device.device_fd(), gic_device.device(),
kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR, kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR,
u64::from(kvm_bindings::KVM_VGIC_V2_ADDR_TYPE_DIST), u64::from(kvm_bindings::KVM_VGIC_V2_ADDR_TYPE_DIST),
&KvmGICv2::get_dist_addr() as *const u64 as u64, &KvmGICv2::get_dist_addr() as *const u64 as u64,
@ -108,7 +111,7 @@ pub mod kvm {
/* Setting up the CPU attribute. */ /* Setting up the CPU attribute. */
Self::set_device_attribute( Self::set_device_attribute(
&gic_device.device_fd(), gic_device.device(),
kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR, kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR,
u64::from(kvm_bindings::KVM_VGIC_V2_ADDR_TYPE_CPU), u64::from(kvm_bindings::KVM_VGIC_V2_ADDR_TYPE_CPU),
&KvmGICv2::get_cpu_addr() as *const u64 as u64, &KvmGICv2::get_cpu_addr() as *const u64 as u64,

View File

@ -4,15 +4,15 @@
pub mod kvm { pub mod kvm {
use super::super::gic::kvm::KvmGICDevice; use super::super::gic::kvm::KvmGICDevice;
use super::super::gic::{Error, GICDevice}; use super::super::gic::{Error, GICDevice};
use super::super::layout; use crate::layout;
use kvm_ioctls::DeviceFd; use hypervisor::kvm::kvm_bindings;
use std::sync::Arc; use std::sync::Arc;
use std::{boxed::Box, result}; use std::{boxed::Box, result};
type Result<T> = result::Result<T, Error>; type Result<T> = result::Result<T, Error>;
pub struct KvmGICv3 { pub struct KvmGICv3 {
/// The file descriptor for the KVM device /// The file descriptor for the KVM device
fd: DeviceFd, device: Arc<dyn hypervisor::Device>,
/// GIC device properties, to be used for setting up the fdt entry /// GIC device properties, to be used for setting up the fdt entry
properties: [u64; 4], properties: [u64; 4],
@ -53,8 +53,8 @@ pub mod kvm {
} }
impl GICDevice for KvmGICv3 { impl GICDevice for KvmGICv3 {
fn device_fd(&self) -> &DeviceFd { fn device(&self) -> &Arc<dyn hypervisor::Device> {
&self.fd &self.device
} }
fn fdt_compatibility(&self) -> &str { fn fdt_compatibility(&self) -> &str {
@ -79,9 +79,12 @@ pub mod kvm {
kvm_bindings::kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3 kvm_bindings::kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3
} }
fn create_device(fd: DeviceFd, vcpu_count: u64) -> Box<dyn GICDevice> { fn create_device(
device: Arc<dyn hypervisor::Device>,
vcpu_count: u64,
) -> Box<dyn GICDevice> {
Box::new(KvmGICv3 { Box::new(KvmGICv3 {
fd: fd, device: device,
properties: [ properties: [
KvmGICv3::get_dist_addr(), KvmGICv3::get_dist_addr(),
KvmGICv3::get_dist_size(), KvmGICv3::get_dist_size(),
@ -100,7 +103,7 @@ pub mod kvm {
We are placing the GIC below 1GB so we need to substract the size of the distributor. We are placing the GIC below 1GB so we need to substract the size of the distributor.
*/ */
Self::set_device_attribute( Self::set_device_attribute(
&gic_device.device_fd(), gic_device.device(),
kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR, kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR,
u64::from(kvm_bindings::KVM_VGIC_V3_ADDR_TYPE_DIST), u64::from(kvm_bindings::KVM_VGIC_V3_ADDR_TYPE_DIST),
&KvmGICv3::get_dist_addr() as *const u64 as u64, &KvmGICv3::get_dist_addr() as *const u64 as u64,
@ -111,7 +114,7 @@ pub mod kvm {
We are calculating here the start of the redistributors address. We have one per CPU. We are calculating here the start of the redistributors address. We have one per CPU.
*/ */
Self::set_device_attribute( Self::set_device_attribute(
&gic_device.device_fd(), gic_device.device(),
kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR, kvm_bindings::KVM_DEV_ARM_VGIC_GRP_ADDR,
u64::from(kvm_bindings::KVM_VGIC_V3_ADDR_TYPE_REDIST), u64::from(kvm_bindings::KVM_VGIC_V3_ADDR_TYPE_REDIST),
&KvmGICv3::get_redists_addr(u64::from(gic_device.vcpu_count())) as *const u64 &KvmGICv3::get_redists_addr(u64::from(gic_device.vcpu_count())) as *const u64

View File

@ -8,11 +8,11 @@ pub mod kvm {
use super::super::gic::kvm::KvmGICDevice; use super::super::gic::kvm::KvmGICDevice;
use super::super::gic::{Error, GICDevice}; use super::super::gic::{Error, GICDevice};
use super::super::gicv3::kvm::KvmGICv3; use super::super::gicv3::kvm::KvmGICv3;
use kvm_ioctls::DeviceFd; use hypervisor::kvm::kvm_bindings;
pub struct KvmGICv3ITS { pub struct KvmGICv3ITS {
/// The file descriptor for the KVM device /// The file descriptor for the KVM device
fd: DeviceFd, device: Arc<dyn hypervisor::Device>,
/// GIC device properties, to be used for setting up the fdt entry /// GIC device properties, to be used for setting up the fdt entry
gic_properties: [u64; 4], gic_properties: [u64; 4],
@ -37,8 +37,8 @@ pub mod kvm {
} }
impl GICDevice for KvmGICv3ITS { impl GICDevice for KvmGICv3ITS {
fn device_fd(&self) -> &DeviceFd { fn device(&self) -> &Arc<dyn hypervisor::Device> {
&self.fd &self.device
} }
fn fdt_compatibility(&self) -> &str { fn fdt_compatibility(&self) -> &str {
@ -75,9 +75,12 @@ pub mod kvm {
KvmGICv3::version() KvmGICv3::version()
} }
fn create_device(fd: DeviceFd, vcpu_count: u64) -> Box<dyn GICDevice> { fn create_device(
device: Arc<dyn hypervisor::Device>,
vcpu_count: u64,
) -> Box<dyn GICDevice> {
Box::new(KvmGICv3ITS { Box::new(KvmGICv3ITS {
fd: fd, device: device,
gic_properties: [ gic_properties: [
KvmGICv3::get_dist_addr(), KvmGICv3::get_dist_addr(),
KvmGICv3::get_dist_size(), KvmGICv3::get_dist_size(),

View File

@ -17,6 +17,7 @@ pub mod regs;
pub use self::fdt::DeviceInfoForFDT; pub use self::fdt::DeviceInfoForFDT;
use crate::DeviceType; use crate::DeviceType;
use crate::RegionType; use crate::RegionType;
use hypervisor::kvm::kvm_bindings;
use std::collections::HashMap; use std::collections::HashMap;
use std::ffi::CStr; use std::ffi::CStr;
use std::fmt::Debug; use std::fmt::Debug;

View File

@ -6,7 +6,7 @@
// found in the THIRD-PARTY file. // found in the THIRD-PARTY file.
use super::get_fdt_addr; use super::get_fdt_addr;
use kvm_bindings::{ use hypervisor::kvm::kvm_bindings::{
user_pt_regs, KVM_REG_ARM64, KVM_REG_ARM64_SYSREG, KVM_REG_ARM64_SYSREG_CRM_MASK, user_pt_regs, KVM_REG_ARM64, KVM_REG_ARM64_SYSREG, KVM_REG_ARM64_SYSREG_CRM_MASK,
KVM_REG_ARM64_SYSREG_CRM_SHIFT, KVM_REG_ARM64_SYSREG_CRN_MASK, KVM_REG_ARM64_SYSREG_CRN_SHIFT, KVM_REG_ARM64_SYSREG_CRM_SHIFT, KVM_REG_ARM64_SYSREG_CRN_MASK, KVM_REG_ARM64_SYSREG_CRN_SHIFT,
KVM_REG_ARM64_SYSREG_OP0_MASK, KVM_REG_ARM64_SYSREG_OP0_SHIFT, KVM_REG_ARM64_SYSREG_OP1_MASK, KVM_REG_ARM64_SYSREG_OP0_MASK, KVM_REG_ARM64_SYSREG_OP0_SHIFT, KVM_REG_ARM64_SYSREG_OP1_MASK,

View File

@ -16,8 +16,6 @@
extern crate byteorder; extern crate byteorder;
extern crate hypervisor; extern crate hypervisor;
extern crate kvm_bindings;
extern crate kvm_ioctls;
extern crate libc; extern crate libc;
#[macro_use] #[macro_use]
extern crate log; extern crate log;

View File

@ -258,7 +258,6 @@ pub fn setup_page_tables(mem: &GuestMemoryMmap, sregs: &mut SpecialRegisters) ->
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
extern crate kvm_ioctls;
extern crate vm_memory; extern crate vm_memory;
use super::*; use super::*;