use ax_errno::AxResult;
use axdevice_base::{AccessWidth, BaseDeviceOps, DeviceAddrRange, EmuDeviceType};
use axvm_types::GuestPhysAddrRange;
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(()),
}
}
}