sidevm_env/lib.rs
1//! Tools for writing Sidevm programs.
2
3// #![warn(missing_docs)]
4
5use core::{
6 future::Future,
7 ops::{Deref, DerefMut},
8 pin::Pin,
9 task,
10};
11use std::cell::RefCell;
12
13use crate::ocall_funcs_guest as ocall;
14use num_enum::{IntoPrimitive, TryFromPrimitive};
15use scale::{Decode, Encode};
16use tinyvec::TinyVec;
17
18pub use args_stack::RetEncode;
19pub use ocall_def::*;
20pub use sidevm_macro::main;
21pub use tasks::spawn;
22
23mod args_stack;
24mod ocall_def;
25pub mod tasks;
26pub mod messages;
27pub mod tls;
28
29cfg_if::cfg_if! {
30 if #[cfg(all(not(test), any(target_pointer_width = "32", feature = "host")))] {
31 pub type IntPtr = i32;
32 } else {
33 // For unit test
34 pub type IntPtr = i64;
35 }
36}
37
38pub type IntRet = i64;
39
40#[derive(Clone, Copy, Debug, derive_more::Display, IntoPrimitive, TryFromPrimitive)]
41#[repr(u8)]
42pub enum OcallError {
43 Ok = 0,
44 /// The ocall function is not implemented.
45 UnknownCallNumber = 1,
46 /// Given argument is an invalid pointer.
47 InvalidAddress = 2,
48 /// Given argument is invalid.
49 InvalidParameter = 3,
50 /// Given argument is not well-formed.
51 InvalidEncoding = 4,
52 /// Run out of memory.
53 NoMemory = 5,
54 /// The resource is not found.
55 NotFound = 7,
56 /// The resource does not support current operation.
57 UnsupportedOperation = 8,
58 /// IO error.
59 IoError = 9,
60 /// Resource quota is exceeded.
61 ResourceLimited = 10,
62 /// The async poll is pending.
63 Pending = 11,
64 /// Read to the end of some stream-like resource.
65 EndOfFile = 12,
66 /// The gas is not enough.
67 GasExhausted = 13,
68 /// The gas is not enough for current poll.
69 Stifled = 14,
70 /// The create resource is already exists.
71 AlreadyExists = 15,
72 /// Reserved for future use
73 Reserved16 = 16,
74 /// Reserved for future use
75 Reserved17 = 17,
76 /// Reserved for future use
77 Reserved18 = 18,
78 /// Reserved for future use
79 Reserved19 = 19,
80 /// Reserved for future use
81 Reserved20 = 20,
82 /// Reserved for future use
83 Reserved21 = 21,
84 /// Reserved for future use
85 Reserved22 = 22,
86 /// Reserved for future use
87 Reserved23 = 23,
88 /// Reserved for future use
89 Reserved24 = 24,
90 /// Reserved for future use
91 Reserved25 = 25,
92 /// Reserved for future use
93 Reserved26 = 26,
94 /// Reserved for future use
95 Reserved27 = 27,
96 /// Reserved for future use
97 Reserved28 = 28,
98 /// Reserved for future use
99 Reserved29 = 29,
100 /// Reserved for future use
101 Reserved30 = 30,
102 /// Reserved for future use
103 Reserved31 = 31,
104 /// Reserved for future use
105 Reserved32 = 32,
106 /// Reserved for future use
107 Reserved33 = 33,
108 /// Reserved for future use
109 Reserved34 = 34,
110 /// Reserved for future use
111 Reserved35 = 35,
112 /// Reserved for future use
113 Reserved36 = 36,
114 /// Reserved for future use
115 Reserved37 = 37,
116 /// Reserved for future use
117 Reserved38 = 38,
118 /// Reserved for future use
119 Reserved39 = 39,
120 /// Reserved for future use
121 Reserved40 = 40,
122 /// Reserved for future use
123 Reserved41 = 41,
124 /// Reserved for future use
125 Reserved42 = 42,
126 /// Reserved for future use
127 Reserved43 = 43,
128 /// Reserved for future use
129 Reserved44 = 44,
130 /// Reserved for future use
131 Reserved45 = 45,
132 /// Reserved for future use
133 Reserved46 = 46,
134 /// Reserved for future use
135 Reserved47 = 47,
136 /// Reserved for future use
137 Reserved48 = 48,
138 /// Reserved for future use
139 Reserved49 = 49,
140 /// Reserved for future use
141 Reserved50 = 50,
142 /// Reserved for future use
143 Reserved51 = 51,
144 /// Reserved for future use
145 Reserved52 = 52,
146 /// Reserved for future use
147 Reserved53 = 53,
148 /// Reserved for future use
149 Reserved54 = 54,
150 /// Reserved for future use
151 Reserved55 = 55,
152 /// Reserved for future use
153 Reserved56 = 56,
154 /// Reserved for future use
155 Reserved57 = 57,
156 /// Reserved for future use
157 Reserved58 = 58,
158 /// Reserved for future use
159 Reserved59 = 59,
160 /// Reserved for future use
161 Reserved60 = 60,
162 /// Reserved for future use
163 Reserved61 = 61,
164 /// Reserved for future use
165 Reserved62 = 62,
166 /// Reserved for future use
167 Reserved63 = 63,
168 /// Reserved for future use
169 Reserved64 = 64,
170 /// Reserved for future use
171 Reserved65 = 65,
172 /// Reserved for future use
173 Reserved66 = 66,
174 /// Reserved for future use
175 Reserved67 = 67,
176 /// Reserved for future use
177 Reserved68 = 68,
178 /// Reserved for future use
179 Reserved69 = 69,
180 /// Reserved for future use
181 Reserved70 = 70,
182 /// Reserved for future use
183 Reserved71 = 71,
184 /// Reserved for future use
185 Reserved72 = 72,
186 /// Reserved for future use
187 Reserved73 = 73,
188 /// Reserved for future use
189 Reserved74 = 74,
190 /// Reserved for future use
191 Reserved75 = 75,
192 /// Reserved for future use
193 Reserved76 = 76,
194 /// Reserved for future use
195 Reserved77 = 77,
196 /// Reserved for future use
197 Reserved78 = 78,
198 /// Reserved for future use
199 Reserved79 = 79,
200 /// Reserved for future use
201 Reserved80 = 80,
202 /// Reserved for future use
203 Reserved81 = 81,
204 /// Reserved for future use
205 Reserved82 = 82,
206 /// Reserved for future use
207 Reserved83 = 83,
208 /// Reserved for future use
209 Reserved84 = 84,
210 /// Reserved for future use
211 Reserved85 = 85,
212 /// Reserved for future use
213 Reserved86 = 86,
214 /// Reserved for future use
215 Reserved87 = 87,
216 /// Reserved for future use
217 Reserved88 = 88,
218 /// Reserved for future use
219 Reserved89 = 89,
220 /// Reserved for future use
221 Reserved90 = 90,
222 /// Reserved for future use
223 Reserved91 = 91,
224 /// Reserved for future use
225 Reserved92 = 92,
226 /// Reserved for future use
227 Reserved93 = 93,
228 /// Reserved for future use
229 Reserved94 = 94,
230 /// Reserved for future use
231 Reserved95 = 95,
232 /// Reserved for future use
233 Reserved96 = 96,
234 /// Reserved for future use
235 Reserved97 = 97,
236 /// Reserved for future use
237 Reserved98 = 98,
238 /// Reserved for future use
239 Reserved99 = 99,
240 /// Reserved for future use
241 Reserved100 = 100,
242 /// Reserved for future use
243 Reserved101 = 101,
244 /// Reserved for future use
245 Reserved102 = 102,
246 /// Reserved for future use
247 Reserved103 = 103,
248 /// Reserved for future use
249 Reserved104 = 104,
250 /// Reserved for future use
251 Reserved105 = 105,
252 /// Reserved for future use
253 Reserved106 = 106,
254 /// Reserved for future use
255 Reserved107 = 107,
256 /// Reserved for future use
257 Reserved108 = 108,
258 /// Reserved for future use
259 Reserved109 = 109,
260 /// Reserved for future use
261 Reserved110 = 110,
262 /// Reserved for future use
263 Reserved111 = 111,
264 /// Reserved for future use
265 Reserved112 = 112,
266 /// Reserved for future use
267 Reserved113 = 113,
268 /// Reserved for future use
269 Reserved114 = 114,
270 /// Reserved for future use
271 Reserved115 = 115,
272 /// Reserved for future use
273 Reserved116 = 116,
274 /// Reserved for future use
275 Reserved117 = 117,
276 /// Reserved for future use
277 Reserved118 = 118,
278 /// Reserved for future use
279 Reserved119 = 119,
280 /// Reserved for future use
281 Reserved120 = 120,
282 /// Reserved for future use
283 Reserved121 = 121,
284 /// Reserved for future use
285 Reserved122 = 122,
286 /// Reserved for future use
287 Reserved123 = 123,
288 /// Reserved for future use
289 Reserved124 = 124,
290 /// Reserved for future use
291 Reserved125 = 125,
292 /// Reserved for future use
293 Reserved126 = 126,
294 /// Reserved for future use
295 Reserved127 = 127,
296 /// Reserved for future use
297 Reserved128 = 128,
298 /// Reserved for future use
299 Reserved129 = 129,
300 /// Reserved for future use
301 Reserved130 = 130,
302 /// Reserved for future use
303 Reserved131 = 131,
304 /// Reserved for future use
305 Reserved132 = 132,
306 /// Reserved for future use
307 Reserved133 = 133,
308 /// Reserved for future use
309 Reserved134 = 134,
310 /// Reserved for future use
311 Reserved135 = 135,
312 /// Reserved for future use
313 Reserved136 = 136,
314 /// Reserved for future use
315 Reserved137 = 137,
316 /// Reserved for future use
317 Reserved138 = 138,
318 /// Reserved for future use
319 Reserved139 = 139,
320 /// Reserved for future use
321 Reserved140 = 140,
322 /// Reserved for future use
323 Reserved141 = 141,
324 /// Reserved for future use
325 Reserved142 = 142,
326 /// Reserved for future use
327 Reserved143 = 143,
328 /// Reserved for future use
329 Reserved144 = 144,
330 /// Reserved for future use
331 Reserved145 = 145,
332 /// Reserved for future use
333 Reserved146 = 146,
334 /// Reserved for future use
335 Reserved147 = 147,
336 /// Reserved for future use
337 Reserved148 = 148,
338 /// Reserved for future use
339 Reserved149 = 149,
340 /// Reserved for future use
341 Reserved150 = 150,
342 /// Reserved for future use
343 Reserved151 = 151,
344 /// Reserved for future use
345 Reserved152 = 152,
346 /// Reserved for future use
347 Reserved153 = 153,
348 /// Reserved for future use
349 Reserved154 = 154,
350 /// Reserved for future use
351 Reserved155 = 155,
352 /// Reserved for future use
353 Reserved156 = 156,
354 /// Reserved for future use
355 Reserved157 = 157,
356 /// Reserved for future use
357 Reserved158 = 158,
358 /// Reserved for future use
359 Reserved159 = 159,
360 /// Reserved for future use
361 Reserved160 = 160,
362 /// Reserved for future use
363 Reserved161 = 161,
364 /// Reserved for future use
365 Reserved162 = 162,
366 /// Reserved for future use
367 Reserved163 = 163,
368 /// Reserved for future use
369 Reserved164 = 164,
370 /// Reserved for future use
371 Reserved165 = 165,
372 /// Reserved for future use
373 Reserved166 = 166,
374 /// Reserved for future use
375 Reserved167 = 167,
376 /// Reserved for future use
377 Reserved168 = 168,
378 /// Reserved for future use
379 Reserved169 = 169,
380 /// Reserved for future use
381 Reserved170 = 170,
382 /// Reserved for future use
383 Reserved171 = 171,
384 /// Reserved for future use
385 Reserved172 = 172,
386 /// Reserved for future use
387 Reserved173 = 173,
388 /// Reserved for future use
389 Reserved174 = 174,
390 /// Reserved for future use
391 Reserved175 = 175,
392 /// Reserved for future use
393 Reserved176 = 176,
394 /// Reserved for future use
395 Reserved177 = 177,
396 /// Reserved for future use
397 Reserved178 = 178,
398 /// Reserved for future use
399 Reserved179 = 179,
400 /// Reserved for future use
401 Reserved180 = 180,
402 /// Reserved for future use
403 Reserved181 = 181,
404 /// Reserved for future use
405 Reserved182 = 182,
406 /// Reserved for future use
407 Reserved183 = 183,
408 /// Reserved for future use
409 Reserved184 = 184,
410 /// Reserved for future use
411 Reserved185 = 185,
412 /// Reserved for future use
413 Reserved186 = 186,
414 /// Reserved for future use
415 Reserved187 = 187,
416 /// Reserved for future use
417 Reserved188 = 188,
418 /// Reserved for future use
419 Reserved189 = 189,
420 /// Reserved for future use
421 Reserved190 = 190,
422 /// Reserved for future use
423 Reserved191 = 191,
424 /// Reserved for future use
425 Reserved192 = 192,
426 /// Reserved for future use
427 Reserved193 = 193,
428 /// Reserved for future use
429 Reserved194 = 194,
430 /// Reserved for future use
431 Reserved195 = 195,
432 /// Reserved for future use
433 Reserved196 = 196,
434 /// Reserved for future use
435 Reserved197 = 197,
436 /// Reserved for future use
437 Reserved198 = 198,
438 /// Reserved for future use
439 Reserved199 = 199,
440 /// Reserved for future use
441 Reserved200 = 200,
442 /// Reserved for future use
443 Reserved201 = 201,
444 /// Reserved for future use
445 Reserved202 = 202,
446 /// Reserved for future use
447 Reserved203 = 203,
448 /// Reserved for future use
449 Reserved204 = 204,
450 /// Reserved for future use
451 Reserved205 = 205,
452 /// Reserved for future use
453 Reserved206 = 206,
454 /// Reserved for future use
455 Reserved207 = 207,
456 /// Reserved for future use
457 Reserved208 = 208,
458 /// Reserved for future use
459 Reserved209 = 209,
460 /// Reserved for future use
461 Reserved210 = 210,
462 /// Reserved for future use
463 Reserved211 = 211,
464 /// Reserved for future use
465 Reserved212 = 212,
466 /// Reserved for future use
467 Reserved213 = 213,
468 /// Reserved for future use
469 Reserved214 = 214,
470 /// Reserved for future use
471 Reserved215 = 215,
472 /// Reserved for future use
473 Reserved216 = 216,
474 /// Reserved for future use
475 Reserved217 = 217,
476 /// Reserved for future use
477 Reserved218 = 218,
478 /// Reserved for future use
479 Reserved219 = 219,
480 /// Reserved for future use
481 Reserved220 = 220,
482 /// Reserved for future use
483 Reserved221 = 221,
484 /// Reserved for future use
485 Reserved222 = 222,
486 /// Reserved for future use
487 Reserved223 = 223,
488 /// Reserved for future use
489 Reserved224 = 224,
490 /// Reserved for future use
491 Reserved225 = 225,
492 /// Reserved for future use
493 Reserved226 = 226,
494 /// Reserved for future use
495 Reserved227 = 227,
496 /// Reserved for future use
497 Reserved228 = 228,
498 /// Reserved for future use
499 Reserved229 = 229,
500 /// Reserved for future use
501 Reserved230 = 230,
502 /// Reserved for future use
503 Reserved231 = 231,
504 /// Reserved for future use
505 Reserved232 = 232,
506 /// Reserved for future use
507 Reserved233 = 233,
508 /// Reserved for future use
509 Reserved234 = 234,
510 /// Reserved for future use
511 Reserved235 = 235,
512 /// Reserved for future use
513 Reserved236 = 236,
514 /// Reserved for future use
515 Reserved237 = 237,
516 /// Reserved for future use
517 Reserved238 = 238,
518 /// Reserved for future use
519 Reserved239 = 239,
520 /// Reserved for future use
521 Reserved240 = 240,
522 /// Reserved for future use
523 Reserved241 = 241,
524 /// Reserved for future use
525 Reserved242 = 242,
526 /// Reserved for future use
527 Reserved243 = 243,
528 /// Reserved for future use
529 Reserved244 = 244,
530 /// Reserved for future use
531 Reserved245 = 245,
532 /// Reserved for future use
533 Reserved246 = 246,
534 /// Reserved for future use
535 Reserved247 = 247,
536 /// Reserved for future use
537 Reserved248 = 248,
538 /// Reserved for future use
539 Reserved249 = 249,
540 /// Reserved for future use
541 Reserved250 = 250,
542 /// Reserved for future use
543 Reserved251 = 251,
544 /// Reserved for future use
545 Reserved252 = 252,
546 /// Reserved for future use
547 Reserved253 = 253,
548 /// Reserved for future use
549 Reserved254 = 254,
550 /// Reserved for future use
551 Reserved255 = 255,
552}
553
554impl std::error::Error for OcallError {}
555
556pub type Result<T, E = OcallError> = core::result::Result<T, E>;
557pub trait OcallEnv {
558 fn put_return(&mut self, rv: Vec<u8>) -> usize;
559 fn take_return(&mut self) -> Option<Vec<u8>>;
560}
561
562pub trait VmMemory {
563 fn copy_to_vm(&self, data: &[u8], ptr: IntPtr) -> Result<()>;
564 fn slice_from_vm(&self, ptr: IntPtr, len: IntPtr) -> Result<&[u8]>;
565 fn slice_from_vm_mut(&self, ptr: IntPtr, len: IntPtr) -> Result<&mut [u8]>;
566}
567
568extern "C" {
569 fn sidevm_ocall(
570 task_id: i32,
571 func_id: i32,
572 p0: IntPtr,
573 p1: IntPtr,
574 p2: IntPtr,
575 p3: IntPtr,
576 ) -> IntRet;
577 fn sidevm_ocall_fast_return(
578 task_id: i32,
579 func_id: i32,
580 p0: IntPtr,
581 p1: IntPtr,
582 p2: IntPtr,
583 p3: IntPtr,
584 ) -> IntRet;
585}
586
587unsafe fn do_ocall(func_id: i32, p0: IntPtr, p1: IntPtr, p2: IntPtr, p3: IntPtr) -> IntRet {
588 sidevm_ocall(tasks::current_task(), func_id, p0, p1, p2, p3)
589}
590
591unsafe fn do_ocall_fast_return(
592 func_id: i32,
593 p0: IntPtr,
594 p1: IntPtr,
595 p2: IntPtr,
596 p3: IntPtr,
597) -> IntRet {
598 sidevm_ocall_fast_return(tasks::current_task(), func_id, p0, p1, p2, p3)
599}
600
601#[derive(Default)]
602struct Buffer(TinyVec<[u8; 128]>);
603
604impl Deref for Buffer {
605 type Target = TinyVec<[u8; 128]>;
606
607 fn deref(&self) -> &Self::Target {
608 &self.0
609 }
610}
611
612impl DerefMut for Buffer {
613 fn deref_mut(&mut self) -> &mut Self::Target {
614 &mut self.0
615 }
616}
617
618impl scale::Output for Buffer {
619 fn write(&mut self, bytes: &[u8]) {
620 self.0.extend_from_slice(bytes)
621 }
622}
623
624impl AsRef<[u8]> for Buffer {
625 fn as_ref(&self) -> &[u8] {
626 self.0.as_ref()
627 }
628}
629
630fn alloc_buffer(size: usize) -> Buffer {
631 let mut buf = Buffer::default();
632 buf.0.resize(size, 0_u8);
633 buf
634}
635
636#[cfg(test)]
637mod tests;