Refactor wasmtime-wasi crate

Changes:
* uses Rust edition 2018
* returns wasm32 errno directly rather than relying on
  wasi_common::{host, memory} modules
* wraps extraction of memory and WASI context in a macro
This commit is contained in:
Jakub Konka
2019-08-26 13:20:17 +02:00
committed by Dan Gohman
parent 6a09c5538f
commit 2941c2022f
4 changed files with 119 additions and 455 deletions

View File

@@ -7,6 +7,7 @@ categories = ["wasm"]
repository = "https://github.com/CraneStation/wasmtime" repository = "https://github.com/CraneStation/wasmtime"
license = "Apache-2.0 WITH LLVM-exception" license = "Apache-2.0 WITH LLVM-exception"
readme = "README.md" readme = "README.md"
edition = "2018"
[dependencies] [dependencies]
wasmtime-runtime = { path = "../wasmtime-runtime" } wasmtime-runtime = { path = "../wasmtime-runtime" }

View File

@@ -1,3 +1,4 @@
use super::syscalls;
use cranelift_codegen::ir::types; use cranelift_codegen::ir::types;
use cranelift_codegen::{ir, isa}; use cranelift_codegen::{ir, isa};
use cranelift_entity::PrimaryMap; use cranelift_entity::PrimaryMap;
@@ -6,7 +7,6 @@ use std::cell::RefCell;
use std::collections::HashMap; use std::collections::HashMap;
use std::fs::File; use std::fs::File;
use std::rc::Rc; use std::rc::Rc;
use syscalls;
use target_lexicon::HOST; use target_lexicon::HOST;
use wasi_common::WasiCtxBuilder; use wasi_common::WasiCtxBuilder;
use wasmtime_environ::{translate_signature, Export, Module}; use wasmtime_environ::{translate_signature, Export, Module};

View File

@@ -1,14 +1,3 @@
extern crate cranelift_codegen;
extern crate cranelift_entity;
extern crate cranelift_wasm;
extern crate target_lexicon;
extern crate wasmtime_environ;
extern crate wasmtime_jit;
extern crate wasmtime_runtime;
#[macro_use]
extern crate log;
extern crate wasi_common;
mod instantiate; mod instantiate;
mod syscalls; mod syscalls;

View File

@@ -1,44 +1,8 @@
use cranelift_codegen::ir::types::{Type, I32, I64}; use cranelift_codegen::ir::types::{Type, I32, I64};
use wasi_common::{host, hostcalls, memory, wasm32, WasiCtx}; use log::trace;
use wasi_common::{hostcalls, wasm32, WasiCtx};
use wasmtime_runtime::{Export, VMContext}; use wasmtime_runtime::{Export, VMContext};
fn return_encoded_errno(e: host::__wasi_errno_t) -> wasm32::__wasi_errno_t {
let errno = memory::enc_errno(e);
trace!(" -> errno={}", wasm32::strerror(errno));
errno
}
fn get_wasi_ctx(vmctx: &mut VMContext) -> Result<&mut WasiCtx, host::__wasi_errno_t> {
unsafe {
vmctx.host_state().downcast_mut::<WasiCtx>().ok_or_else(|| {
println!("!!! no host state named WasiCtx available");
host::__WASI_EINVAL
})
}
}
fn get_memory(vmctx: &mut VMContext) -> Result<&mut [u8], host::__wasi_errno_t> {
unsafe {
match vmctx.lookup_global_export("memory") {
Some(Export::Memory {
definition,
vmctx: _,
memory: _,
}) => Ok(std::slice::from_raw_parts_mut(
(*definition).base,
(*definition).current_length,
)),
x => {
println!(
"!!! no export named \"memory\", or the export isn't a mem: {:?}",
x
);
Err(host::__WASI_EINVAL)
}
}
}
}
pub trait AbiRet { pub trait AbiRet {
type Abi; type Abi;
fn convert(self) -> Self::Abi; fn convert(self) -> Self::Abi;
@@ -110,6 +74,49 @@ impl AbiRet for () {
} }
} }
fn get_wasi_ctx(vmctx: &mut VMContext) -> Result<&mut WasiCtx, wasm32::__wasi_errno_t> {
unsafe {
vmctx.host_state().downcast_mut::<WasiCtx>().ok_or_else(|| {
println!("!!! no host state named WasiCtx available");
wasm32::__WASI_EINVAL
})
}
}
fn get_memory(vmctx: &mut VMContext) -> Result<&mut [u8], wasm32::__wasi_errno_t> {
unsafe {
match vmctx.lookup_global_export("memory") {
Some(Export::Memory {
definition,
vmctx: _,
memory: _,
}) => Ok(std::slice::from_raw_parts_mut(
(*definition).base,
(*definition).current_length,
)),
x => {
println!(
"!!! no export named \"memory\", or the export isn't a mem: {:?}",
x
);
Err(wasm32::__WASI_EINVAL)
}
}
}
}
macro_rules! ok_or_errno {
($expr:expr) => {
match $expr {
Ok(v) => v,
Err(e) => {
trace!(" -> errno={}", wasm32::strerror(e));
return e;
}
}
};
}
macro_rules! syscalls { macro_rules! syscalls {
($(pub unsafe extern "C" fn $name:ident($ctx:ident: *mut VMContext $(, $arg:ident: $ty:ty)*,) -> $ret:ty { ($(pub unsafe extern "C" fn $name:ident($ctx:ident: *mut VMContext $(, $arg:ident: $ty:ty)*,) -> $ret:ty {
$($body:tt)* $($body:tt)*
@@ -164,17 +171,8 @@ syscalls! {
argv, argv,
argv_buf, argv_buf,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::args_get(wasi_ctx, memory, argv, argv_buf) hostcalls::args_get(wasi_ctx, memory, argv, argv_buf)
} }
@@ -188,17 +186,8 @@ syscalls! {
argc, argc,
argv_buf_size, argv_buf_size,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::args_sizes_get(wasi_ctx, memory, argc, argv_buf_size) hostcalls::args_sizes_get(wasi_ctx, memory, argc, argv_buf_size)
} }
@@ -212,12 +201,7 @@ syscalls! {
clock_id, clock_id,
resolution, resolution,
); );
let memory = ok_or_errno!(get_memory(&mut *vmctx));
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::clock_res_get(memory, clock_id, resolution) hostcalls::clock_res_get(memory, clock_id, resolution)
} }
@@ -233,12 +217,7 @@ syscalls! {
precision, precision,
time, time,
); );
let memory = ok_or_errno!(get_memory(&mut *vmctx));
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::clock_time_get(memory, clock_id, precision, time) hostcalls::clock_time_get(memory, clock_id, precision, time)
} }
@@ -252,17 +231,8 @@ syscalls! {
environ, environ,
environ_buf, environ_buf,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::environ_get(wasi_ctx, memory, environ, environ_buf) hostcalls::environ_get(wasi_ctx, memory, environ, environ_buf)
} }
@@ -276,17 +246,8 @@ syscalls! {
environ_count, environ_count,
environ_buf_size, environ_buf_size,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::environ_sizes_get(wasi_ctx, memory, environ_count, environ_buf_size) hostcalls::environ_sizes_get(wasi_ctx, memory, environ_count, environ_buf_size)
} }
@@ -296,17 +257,8 @@ syscalls! {
buf: wasm32::uintptr_t, buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_prestat_get(fd={:?}, buf={:#x?})", fd, buf); trace!("fd_prestat_get(fd={:?}, buf={:#x?})", fd, buf);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_prestat_get(wasi_ctx, memory, fd, buf) hostcalls::fd_prestat_get(wasi_ctx, memory, fd, buf)
} }
@@ -317,17 +269,8 @@ syscalls! {
path_len: wasm32::size_t, path_len: wasm32::size_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_prestat_dir_name(fd={:?}, path={:#x?}, path_len={})", fd, path, path_len); trace!("fd_prestat_dir_name(fd={:?}, path={:#x?}, path_len={})", fd, path, path_len);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_prestat_dir_name(wasi_ctx, memory, fd, path, path_len) hostcalls::fd_prestat_dir_name(wasi_ctx, memory, fd, path, path_len)
} }
@@ -336,12 +279,7 @@ syscalls! {
fd: wasm32::__wasi_fd_t, fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_close(fd={:?})", fd); trace!("fd_close(fd={:?})", fd);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_close(wasi_ctx, fd) hostcalls::fd_close(wasi_ctx, fd)
} }
@@ -350,12 +288,7 @@ syscalls! {
fd: wasm32::__wasi_fd_t, fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_datasync(fd={:?})", fd); trace!("fd_datasync(fd={:?})", fd);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_datasync(wasi_ctx, fd) hostcalls::fd_datasync(wasi_ctx, fd)
} }
@@ -375,17 +308,8 @@ syscalls! {
offset, offset,
nread nread
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_pread( hostcalls::fd_pread(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -413,17 +337,8 @@ syscalls! {
offset, offset,
nwritten nwritten
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_pwrite( hostcalls::fd_pwrite(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -449,17 +364,8 @@ syscalls! {
iovs_len, iovs_len,
nread nread
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_read(wasi_ctx, memory, fd, iovs, iovs_len, nread) hostcalls::fd_read(wasi_ctx, memory, fd, iovs, iovs_len, nread)
} }
@@ -469,12 +375,7 @@ syscalls! {
to: wasm32::__wasi_fd_t, to: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_renumber(from={:?}, to={:?})", from, to); trace!("fd_renumber(from={:?}, to={:?})", from, to);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_renumber(wasi_ctx, from, to) hostcalls::fd_renumber(wasi_ctx, from, to)
} }
@@ -492,17 +393,8 @@ syscalls! {
wasm32::whence_to_str(whence), wasm32::whence_to_str(whence),
newoffset newoffset
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_seek(wasi_ctx, memory, fd, offset, whence, newoffset) hostcalls::fd_seek(wasi_ctx, memory, fd, offset, whence, newoffset)
} }
@@ -512,17 +404,8 @@ syscalls! {
newoffset: wasm32::uintptr_t, newoffset: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_tell(fd={:?}, newoffset={:#x?})", fd, newoffset); trace!("fd_tell(fd={:?}, newoffset={:#x?})", fd, newoffset);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_tell(wasi_ctx, memory, fd, newoffset) hostcalls::fd_tell(wasi_ctx, memory, fd, newoffset)
} }
@@ -532,17 +415,8 @@ syscalls! {
buf: wasm32::uintptr_t, buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_fdstat_get(fd={:?}, buf={:#x?})", fd, buf); trace!("fd_fdstat_get(fd={:?}, buf={:#x?})", fd, buf);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_fdstat_get(wasi_ctx, memory, fd, buf) hostcalls::fd_fdstat_get(wasi_ctx, memory, fd, buf)
} }
@@ -556,12 +430,7 @@ syscalls! {
fd, fd,
flags flags
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_fdstat_set_flags(wasi_ctx, fd, flags) hostcalls::fd_fdstat_set_flags(wasi_ctx, fd, flags)
} }
@@ -577,12 +446,7 @@ syscalls! {
fs_rights_base, fs_rights_base,
fs_rights_inheriting fs_rights_inheriting
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_fdstat_set_rights( hostcalls::fd_fdstat_set_rights(
wasi_ctx, wasi_ctx,
fd, fd,
@@ -596,12 +460,7 @@ syscalls! {
fd: wasm32::__wasi_fd_t, fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_sync(fd={:?})", fd); trace!("fd_sync(fd={:?})", fd);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_sync(wasi_ctx, fd) hostcalls::fd_sync(wasi_ctx, fd)
} }
@@ -619,17 +478,8 @@ syscalls! {
iovs_len, iovs_len,
nwritten nwritten
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_write(wasi_ctx, memory, fd, iovs, iovs_len, nwritten) hostcalls::fd_write(wasi_ctx, memory, fd, iovs, iovs_len, nwritten)
} }
@@ -647,12 +497,7 @@ syscalls! {
len, len,
advice advice
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_advise(wasi_ctx, fd, offset, len, advice) hostcalls::fd_advise(wasi_ctx, fd, offset, len, advice)
} }
@@ -663,12 +508,7 @@ syscalls! {
len: wasm32::__wasi_filesize_t, len: wasm32::__wasi_filesize_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_allocate(fd={:?}, offset={}, len={})", fd, offset, len); trace!("fd_allocate(fd={:?}, offset={}, len={})", fd, offset, len);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_allocate(wasi_ctx, fd, offset, len) hostcalls::fd_allocate(wasi_ctx, fd, offset, len)
} }
@@ -684,17 +524,8 @@ syscalls! {
path, path,
path_len, path_len,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_create_directory(wasi_ctx, memory, fd, path, path_len) hostcalls::path_create_directory(wasi_ctx, memory, fd, path, path_len)
} }
@@ -718,17 +549,8 @@ syscalls! {
path1, path1,
path_len1 path_len1
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_link( hostcalls::path_link(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -768,17 +590,8 @@ syscalls! {
fs_flags, fs_flags,
fd fd
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_open( hostcalls::path_open(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -810,17 +623,8 @@ syscalls! {
cookie, cookie,
buf_used, buf_used,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_readdir( hostcalls::fd_readdir(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -850,17 +654,8 @@ syscalls! {
buf_len, buf_len,
buf_used, buf_used,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_readlink( hostcalls::path_readlink(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -891,17 +686,8 @@ syscalls! {
path1, path1,
path_len1, path_len1,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_rename( hostcalls::path_rename(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -920,17 +706,8 @@ syscalls! {
buf: wasm32::uintptr_t, buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("fd_filestat_get(fd={:?}, buf={:#x?})", fd, buf); trace!("fd_filestat_get(fd={:?}, buf={:#x?})", fd, buf);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_filestat_get(wasi_ctx, memory, fd, buf) hostcalls::fd_filestat_get(wasi_ctx, memory, fd, buf)
} }
@@ -947,12 +724,7 @@ syscalls! {
st_atim, st_mtim, st_atim, st_mtim,
fstflags fstflags
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_filestat_set_times(wasi_ctx, fd, st_atim, st_mtim, fstflags) hostcalls::fd_filestat_set_times(wasi_ctx, fd, st_atim, st_mtim, fstflags)
} }
@@ -966,12 +738,7 @@ syscalls! {
fd, fd,
size size
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) {
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
hostcalls::fd_filestat_set_size(wasi_ctx, fd, size) hostcalls::fd_filestat_set_size(wasi_ctx, fd, size)
} }
@@ -991,17 +758,8 @@ syscalls! {
path_len, path_len,
buf buf
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_filestat_get(wasi_ctx, memory, fd, flags, path, path_len, buf) hostcalls::path_filestat_get(wasi_ctx, memory, fd, flags, path, path_len, buf)
} }
@@ -1024,17 +782,8 @@ syscalls! {
st_atim, st_mtim, st_atim, st_mtim,
fstflags fstflags
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_filestat_set_times( hostcalls::path_filestat_set_times(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -1064,17 +813,8 @@ syscalls! {
path1, path1,
path_len1 path_len1
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_symlink( hostcalls::path_symlink(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -1098,17 +838,8 @@ syscalls! {
path, path,
path_len path_len
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_unlink_file(wasi_ctx, memory, fd, path, path_len) hostcalls::path_unlink_file(wasi_ctx, memory, fd, path, path_len)
} }
@@ -1124,17 +855,8 @@ syscalls! {
path, path,
path_len path_len
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::path_remove_directory(wasi_ctx, memory, fd, path, path_len) hostcalls::path_remove_directory(wasi_ctx, memory, fd, path, path_len)
} }
@@ -1152,18 +874,12 @@ syscalls! {
nsubscriptions, nsubscriptions,
nevents, nevents,
); );
let memory = ok_or_errno!(get_memory(&mut *vmctx));
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::poll_oneoff(memory, in_, out, nsubscriptions, nevents) hostcalls::poll_oneoff(memory, in_, out, nsubscriptions, nevents)
} }
pub unsafe extern "C" fn proc_exit(_vmctx: *mut VMContext, rval: u32,) -> () { pub unsafe extern "C" fn proc_exit(_vmctx: *mut VMContext, rval: u32,) -> () {
trace!("proc_exit(rval={:?})", rval); trace!("proc_exit(rval={:?})", rval);
hostcalls::proc_exit(rval) hostcalls::proc_exit(rval)
} }
@@ -1172,17 +888,8 @@ syscalls! {
sig: wasm32::__wasi_signal_t, sig: wasm32::__wasi_signal_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("proc_raise(sig={:?})", sig); trace!("proc_raise(sig={:?})", sig);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::proc_raise(wasi_ctx, memory, sig) hostcalls::proc_raise(wasi_ctx, memory, sig)
} }
@@ -1192,18 +899,12 @@ syscalls! {
buf_len: wasm32::size_t, buf_len: wasm32::size_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("random_get(buf={:#x?}, buf_len={:?})", buf, buf_len); trace!("random_get(buf={:#x?}, buf_len={:?})", buf, buf_len);
let memory = ok_or_errno!(get_memory(&mut *vmctx));
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::random_get(memory, buf, buf_len) hostcalls::random_get(memory, buf, buf_len)
} }
pub unsafe extern "C" fn sched_yield(_vmctx: *mut VMContext,) -> wasm32::__wasi_errno_t { pub unsafe extern "C" fn sched_yield(_vmctx: *mut VMContext,) -> wasm32::__wasi_errno_t {
trace!("sched_yield(void)"); trace!("sched_yield(void)");
hostcalls::sched_yield() hostcalls::sched_yield()
} }
@@ -1222,17 +923,8 @@ syscalls! {
ri_data, ri_data_len, ri_flags, ri_data, ri_data_len, ri_flags,
ro_datalen, ro_flags ro_datalen, ro_flags
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::sock_recv( hostcalls::sock_recv(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -1258,17 +950,8 @@ syscalls! {
sock, sock,
si_data, si_data_len, si_flags, so_datalen, si_data, si_data_len, si_flags, so_datalen,
); );
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::sock_send( hostcalls::sock_send(
wasi_ctx, wasi_ctx,
memory, memory,
@@ -1286,17 +969,8 @@ syscalls! {
how: wasm32::__wasi_sdflags_t, how: wasm32::__wasi_sdflags_t,
) -> wasm32::__wasi_errno_t { ) -> wasm32::__wasi_errno_t {
trace!("sock_shutdown(sock={:?}, how={:?})", sock, how); trace!("sock_shutdown(sock={:?}, how={:?})", sock, how);
let wasi_ctx = ok_or_errno!(get_wasi_ctx(&mut *vmctx));
let wasi_ctx = match get_wasi_ctx(&mut *vmctx) { let memory = ok_or_errno!(get_memory(&mut *vmctx));
Ok(ctx) => ctx,
Err(e) => return return_encoded_errno(e),
};
let memory = match get_memory(&mut *vmctx) {
Ok(memory) => memory,
Err(e) => return return_encoded_errno(e),
};
hostcalls::sock_shutdown(wasi_ctx, memory, sock, how) hostcalls::sock_shutdown(wasi_ctx, memory, sock, how)
} }
} }