1use super::{VmiOsState, state::VmiState};
2use crate::{VmiCore, VmiDriver, VmiEvent, os::VmiOs};
3
4pub struct VmiContext<'a, Driver, Os>
15where
16 Driver: VmiDriver,
17 Os: VmiOs<Driver>,
18{
19 state: &'a VmiState<'a, Driver, Os>,
21
22 event: &'a VmiEvent<Driver::Architecture>,
24}
25
26impl<Driver, Os> Clone for VmiContext<'_, Driver, Os>
27where
28 Driver: VmiDriver,
29 Os: VmiOs<Driver>,
30{
31 fn clone(&self) -> Self {
32 *self
33 }
34}
35
36impl<Driver, Os> Copy for VmiContext<'_, Driver, Os>
37where
38 Driver: VmiDriver,
39 Os: VmiOs<Driver>,
40{
41}
42
43impl<'a, Driver, Os> std::ops::Deref for VmiContext<'a, Driver, Os>
44where
45 Driver: VmiDriver,
46 Os: VmiOs<Driver>,
47{
48 type Target = VmiState<'a, Driver, Os>;
49
50 fn deref(&self) -> &Self::Target {
51 self.state
52 }
53}
54
55impl<'a, Driver, Os> VmiContext<'a, Driver, Os>
56where
57 Driver: VmiDriver,
58 Os: VmiOs<Driver>,
59{
60 pub fn new(
62 state: &'a VmiState<'a, Driver, Os>,
63 event: &'a VmiEvent<Driver::Architecture>,
64 ) -> Self {
65 debug_assert_eq!(state.registers() as *const _, event.registers() as *const _);
66
67 Self { state, event }
68 }
69
70 pub fn state(&self) -> VmiState<'a, Driver, Os> {
75 *self.state
76 }
77
78 pub fn event(&self) -> &VmiEvent<Driver::Architecture> {
80 self.event
81 }
82
83 pub fn os(&self) -> VmiOsContext<'_, Driver, Os> {
85 VmiOsContext {
86 state: self.state.os(),
87 event: self.event,
88 }
89 }
90}
91
92pub struct VmiOsContext<'a, Driver, Os>
94where
95 Driver: VmiDriver,
96 Os: VmiOs<Driver>,
97{
98 state: VmiOsState<'a, Driver, Os>,
100
101 event: &'a VmiEvent<Driver::Architecture>,
103}
104
105impl<'a, Driver, Os> std::ops::Deref for VmiOsContext<'a, Driver, Os>
106where
107 Driver: VmiDriver,
108 Os: VmiOs<Driver>,
109{
110 type Target = VmiOsState<'a, Driver, Os>;
111
112 fn deref(&self) -> &Self::Target {
113 &self.state
114 }
115}
116
117impl<Driver, Os> VmiOsContext<'_, Driver, Os>
118where
119 Driver: VmiDriver,
120 Os: VmiOs<Driver>,
121{
122 pub fn core(&self) -> &VmiCore<Driver> {
124 self.state.core()
125 }
126
127 pub fn underlying_os(&self) -> &Os {
129 self.state.underlying_os()
130 }
131
132 pub fn event(&self) -> &VmiEvent<Driver::Architecture> {
134 self.event
135 }
136}