use super::{VmiOsState, state::VmiState};
use crate::{VmiCore, VmiEvent, VmiOs};
pub struct VmiContext<'a, Os>
where
Os: VmiOs,
{
state: &'a VmiState<'a, Os>,
event: &'a VmiEvent<Os::Architecture>,
}
impl<Os> Clone for VmiContext<'_, Os>
where
Os: VmiOs,
{
fn clone(&self) -> Self {
*self
}
}
impl<Os> Copy for VmiContext<'_, Os> where Os: VmiOs {}
impl<'a, Os> std::ops::Deref for VmiContext<'a, Os>
where
Os: VmiOs,
{
type Target = VmiState<'a, Os>;
fn deref(&self) -> &Self::Target {
self.state
}
}
impl<'a, Os> VmiContext<'a, Os>
where
Os: VmiOs,
{
pub fn new(state: &'a VmiState<'a, Os>, event: &'a VmiEvent<Os::Architecture>) -> Self {
debug_assert_eq!(state.registers() as *const _, event.registers() as *const _);
Self { state, event }
}
pub fn state(&self) -> VmiState<'a, Os> {
*self.state
}
pub fn event(&self) -> &VmiEvent<Os::Architecture> {
self.event
}
pub fn os(&self) -> VmiOsContext<'_, Os> {
VmiOsContext {
state: self.state.os(),
event: self.event,
}
}
}
pub struct VmiOsContext<'a, Os>
where
Os: VmiOs,
{
state: VmiOsState<'a, Os>,
event: &'a VmiEvent<Os::Architecture>,
}
impl<'a, Os> std::ops::Deref for VmiOsContext<'a, Os>
where
Os: VmiOs,
{
type Target = VmiOsState<'a, Os>;
fn deref(&self) -> &Self::Target {
&self.state
}
}
impl<Os> VmiOsContext<'_, Os>
where
Os: VmiOs,
{
pub fn core(&self) -> &VmiCore<Os::Driver> {
self.state.core()
}
pub fn underlying_os(&self) -> &Os {
self.state.underlying_os()
}
pub fn event(&self) -> &VmiEvent<Os::Architecture> {
self.event
}
}