feat: only map GICD regs once

This commit is contained in:
2021-10-11 18:35:06 +03:00
parent 21aa6826c7
commit 2d00b675bf
2 changed files with 13 additions and 5 deletions
+4 -5
View File
@@ -4,7 +4,7 @@ use crate::dev::{
irq::{IntController, IntSource, IrqContext},
Device,
};
use crate::mem::virt::DeviceMemoryIo;
use crate::mem::virt::{DeviceMemoryIo, DeviceMemory};
use crate::sync::IrqSafeNullLock;
use crate::util::InitOnce;
use error::Errno;
@@ -52,10 +52,9 @@ impl Device for Gic {
}
unsafe fn enable(&self) -> Result<(), Errno> {
let gicd_mmio_shared =
DeviceMemoryIo::map("GICv2 shared Distributor registers", self.gicd_base, 1)?;
let gicd_mmio_banked =
DeviceMemoryIo::map("GICv2 banked Distributor registers", self.gicd_base, 1)?;
let gicd_mmio = DeviceMemory::map("GICv2 Distributor registers", self.gicd_base, 1)?;
let gicd_mmio_shared = DeviceMemoryIo::new(gicd_mmio.clone());
let gicd_mmio_banked = DeviceMemoryIo::new(gicd_mmio);
let gicc_mmio = DeviceMemoryIo::map("GICv2 CPU registers", self.gicc_base, 1)?;
let mut gicd = Gicd::new(gicd_mmio_shared, gicd_mmio_banked);
+9
View File
@@ -111,6 +111,15 @@ impl DeviceMemory {
Ok(Self { name, base, count })
}
pub unsafe fn clone(&self) -> Self {
// TODO maybe add refcount and remove "unsafe"?
Self {
name: self.name,
base: self.base,
count: self.count
}
}
}
impl<T> DeviceMemoryIo<T> {