Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for the WASI ABI. #299

Merged
merged 92 commits into from
Apr 4, 2019
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
be08154
Add wasi crate
lachlansneff Mar 28, 2019
0787d00
Add data support to import macro
lachlansneff Mar 28, 2019
e3a6b7c
Add skeleton for wasi abi
lachlansneff Mar 28, 2019
b7254ce
add stubs and dispatch
Mar 28, 2019
7b0992e
Instance now pulls state from the ImportObject
lachlansneff Mar 28, 2019
c045da3
Merge branch 'feature/wasi' of github.com:wasmerio/wasmer into featur…
lachlansneff Mar 28, 2019
94674e9
Add wasi state
lachlansneff Mar 28, 2019
bc863fc
hook up wasi to wasmer
Mar 28, 2019
72dd995
fix typo
Mar 28, 2019
dbc4176
Add env and args syscalls
lachlansneff Mar 28, 2019
256253a
Fix clippy lint
lachlansneff Mar 28, 2019
3c01c11
pass args and env vars to wasi
Mar 28, 2019
a69fdfe
implement wasi check
Mar 28, 2019
5c12fd0
fix test
Mar 28, 2019
e227b89
Merge #301
bors[bot] Mar 28, 2019
21304cb
Merge branch 'feature/wasi' into feature/hook-up-wasi-to-wasmer
MarkMcCaskey Mar 28, 2019
ce22818
add feature gate on import
Mar 28, 2019
3323c3c
Merge #300
bors[bot] Mar 28, 2019
bde6bdf
Add all wasi types
lachlansneff Mar 28, 2019
79133e5
Merge #303
bors[bot] Mar 28, 2019
aed9d3b
remove __wasi_ prefix
Mar 28, 2019
2982e6e
Merge #304
bors[bot] Mar 28, 2019
46f90d3
fix conditional compliation
Mar 28, 2019
9478ba7
actually fix it
Mar 28, 2019
72ec4ab
Merge #305
bors[bot] Mar 28, 2019
c45de22
Add helper types and half-ish of the wasi signatures
lachlansneff Mar 29, 2019
bd09343
add structure for cross-platform wasi syscall implementations
Mar 29, 2019
90db12e
Finish up signatures and converting function types
lachlansneff Mar 29, 2019
d9b89b4
Fix bug in deref of WasmPtr<T, Array>
lachlansneff Mar 29, 2019
39ccf40
Merge #306
bors[bot] Mar 29, 2019
ea27eff
keeep top level wasi calls that call out to platform-specific impls
Mar 29, 2019
d10d028
Merge branch 'feature/wasi' into feature/wasi-cross-platform-skeleton
MarkMcCaskey Mar 29, 2019
514432c
call wasi files correctly
Mar 29, 2019
b1030d3
Add prestat_t
lachlansneff Mar 29, 2019
4df5f02
Merge branch 'feature/wasi' of github.com:wasmerio/wasmer into featur…
lachlansneff Mar 29, 2019
23c09ac
add imports
Mar 29, 2019
48b5918
Merge branch 'master' into feature/wasi-fs
lachlansneff Mar 29, 2019
48d34d9
improve calling of platform-specific code and impl linux clock calls
Mar 29, 2019
de241a0
fix linux impl bugs
Mar 29, 2019
1f8b90b
probably actually fix linux for real though
Mar 29, 2019
28d9d1f
move linux impl to unix (it works on osx too!)
Mar 29, 2019
88212d3
implement random_get()
Mar 29, 2019
35fbf57
add pread on linux
Mar 29, 2019
5dcb95d
fix basic errors in linux impl
Mar 29, 2019
e7a5c01
fix backward enumerate
Mar 29, 2019
147d71a
implement ValueType for prestat_t
Mar 29, 2019
42e8523
impl ValueType for fdstat_t
Mar 29, 2019
5cee576
add some syscall skeletons; context switching
Mar 30, 2019
e156ea2
comment out write logic in linux fd_pread until design discussion
Mar 30, 2019
4108c8f
Merge pull request #307 from wasmerio/feature/wasi-cross-platform-ske…
MarkMcCaskey Apr 1, 2019
7addd92
add more stubs for fs calls
Apr 1, 2019
5b6856d
add lots of doc comments
Apr 1, 2019
68f1123
Add start of wasi fs
lachlansneff Apr 1, 2019
c12c7d5
Merge branch 'feature/wasi-fs' into feature/wasi
lachlansneff Apr 1, 2019
61dd2e1
add more doc comments
Apr 1, 2019
ce35e57
Change ValueType trait and add basic fs
lachlansneff Apr 1, 2019
23b1d1d
Merge branch 'feature/wasi' of github.com:wasmerio/wasmer into featur…
lachlansneff Apr 1, 2019
92ec719
Add wasi_try macro
lachlansneff Apr 1, 2019
2dd7ec8
fix it up
Apr 1, 2019
84dc20a
Merge branch 'feature/wasi' of github.com:wasmerio/wasmer into featur…
Apr 1, 2019
d164c7a
update wasi Cargo.toml
Apr 2, 2019
8bab9f1
init zbox first
lachlansneff Apr 2, 2019
287c81d
Misc fixes
lachlansneff Apr 2, 2019
6cec356
add debug lines to all wasi syscalls
Apr 2, 2019
4356293
get debug statements working; add some extra info
Apr 2, 2019
d421e91
implement some of fd_prestat_get
Apr 2, 2019
242f9f6
add hacked together impl of write for stdout and stderr
Apr 2, 2019
3a6e2c9
Change tagged and untagged methods
lachlansneff Apr 2, 2019
6278ced
implement fd_write for files
Apr 2, 2019
04a8073
Merge branch 'feature/wasi' of github.com:wasmerio/wasmer into featur…
Apr 2, 2019
a4547e3
update cursor in file when writing to it
Apr 2, 2019
0b9fc5a
add null termination to args for wasi
Apr 2, 2019
e61c03a
impl fd_read (untested)
Apr 2, 2019
2de5a5d
implement datasync
Apr 2, 2019
e180fd1
add set_rights syscall
Apr 2, 2019
fe4195f
impl set_flags on fd
Apr 2, 2019
697bdc7
add rights checking fn for future-proofing reasons
Apr 2, 2019
37371eb
implement most of fd_filestat_set_times
Apr 2, 2019
7d07b6f
impl fd_seek
Apr 2, 2019
dd7cfac
implement fd_tell
Apr 2, 2019
ce4676d
implement fd_renumber
Apr 2, 2019
f70b75e
kind of implement fd_pwrite
Apr 2, 2019
b80dd07
implement happy path of fd_open
Apr 3, 2019
7d728fc
implement path_filestat_get
Apr 3, 2019
d04d1bf
improve debug statements for arg syscalls
Apr 3, 2019
10696c4
clean up platform-specific syscall code
Apr 3, 2019
e9e7a33
fix warnings and let it build on windows
xmclark Apr 3, 2019
3b34ea6
Merge remote-tracking branch 'origin/feature/wasi' into feature/wasi
xmclark Apr 3, 2019
c1c99db
rename fs and fix (probable) bug in renumber syscall
Apr 4, 2019
207bd01
rename to destructor
xmclark Apr 4, 2019
2686322
Merge remote-tracking branch 'origin/feature/wasi' into feature/wasi
xmclark Apr 4, 2019
bbf663a
Merge branch 'master' into feature/wasi
xmclark Apr 4, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion lib/wasi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
edition = "2018"

[dependencies]
wasmer-runtime-core = { path = "../runtime-core", version = "0.2.1" }
wasmer-runtime-core = { path = "../runtime-core", version = "0.2.1" }
libc = "0.2.50"
rand = "0.6.5"
71 changes: 64 additions & 7 deletions lib/wasi/src/syscalls/mod.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
#![allow(unused)]

mod types;
pub mod types;
#[cfg(any(target_os = "linux", target_os = "macos"))]
pub mod unix;
#[cfg(any(target_os = "windows"))]
pub mod windows;

use self::types::*;
use crate::{
ptr::{Array, WasmPtr},
state::WasiState,
};
use rand::{thread_rng, Rng};
use wasmer_runtime_core::{memory::Memory, vm::Ctx};

#[cfg(any(target_os = "linux", target_os = "macos"))]
pub use unix::*;

#[cfg(any(target_os = "windows"))]
pub use windows::*;

#[allow(clippy::mut_from_ref)]
fn get_wasi_state(ctx: &Ctx) -> &mut WasiState {
unsafe { &mut *(ctx.data as *mut WasiState) }
Copy link
Contributor

@bjfish bjfish Mar 28, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One idea: we could differentiate between ModuleState, InstanceState, FunctionState (if we add that).

Expand Down Expand Up @@ -99,15 +109,28 @@ pub fn clock_res_get(
clock_id: __wasi_clockid_t,
resolution: WasmPtr<__wasi_timestamp_t>,
) -> __wasi_errno_t {
unimplemented!()
let memory = ctx.memory(0);

if let Some(out_addr) = resolution.deref(memory) {
platform_clock_res_get(clock_id, out_addr)
} else {
__WASI_EFAULT
}
}

pub fn clock_time_get(
ctx: &mut Ctx,
clock_id: __wasi_clockid_t,
precision: __wasi_timestamp_t,
time: WasmPtr<__wasi_timestamp_t>,
) -> __wasi_errno_t {
unimplemented!()
let memory = ctx.memory(0);

if let Some(out_addr) = time.deref(memory) {
platform_clock_time_get(clock_id, precision, out_addr)
} else {
__WASI_EFAULT
}
}

/// ### `environ_get()`
Expand Down Expand Up @@ -225,6 +248,7 @@ pub fn fd_filestat_set_times(
) -> __wasi_errno_t {
unimplemented!()
}

pub fn fd_pread(
ctx: &mut Ctx,
fd: __wasi_fd_t,
Expand All @@ -233,8 +257,17 @@ pub fn fd_pread(
offset: __wasi_filesize_t,
nread: WasmPtr<u32>,
) -> __wasi_errno_t {
unimplemented!()
let memory = ctx.memory(0);

if let ((Some(iov_cells), Some(nread_cell))) =
(iovs.deref(memory, 0, iovs_len), nread.deref(memory))
{
platform_fd_pread(fd, iov_cells, iovs_len, offset, nread_cell)
} else {
__WASI_EFAULT
}
}

pub fn fd_prestat_get(
ctx: &mut Ctx,
fd: __wasi_fd_t,
Expand Down Expand Up @@ -452,12 +485,36 @@ pub fn proc_exit(ctx: &mut Ctx, rval: __wasi_exitcode_t) {
pub fn proc_raise(ctx: &mut Ctx, sig: __wasi_signal_t) -> __wasi_errno_t {
unimplemented!()
}

/// ### `random_get()`
/// Fill buffer with high-quality random data. This function may be slow and block
/// Inputs:
/// - `void *buf`
/// A pointer to a buffer where the random bytes will be written
/// - `size_t buf_len`
/// The number of bytes that will be written
pub fn random_get(ctx: &mut Ctx, buf: WasmPtr<u8, Array>, buf_len: u32) -> __wasi_errno_t {
unimplemented!()
let mut rng = thread_rng();
let memory = ctx.memory(0);

if let Some(buf) = buf.deref(memory, 0, buf_len) {
for i in 0..(buf_len as usize) {
let random_byte = rng.gen::<u8>();
buf[i].set(random_byte);
}
} else {
return __WASI_EFAULT;
}

__WASI_ESUCCESS
}

/// ### `sched_yield()`
/// Yields execution of the thread
pub fn sched_yield(ctx: &mut Ctx) -> __wasi_errno_t {
unimplemented!()
__WASI_ESUCCESS
}

pub fn sock_recv(
ctx: &mut Ctx,
sock: __wasi_fd_t,
Expand Down
19 changes: 19 additions & 0 deletions lib/wasi/src/syscalls/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,25 @@ pub struct __wasi_iovec_t {
pub buf_len: u32,
}

impl ValueType for __wasi_iovec_t {
fn into_le(self, buffer: &mut [u8]) {
self.buf
.into_le(&mut buffer[..mem::size_of::<WasmPtr<u8, Array>>()]);
self.buf_len
.into_le(&mut buffer[mem::size_of::<WasmPtr<u8, Array>>()..]);
}

fn from_le(buffer: &[u8]) -> Result<Self, ValueError> {
if buffer.len() >= mem::size_of::<__wasi_iovec_t>() {
let buf = ValueType::from_le(&buffer[..mem::size_of::<WasmPtr<u8, Array>>()])?;
let buf_len = ValueType::from_le(&buffer[mem::size_of::<WasmPtr<u8, Array>>()..])?;
Ok(Self { buf, buf_len })
} else {
Err(ValueError::BufferTooSmall)
}
}
}

pub type __wasi_linkcount_t = u32;

pub type __wasi_lookupflags_t = u32;
Expand Down
36 changes: 36 additions & 0 deletions lib/wasi/src/syscalls/unix/linux.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
use crate::syscalls::types::*;
use std::cell::Cell;
use std::mem;

use libc::preadv;

pub fn platform_fd_pread(
fd: __wasi_fd_t,
iovs: &[Cell<__wasi_iovec_t>],
iovs_len: u32,
offset: __wasi_filesize_t,
nread: &Cell<u32>,
) -> __wasi_errno_t {
let (result, iovec) = unsafe {
let mut iovec = vec![mem::uninitialized(); iovs_len as usize];
(
preadv(
fd as i32,
iovec.as_mut_ptr(),
iovs_len as i32,
offset as i64,
),
iovec,
)
};
nread.set(result as u32);
/*for (i, arr_cell) in iovs.iter().enumerate() {
let wasi_iovec = __wasi_iovec_t {
buf: iovec[i] as _,
buf_len: iovec[i].iov_len as u32,
};
arr_cell.set(wasi_iovec);
}*/

__WASI_ESUCCESS
}
12 changes: 12 additions & 0 deletions lib/wasi/src/syscalls/unix/macos.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
use crate::syscalls::types::*;
use std::cell::Cell;

pub fn platform_fd_pread(
fd: __wasi_fd_t,
iovs: &[Cell<__wasi_iovec_t>],
iovs_len: u32,
offset: __wasi_filesize_t,
nread: &Cell<u32>,
) -> __wasi_errno_t {
unimplemented!()
}
71 changes: 71 additions & 0 deletions lib/wasi/src/syscalls/unix/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#[cfg(target_os = "linux")]
pub mod linux;

#[cfg(target_os = "macos")]
pub mod macos;

#[cfg(target_os = "linux")]
pub use linux::*;

#[cfg(target_os = "macos")]
pub use macos::*;

use crate::syscalls::types::*;
use libc::{
clock_getres, clock_gettime, timespec, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID,
CLOCK_REALTIME, CLOCK_THREAD_CPUTIME_ID,
};
use std::cell::Cell;
use std::mem;

pub fn platform_clock_res_get(
clock_id: __wasi_clockid_t,
resolution: &Cell<__wasi_timestamp_t>,
) -> __wasi_errno_t {
let unix_clock_id = match clock_id {
__WASI_CLOCK_MONOTONIC => CLOCK_MONOTONIC,
__WASI_CLOCK_PROCESS_CPUTIME_ID => CLOCK_PROCESS_CPUTIME_ID,
__WASI_CLOCK_REALTIME => CLOCK_REALTIME,
__WASI_CLOCK_THREAD_CPUTIME_ID => CLOCK_THREAD_CPUTIME_ID,
_ => return __WASI_EINVAL,
};

let (output, timespec_out) = unsafe {
let mut timespec_out: timespec = mem::uninitialized();
(clock_getres(unix_clock_id, &mut timespec_out), timespec_out)
};

resolution.set(timespec_out.tv_nsec as __wasi_timestamp_t);

// TODO: map output of clock_getres to __wasi_errno_t
__WASI_ESUCCESS
}

pub fn platform_clock_time_get(
clock_id: __wasi_clockid_t,
precision: __wasi_timestamp_t,
time: &Cell<__wasi_timestamp_t>,
) -> __wasi_errno_t {
let unix_clock_id = match clock_id {
__WASI_CLOCK_MONOTONIC => CLOCK_MONOTONIC,
__WASI_CLOCK_PROCESS_CPUTIME_ID => CLOCK_PROCESS_CPUTIME_ID,
__WASI_CLOCK_REALTIME => CLOCK_REALTIME,
__WASI_CLOCK_THREAD_CPUTIME_ID => CLOCK_THREAD_CPUTIME_ID,
_ => return __WASI_EINVAL,
};

let (output, timespec_out) = unsafe {
let mut timespec_out: timespec = mem::uninitialized();
(
clock_gettime(unix_clock_id, &mut timespec_out),
timespec_out,
)
};

// TODO: adjust output by precision...

time.set(timespec_out.tv_nsec as __wasi_timestamp_t);

// TODO: map output of clock_gettime to __wasi_errno_t
__WASI_ESUCCESS
}
27 changes: 27 additions & 0 deletions lib/wasi/src/syscalls/windows.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
use crate::syscalls::types::*;
use std::cell::Cell;

pub fn platform_clock_res_get(
clock_id: __wasi_clockid_t,
resolution: &Cell<__wasi_timestamp_t>,
) -> __wasi_errno_t {
__WASI_EINVAL
}

pub fn platform_clock_time_get(
clock_id: __wasi_clockid_t,
precision: __wasi_timestamp_t,
time: &Cell<__wasi_timestamp_t>,
) -> __wasi_errno_t {
unimplemented!()
}

pub fn platform_fd_pread(
fd: __wasi_fd_t,
iovs: &[Cell<__wasi_iovec_t>],
iovs_len: u32,
offset: __wasi_filesize_t,
nread: &Cell<u32>,
) -> __wasi_errno_t {
unimplemented!()
}