use axaddrspace::{
GuestPhysAddrRange,
device::{AccessWidth, DeviceAddrRange},
};
use axdevice_base::{BaseDeviceOps, EmuDeviceType};
use axerrno::AxResult;
use crate::vgic::Vgic;
impl BaseDeviceOps<GuestPhysAddrRange> for Vgic {
fn emu_type(&self) -> EmuDeviceType {
EmuDeviceType::InterruptController
}
fn address_range(&self) -> GuestPhysAddrRange {
GuestPhysAddrRange::from_start_size(0x800_0000.into(), 0x10000)
}
fn handle_read(
&self,
addr: <GuestPhysAddrRange as DeviceAddrRange>::Addr,
width: AccessWidth,
) -> AxResult<usize> {
let addr = addr.as_usize() & 0xfff;
match width {
AccessWidth::Byte => {
self.handle_read8(addr)
}
AccessWidth::Word => {
self.handle_read16(addr)
}
AccessWidth::Dword => {
self.handle_read32(addr)
}
_ => Ok(0),
}
}
fn handle_write(
&self,
addr: <GuestPhysAddrRange as DeviceAddrRange>::Addr,
width: AccessWidth,
val: usize,
) -> AxResult {
let addr = addr.as_usize() & 0xfff;
match width {
AccessWidth::Byte => {
self.handle_write8(addr, val);
Ok(())
}
AccessWidth::Word => {
self.handle_write16(addr, val);
Ok(())
}
AccessWidth::Dword => {
self.handle_write32(addr, val);
Ok(())
}
_ => Ok(()),
}
}
}