#![no_std]
#![deny(unsafe_code)]
#![deny(missing_docs)]
#![deny(clippy::all)]
#![warn(clippy::pedantic)]
#![allow(clippy::new_without_default)]
#![allow(clippy::empty_line_after_doc_comments)]
#![allow(clippy::identity_op)]
#![allow(clippy::cast_possible_truncation)]
#![allow(clippy::cast_lossless)]
#![allow(clippy::missing_errors_doc)]
#![allow(clippy::missing_panics_doc)]
#![allow(clippy::must_use_candidate)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::doc_markdown)]
#![allow(clippy::similar_names)]
#![allow(clippy::verbose_bit_mask)]
#![allow(clippy::needless_pass_by_value)]
#![allow(clippy::unnecessary_wraps)]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
#[cfg(target_arch = "aarch64")]
#[allow(unsafe_code)]
pub mod aarch64;
use rvm_types::{GuestPhysAddr, PhysAddr, RvmResult};
pub trait Platform {
fn cpu_count(&self) -> usize;
fn total_memory(&self) -> u64;
fn halt(&self) -> !;
}
pub trait MmuOps {
fn map_page(&mut self, guest: GuestPhysAddr, host: PhysAddr) -> RvmResult<()>;
fn unmap_page(&mut self, guest: GuestPhysAddr) -> RvmResult<()>;
fn translate(&self, guest: GuestPhysAddr) -> RvmResult<PhysAddr>;
fn flush_tlb(&mut self, guest: GuestPhysAddr, page_count: usize) -> RvmResult<()>;
}
pub trait TimerOps {
fn now_ns(&self) -> u64;
fn set_deadline_ns(&mut self, ns_from_now: u64) -> RvmResult<()>;
fn cancel_deadline(&mut self) -> RvmResult<()>;
}
pub trait InterruptOps {
fn enable(&mut self, irq: u32) -> RvmResult<()>;
fn disable(&mut self, irq: u32) -> RvmResult<()>;
fn acknowledge(&mut self) -> Option<u32>;
fn end_of_interrupt(&mut self, irq: u32);
}