#[cfg(target_arch = "aarch64")]
#[path = "hv_aarch64_test.rs"]
pub mod aarch64;
use std::os::fd::{AsFd, BorrowedFd};
use parking_lot::RwLock;
use crate::hv::{IrqFd, Result};
#[derive(Debug)]
struct TestIrqFdInner {
addr_hi: u32,
addr_lo: u32,
data: u32,
masked: bool,
}
impl Default for TestIrqFdInner {
fn default() -> Self {
Self {
addr_hi: 0,
addr_lo: 0,
data: 0,
masked: true,
}
}
}
#[derive(Debug, Default)]
pub struct TestIrqFd {
inner: RwLock<TestIrqFdInner>,
}
impl IrqFd for TestIrqFd {
fn get_addr_hi(&self) -> u32 {
self.inner.read().addr_hi
}
fn get_addr_lo(&self) -> u32 {
self.inner.read().addr_lo
}
fn get_data(&self) -> u32 {
self.inner.read().data
}
fn get_masked(&self) -> bool {
self.inner.read().masked
}
fn set_addr_hi(&self, val: u32) -> Result<()> {
self.inner.write().addr_hi = val;
Ok(())
}
fn set_addr_lo(&self, val: u32) -> Result<()> {
self.inner.write().addr_lo = val;
Ok(())
}
fn set_data(&self, val: u32) -> Result<()> {
self.inner.write().data = val;
Ok(())
}
fn set_masked(&self, val: bool) -> Result<bool> {
let masked = &mut self.inner.write().masked;
let changed = *masked != val;
log::debug!("val: {}, masked: {}, changed: {}", val, *masked, changed);
*masked = val;
Ok(changed)
}
}
impl AsFd for TestIrqFd {
fn as_fd(&self) -> BorrowedFd<'_> {
unreachable!()
}
}