From a832033531611a63b0385297273ca669ea8ef002 Mon Sep 17 00:00:00 2001 From: Nuno Das Neves Date: Tue, 30 Aug 2022 00:48:08 +0000 Subject: [PATCH] devices: gic: Introduce VgicConfig and Gic::create_default_config() VgicConfig structure will be used for initializing the Vgic. Gic::create_default_config will be used everywhere we currently compute redist/msi registers. Signed-off-by: Nuno Das Neves --- devices/src/gic.rs | 23 +++++++++++++++++++++-- hypervisor/src/arch/aarch64/gic.rs | 12 ++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/devices/src/gic.rs b/devices/src/gic.rs index b37ede0bd..94693b35b 100644 --- a/devices/src/gic.rs +++ b/devices/src/gic.rs @@ -6,14 +6,17 @@ use super::interrupt_controller::{Error, InterruptController}; extern crate arch; use anyhow::anyhow; use arch::layout; -use hypervisor::{arch::aarch64::gic::Vgic, CpuState}; +use hypervisor::{ + arch::aarch64::gic::{Vgic, VgicConfig}, + CpuState, +}; use std::result; use std::sync::{Arc, Mutex}; use vm_device::interrupt::{ InterruptIndex, InterruptManager, InterruptSourceConfig, InterruptSourceGroup, LegacyIrqSourceConfig, MsiIrqGroupConfig, }; -use vm_memory::Address; +use vm_memory::address::Address; use vm_migration::{Migratable, MigratableError, Pausable, Snapshot, Snapshottable, Transportable}; use vmm_sys_util::eventfd::EventFd; @@ -52,6 +55,22 @@ impl Gic { }) } + /// Default config implied by arch::layout + pub fn create_default_config(vcpu_count: u64) -> VgicConfig { + let redists_size = layout::GIC_V3_REDIST_SIZE * vcpu_count; + let redists_addr = layout::GIC_V3_DIST_START.raw_value() - redists_size; + VgicConfig { + vcpu_count, + dist_addr: layout::GIC_V3_DIST_START.raw_value(), + dist_size: layout::GIC_V3_DIST_SIZE, + redists_addr, + redists_size, + msi_addr: redists_addr - layout::GIC_V3_ITS_SIZE, + msi_size: layout::GIC_V3_ITS_SIZE, + nr_irqs: layout::IRQ_NUM, + } + } + pub fn create_vgic( &mut self, vm: &Arc, diff --git a/hypervisor/src/arch/aarch64/gic.rs b/hypervisor/src/arch/aarch64/gic.rs index d1ce535b1..9dc8e69f2 100644 --- a/hypervisor/src/arch/aarch64/gic.rs +++ b/hypervisor/src/arch/aarch64/gic.rs @@ -16,6 +16,18 @@ pub enum Error { } pub type Result = result::Result; +#[derive(Debug)] +pub struct VgicConfig { + pub vcpu_count: u64, + pub dist_addr: u64, + pub dist_size: u64, + pub redists_addr: u64, + pub redists_size: u64, + pub msi_addr: u64, + pub msi_size: u64, + pub nr_irqs: u32, +} + /// Hypervisor agnostic interface for a virtualized GIC pub trait Vgic: Send + Sync { /// Returns the fdt compatibility property of the device