#![cfg(target_arch = "aarch64")]
use core::sync::atomic::{AtomicUsize, Ordering};
use arm_vcpu::{ArmHostOps, ArmVcpu, ArmVcpuCreateConfig, ArmVcpuResult};
struct DummyHost;
static INJECTED_INTERRUPT: AtomicUsize = AtomicUsize::new(usize::MAX);
impl ArmHostOps for DummyHost {
fn inject_virtual_interrupt(vector: u32) -> ArmVcpuResult {
INJECTED_INTERRUPT.store(vector as usize, Ordering::Relaxed);
Ok(())
}
fn finish_pending_host_irq(_raw_ack: u32) -> Option<usize> {
None
}
fn handle_current_host_irq() {}
}
#[test]
fn virtual_interrupt_id_preserves_full_gic_intid() {
const HOST_UART_INTID: usize = 365;
INJECTED_INTERRUPT.store(usize::MAX, Ordering::Relaxed);
let mut vcpu = ArmVcpu::<DummyHost>::new(1, 0, ArmVcpuCreateConfig::default()).unwrap();
vcpu.inject_interrupt(HOST_UART_INTID).unwrap();
assert_eq!(INJECTED_INTERRUPT.load(Ordering::Relaxed), HOST_UART_INTID);
}