Replace the global-exports mechanism with a caller-vmctx mechanism. (#789)

* Replace the global-exports mechanism with a caller-vmctx mechanism.

This eliminates the global exports mechanism, and instead adds a
caller-vmctx argument to wasm functions so that WASI can obtain the
memory and other things from the caller rather than looking them up in a
global registry.

This replaces #390.

* Fixup some merge conflicts

* Rustfmt

* Ensure VMContext is aligned to 16 bytes

With the removal of `global_exports` it "just so happens" that this
isn't happening naturally any more.

* Fixup some bugs with double vmctx in wasmtime crate

* Trampoline stub needed adjusting
* Use pointer type instead of always using I64 for caller vmctx
* Don't store `ir::Signature` in `Func` since we don't know the pointer
  size at creation time.
* Skip the first 2 arguments in IR signatures since that's the two vmctx
  parameters.

* Update cranelift to 0.56.0

* Handle more merge conflicts

* Rustfmt

Co-authored-by: Alex Crichton <alex@alexcrichton.com>
This commit is contained in:
Dan Gohman
2020-01-21 14:50:59 -08:00
committed by GitHub
parent de72435576
commit 9a88d3d894
33 changed files with 362 additions and 330 deletions

View File

@@ -14,9 +14,9 @@ edition = "2018"
wasmtime-runtime = { path = "../runtime", version = "0.9.0" }
wasmtime-environ = { path = "../environ", version = "0.9.0" }
wasmtime-jit = { path = "../jit", version = "0.9.0" }
cranelift-codegen = { version = "0.55", features = ["enable-serde"] }
cranelift-entity = { version = "0.55", features = ["enable-serde"] }
cranelift-wasm = { version = "0.55", features = ["enable-serde"] }
cranelift-codegen = { version = "0.56", features = ["enable-serde"] }
cranelift-entity = { version = "0.56", features = ["enable-serde"] }
cranelift-wasm = { version = "0.56", features = ["enable-serde"] }
target-lexicon = "0.10.0"
log = { version = "0.4.8", default-features = false }
libc = "0.2.60"

View File

@@ -27,7 +27,6 @@ pub(crate) struct WASIState {
/// Return an instance implementing the "wasi" interface.
pub fn instantiate_wasi_c(
prefix: &str,
global_exports: Rc<RefCell<HashMap<String, Option<wasmtime_runtime::Export>>>>,
preopened_dirs: &[(String, File)],
argv: &[String],
environ: &[(String, String)],
@@ -160,7 +159,6 @@ pub fn instantiate_wasi_c(
InstanceHandle::new(
Rc::new(module),
global_exports,
finished_functions.into_boxed_slice(),
imports,
&data_initializers,

View File

@@ -114,7 +114,11 @@ impl AbiRet for () {
}
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,
caller_vmctx: *mut VMContext,
$(, $arg:ident: $ty:ty)*,
) -> $ret:ty {
$($body:tt)*
})*) => ($(
pub mod $name {
@@ -137,12 +141,14 @@ macro_rules! syscalls {
/// NB: ideally we'd expose `shim` below, but it seems like there's
/// a compiler bug which prvents that from being cast to a `usize`.
pub static SHIM: unsafe extern "C" fn(
*mut VMContext,
*mut VMContext,
$(<$ty as AbiParam>::Abi),*
) -> <$ret as AbiRet>::Abi = shim;
unsafe extern "C" fn shim(
$ctx: *mut VMContext,
$caller_ctx: *mut VMContext,
$($arg: <$ty as AbiParam>::Abi,)*
) -> <$ret as AbiRet>::Abi {
let r = super::$name($ctx, $(<$ty as AbiParam>::convert($arg),)*);
@@ -150,7 +156,11 @@ macro_rules! syscalls {
}
}
pub unsafe extern "C" fn $name($ctx: *mut VMContext, $($arg: $ty,)*) -> $ret {
pub unsafe extern "C" fn $name(
$ctx: *mut VMContext,
$caller_ctx: *mut VMContext,
$($arg: $ty,)*
) -> $ret {
$($body)*
}
)*)
@@ -160,6 +170,7 @@ syscalls! {
pub unsafe extern "C" fn args_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
argv: wasm32::uintptr_t,
argv_buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -201,6 +212,7 @@ syscalls! {
pub unsafe extern "C" fn args_sizes_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
argc: wasm32::uintptr_t,
argv_buf_size: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -238,6 +250,7 @@ syscalls! {
pub unsafe extern "C" fn clock_res_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
clock_id: wasm32::__wasi_clockid_t,
resolution: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -266,6 +279,7 @@ syscalls! {
pub unsafe extern "C" fn clock_time_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
clock_id: wasm32::__wasi_clockid_t,
precision: wasm32::__wasi_timestamp_t,
time: wasm32::uintptr_t,
@@ -297,6 +311,7 @@ syscalls! {
pub unsafe extern "C" fn environ_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
environ: wasm32::uintptr_t,
environ_buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -338,6 +353,7 @@ syscalls! {
pub unsafe extern "C" fn environ_sizes_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
environ_count: wasm32::uintptr_t,
environ_buf_size: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -375,6 +391,7 @@ syscalls! {
pub unsafe extern "C" fn fd_prestat_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -397,6 +414,7 @@ syscalls! {
pub unsafe extern "C" fn fd_prestat_dir_name(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -419,6 +437,7 @@ syscalls! {
pub unsafe extern "C" fn fd_close(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_close(fd={:?})", fd);
@@ -435,6 +454,7 @@ syscalls! {
pub unsafe extern "C" fn fd_datasync(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_datasync(fd={:?})", fd);
@@ -450,6 +470,7 @@ syscalls! {
pub unsafe extern "C" fn fd_pread(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -497,6 +518,7 @@ syscalls! {
pub unsafe extern "C" fn fd_pwrite(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -544,6 +566,7 @@ syscalls! {
pub unsafe extern "C" fn fd_read(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -581,6 +604,7 @@ syscalls! {
pub unsafe extern "C" fn fd_renumber(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
from: wasm32::__wasi_fd_t,
to: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
@@ -599,6 +623,7 @@ syscalls! {
pub unsafe extern "C" fn fd_seek(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
offset: wasm32::__wasi_filedelta_t,
whence: wasm32::__wasi_whence_t,
@@ -634,6 +659,7 @@ syscalls! {
pub unsafe extern "C" fn fd_tell(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
newoffset: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -659,6 +685,7 @@ syscalls! {
pub unsafe extern "C" fn fd_fdstat_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -684,6 +711,7 @@ syscalls! {
pub unsafe extern "C" fn fd_fdstat_set_flags(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
flags: wasm32::__wasi_fdflags_t,
) -> wasm32::__wasi_errno_t {
@@ -705,6 +733,7 @@ syscalls! {
pub unsafe extern "C" fn fd_fdstat_set_rights(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
fs_rights_base: wasm32::__wasi_rights_t,
fs_rights_inheriting: wasm32::__wasi_rights_t,
@@ -729,6 +758,7 @@ syscalls! {
pub unsafe extern "C" fn fd_sync(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
) -> wasm32::__wasi_errno_t {
trace!("fd_sync(fd={:?})", fd);
@@ -744,6 +774,7 @@ syscalls! {
pub unsafe extern "C" fn fd_write(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
iovs: wasm32::uintptr_t,
iovs_len: wasm32::size_t,
@@ -781,6 +812,7 @@ syscalls! {
pub unsafe extern "C" fn fd_advise(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
offset: wasm32::__wasi_filesize_t,
len: wasm32::__wasi_filesize_t,
@@ -808,6 +840,7 @@ syscalls! {
pub unsafe extern "C" fn fd_allocate(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
offset: wasm32::__wasi_filesize_t,
len: wasm32::__wasi_filesize_t,
@@ -827,6 +860,7 @@ syscalls! {
pub unsafe extern "C" fn path_create_directory(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -855,6 +889,7 @@ syscalls! {
pub unsafe extern "C" fn path_link(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd0: wasm32::__wasi_fd_t,
flags0: wasm32::__wasi_lookupflags_t,
path0: wasm32::uintptr_t,
@@ -901,6 +936,7 @@ syscalls! {
// the `fd` by reference?
pub unsafe extern "C" fn path_open(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
dirfd: wasm32::__wasi_fd_t,
dirflags: wasm32::__wasi_lookupflags_t,
path: wasm32::uintptr_t,
@@ -964,6 +1000,7 @@ syscalls! {
pub unsafe extern "C" fn fd_readdir(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
buf_len: wasm32::size_t,
@@ -1013,6 +1050,7 @@ syscalls! {
pub unsafe extern "C" fn path_readlink(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -1069,6 +1107,7 @@ syscalls! {
pub unsafe extern "C" fn path_rename(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd0: wasm32::__wasi_fd_t,
path0: wasm32::uintptr_t,
path_len0: wasm32::size_t,
@@ -1109,6 +1148,7 @@ syscalls! {
pub unsafe extern "C" fn fd_filestat_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
buf: wasm32::uintptr_t,
) -> wasm32::__wasi_errno_t {
@@ -1134,6 +1174,7 @@ syscalls! {
pub unsafe extern "C" fn fd_filestat_set_times(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
st_atim: wasm32::__wasi_timestamp_t,
st_mtim: wasm32::__wasi_timestamp_t,
@@ -1160,6 +1201,7 @@ syscalls! {
pub unsafe extern "C" fn fd_filestat_set_size(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
size: wasm32::__wasi_filesize_t,
) -> wasm32::__wasi_errno_t {
@@ -1181,6 +1223,7 @@ syscalls! {
pub unsafe extern "C" fn path_filestat_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
flags: wasm32::__wasi_lookupflags_t,
path: wasm32::uintptr_t,
@@ -1223,6 +1266,7 @@ syscalls! {
pub unsafe extern "C" fn path_filestat_set_times(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
flags: wasm32::__wasi_lookupflags_t,
path: wasm32::uintptr_t,
@@ -1262,6 +1306,7 @@ syscalls! {
pub unsafe extern "C" fn path_symlink(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
path0: wasm32::uintptr_t,
path_len0: wasm32::size_t,
fd: wasm32::__wasi_fd_t,
@@ -1299,6 +1344,7 @@ syscalls! {
pub unsafe extern "C" fn path_unlink_file(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -1327,6 +1373,7 @@ syscalls! {
pub unsafe extern "C" fn path_remove_directory(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
fd: wasm32::__wasi_fd_t,
path: wasm32::uintptr_t,
path_len: wasm32::size_t,
@@ -1355,6 +1402,7 @@ syscalls! {
pub unsafe extern "C" fn poll_oneoff(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
in_: wasm32::uintptr_t,
out: wasm32::uintptr_t,
nsubscriptions: wasm32::size_t,
@@ -1412,7 +1460,9 @@ syscalls! {
return_encoded_errno(e)
}
pub unsafe extern "C" fn proc_exit(_vmctx: *mut VMContext, rval: u32,) -> () {
pub unsafe extern "C" fn proc_exit(_vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
rval: u32,) -> () {
trace!("proc_exit(rval={:?})", rval);
let rval = decode_exitcode(rval);
@@ -1424,6 +1474,7 @@ syscalls! {
pub unsafe extern "C" fn proc_raise(
_vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
_sig: wasm32::__wasi_signal_t,
) -> wasm32::__wasi_errno_t {
unimplemented!("__wasi_proc_raise");
@@ -1431,6 +1482,7 @@ syscalls! {
pub unsafe extern "C" fn random_get(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
buf: wasm32::uintptr_t,
buf_len: wasm32::size_t,
) -> wasm32::__wasi_errno_t {
@@ -1447,7 +1499,9 @@ syscalls! {
return_encoded_errno(e)
}
pub unsafe extern "C" fn sched_yield(_vmctx: *mut VMContext,) -> wasm32::__wasi_errno_t {
pub unsafe extern "C" fn sched_yield(_vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
) -> wasm32::__wasi_errno_t {
let e = host::wasmtime_ssp_sched_yield();
return_encoded_errno(e)
@@ -1455,6 +1509,7 @@ syscalls! {
pub unsafe extern "C" fn sock_recv(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
sock: wasm32::__wasi_fd_t,
ri_data: wasm32::uintptr_t,
ri_data_len: wasm32::size_t,
@@ -1502,6 +1557,7 @@ syscalls! {
pub unsafe extern "C" fn sock_send(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
sock: wasm32::__wasi_fd_t,
si_data: wasm32::uintptr_t,
si_data_len: wasm32::size_t,
@@ -1539,6 +1595,8 @@ syscalls! {
pub unsafe extern "C" fn sock_shutdown(
vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
caller_vmctx: *mut VMContext,
sock: wasm32::__wasi_fd_t,
how: wasm32::__wasi_sdflags_t,
) -> wasm32::__wasi_errno_t {