xen/
macros.rs

1#[macro_export]
2macro_rules! xc_check_error {
3    ($handle:expr, $rc:expr) => {
4        if $rc < 0 {
5            let handle = $handle;
6            let rc = $rc;
7
8            unsafe {
9                let err = ::xen_sys::xc_get_last_error(handle);
10                let desc = ::xen_sys::xc_error_code_to_desc((*err).code as _);
11                return Err($crate::error::XenError::Xen($crate::error::XcError {
12                    rc,
13                    code: (*err).code as _,
14                    desc: ::std::ffi::CStr::from_ptr(desc).to_str().unwrap(),
15                    backtrace: ::std::backtrace::Backtrace::capture(),
16                }));
17            }
18        }
19    };
20}
21
22#[macro_export]
23macro_rules! __RD2 {
24    ($x:expr) => {
25        if $x as u32 & 0x00000002 != 0 {
26            0x2
27        }
28        else {
29            $x as u32 & 0x1
30        }
31    };
32}
33
34#[macro_export]
35macro_rules! __RD4 {
36    ($x:expr) => {
37        if $x as u32 & 0x0000000c != 0 {
38            $crate::__RD2!(($x) >> 2) << 2
39        }
40        else {
41            $crate::__RD2!($x)
42        }
43    };
44}
45
46#[macro_export]
47macro_rules! __RD8 {
48    ($x:expr) => {
49        if $x as u32 & 0x000000f0 != 0 {
50            $crate::__RD4!(($x) >> 4) << 4
51        }
52        else {
53            $crate::__RD4!($x)
54        }
55    };
56}
57
58#[macro_export]
59macro_rules! __RD16 {
60    ($x:expr) => {
61        if $x as u32 & 0x0000ff00 != 0 {
62            $crate::__RD8!(($x) >> 8) << 8
63        }
64        else {
65            $crate::__RD8!($x)
66        }
67    };
68}
69
70#[macro_export]
71macro_rules! __RD32 {
72    ($x:expr) => {
73        if $x as u32 & 0xffff0000 != 0 {
74            $crate::__RD16!(($x) >> 16) << 16
75        }
76        else {
77            $crate::__RD16!($x)
78        }
79    };
80}
81
82#[macro_export]
83macro_rules! __RING_SIZE {
84    ($s:expr, $sz:ident) => {{
85        let s = $s;
86        let sz = $sz;
87
88        unsafe {
89            $crate::__RD32!(
90                ((sz as usize + s as usize - (*s).ring.as_mut_ptr() as *const _ as usize)
91                    / ::std::mem::size_of_val(&*(*s).ring.as_ptr())) as u32
92            )
93        }
94    }};
95}
96
97#[macro_export]
98macro_rules! SHARED_RING_INIT {
99    ($s:expr) => {{
100        let s = $s as *mut ::xen_sys::vm_event_sring;
101
102        unsafe {
103            (*s).req_prod = 0;
104            (*s).rsp_prod = 0;
105            (*s).req_event = 1;
106            (*s).rsp_event = 1;
107            (*s).pvt.pvt_pad = std::mem::zeroed();
108            (*s).__pad = std::mem::zeroed();
109        }
110    }};
111}
112
113#[macro_export]
114macro_rules! BACK_RING_ATTACH {
115    ($r:ident, $s:ident, $i:expr, $size:ident) => {
116        let _s = $s as *mut ::xen_sys::vm_event_sring;
117
118        $r.rsp_prod_pvt = $i;
119        $r.req_cons = $i;
120        $r.nr_ents = $crate::__RING_SIZE!(_s, $size);
121        $r.sring = $s as _;
122    };
123}
124
125#[macro_export]
126macro_rules! BACK_RING_INIT {
127    ($r:ident, $s:ident, $size:ident) => {
128        $crate::BACK_RING_ATTACH!($r, $s, 0, $size);
129    };
130}
131
132#[macro_export]
133macro_rules! RING_SIZE {
134    ($r:expr) => {
135        $r.nr_ents
136    };
137}
138
139#[macro_export]
140macro_rules! RING_HAS_UNCONSUMED_REQUESTS {
141    ($r:expr) => {{
142        let r = $r;
143        let req = unsafe { (*(r.sring)).req_prod - r.req_cons };
144        let rsp = $crate::RING_SIZE!(r) - (r.req_cons - r.rsp_prod_pvt);
145        if req < rsp { req } else { rsp }
146    }};
147}
148
149#[macro_export]
150macro_rules! RING_GET_REQUEST {
151    ($r:expr, $idx:ident) => {{
152        let r = $r;
153
154        unsafe {
155            let ring_slice = (*r.sring).ring.as_slice(r.nr_ents as usize);
156            ring_slice[($idx & (r.nr_ents - 1)) as usize].req
157        }
158    }};
159}
160
161#[macro_export]
162macro_rules! RING_PUT_RESPONSE {
163    ($r:expr, $idx:expr, $value:expr) => {{
164        let r = $r;
165        let idx = $idx;
166        let value = $value;
167
168        unsafe {
169            let ring_slice = (*r.sring).ring.as_mut_slice(r.nr_ents as usize);
170            ring_slice[(idx & (r.nr_ents - 1)) as usize].rsp = value;
171        }
172    }};
173}
174
175#[macro_export]
176macro_rules! RING_PUSH_RESPONSES {
177    ($name1:expr) => {{
178        let name1 = $name1;
179
180        unsafe {
181            (*(name1.sring)).rsp_prod = name1.rsp_prod_pvt;
182        }
183    }};
184}