github.com/wasilibs/wazerox@v0.0.0-20240124024944-4923be63ab5f/cmd/wazero/testdata/wasi_fd.wat (about) 1 ;; $wasi_fd is a WASI command which reads from bear.txt 2 (module $wasi_fd 3 ;; path_open returns a file descriptor to a path 4 ;; 5 ;; See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-args_sizes_get---errno-size-size 6 (import "wasi_snapshot_preview1" "path_open" 7 (func $wasi.path_open (param $fd i32) (param $dirflags i32) (param $path i32) (param $path_len i32) (param $oflags i32) (param $fs_rights_base i64) (param $fs_rights_inheriting i64) (param $fdflags i32) (param $result.opened_fd i32) (result (;errno;) i32))) 8 9 ;; fd_read reads bytes from a file descriptor. 10 ;; 11 ;; See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_read 12 (import "wasi_snapshot_preview1" "fd_read" 13 (func $wasi.fd_read (param $fd i32) (param $iovs i32) (param $iovs_len i32) (param $result.size i32) (result (;errno;) i32))) 14 15 ;; fd_write write bytes to a file descriptor. 16 ;; 17 ;; See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_write 18 (import "wasi_snapshot_preview1" "fd_write" 19 (func $wasi.fd_write (param $fd i32) (param $iovs i32) (param $iovs_len i32) (param $result.size i32) (result (;errno;) i32))) 20 21 ;; WASI commands are required to export "memory". Particularly, imported functions mutate this. 22 ;; 23 ;; Note: 1 is the size in pages (64KB), not bytes! 24 ;; See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#memories%E2%91%A7 25 (memory (export "memory") 1) 26 27 ;; $iovs are offset/length pairs in memory fd_write copies to the file descriptor. 28 ;; $main will only write one offset/length pair, corresponding to a read buffer 29 (global $iovs i32 i32.const 1024) ;; 1024 is an arbitrary offset 30 31 ;; WASI parameters are usually memory offsets, you can ignore values by writing them to an unread offset. 32 (global $ignored i32 i32.const 32768) 33 34 ;; _start is a special function defined by a WASI Command that runs like a main function would. 35 ;; 36 ;; See https://github.com/WebAssembly/WASI/blob/snapshot-01/design/application-abi.md#current-unstable-abi 37 (func $main (export "_start") 38 ;; First open the path 39 (call $wasi.path_open 40 (i32.const 3) ;; fd of fs root 41 (i32.const 0) ;; ignore $dirflags 42 (i32.const 5000) ;; path is in data 43 (i32.const 8) ;; path len 44 (i32.const 0) ;; ignore $oflags 45 (i64.const 0) ;; ignore $fs_rights_base 46 (i64.const 0) ;; ignore $fs_rights_inheriting 47 (i32.const 0) ;; ignore $fdflags 48 (i32.const 0) ;; write result fd to memory offset 0 49 ) 50 drop ;; ignore the errno returned 51 52 ;; set iovs to a 50 byte read buffer at offset 100 53 (i32.store (global.get $iovs) (i32.const 100)) 54 (i32.store (i32.add (global.get $iovs) (i32.const 4)) (i32.const 50)) 55 56 (call $wasi.fd_read 57 (i32.load (i32.const 0)) ;; load from offset 0 which has fd of file 58 (global.get $iovs) ;; $iovs is the start offset of the IO vectors to read into. 59 (i32.const 1) ;; $iovs_len is the count of offset/length pairs to read from iovs 60 (i32.add (global.get $iovs) (i32.const 4)) ;; set number of bytes read as buffer length for fd_write below 61 ) 62 drop ;; ignore the errno returned 63 64 ;; Finally, write the memory region to the file. 65 (call $wasi.fd_write 66 (i32.const 1) ;; $fd is a file descriptor and 1 is stdout (console). 67 (global.get $iovs) ;; $iovs is the start offset of the IO vectors to copy. 68 (i32.const 1) ;; $iovs_len is the count of offset/length pairs to copy to memory. 69 (global.get $ignored) ;; ignore $result.size as we aren't verifying it. 70 ) 71 drop ;; ignore the errno returned 72 ) 73 (data $.rodata (i32.const 5000) "bear.txt") 74 )