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}