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;