From 48d34d9522e0fbeba3b2001dec649117c00675c6 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Fri, 29 Mar 2019 11:38:48 -0700 Subject: [PATCH] improve calling of platform-specific code and impl linux clock calls --- Cargo.lock | 1 + lib/wasi/Cargo.toml | 3 +- lib/wasi/src/syscalls/mod.rs | 16 +++++++-- lib/wasi/src/syscalls/unix/linux.rs | 50 ++++++++++++++++++++++++----- lib/wasi/src/syscalls/unix/macos.rs | 9 ++---- lib/wasi/src/syscalls/windows.rs | 9 ++---- 6 files changed, 65 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 18ac80db9..53f1b1d5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1482,6 +1482,7 @@ dependencies = [ name = "wasmer-wasi" version = "0.1.0" dependencies = [ + "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "wasmer-runtime-core 0.2.1", ] diff --git a/lib/wasi/Cargo.toml b/lib/wasi/Cargo.toml index 17a2f14f4..3d2151d3e 100644 --- a/lib/wasi/Cargo.toml +++ b/lib/wasi/Cargo.toml @@ -5,4 +5,5 @@ authors = ["The Wasmer Engineering Team "] edition = "2018" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.2.1" } \ No newline at end of file +wasmer-runtime-core = { path = "../runtime-core", version = "0.2.1" } +libc = "0.2.50" \ No newline at end of file diff --git a/lib/wasi/src/syscalls/mod.rs b/lib/wasi/src/syscalls/mod.rs index 0ccc7bd64..95d5f5240 100644 --- a/lib/wasi/src/syscalls/mod.rs +++ b/lib/wasi/src/syscalls/mod.rs @@ -108,7 +108,13 @@ pub fn clock_res_get( clock_id: __wasi_clockid_t, resolution: WasmPtr<__wasi_timestamp_t>, ) -> __wasi_errno_t { - platform_clock_res_get(ctx, clock_id, resolution) + 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( @@ -117,7 +123,13 @@ pub fn clock_time_get( precision: __wasi_timestamp_t, time: WasmPtr<__wasi_timestamp_t>, ) -> __wasi_errno_t { - platform_clock_time_get(ctx, clock_id, precision, time) + 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()` diff --git a/lib/wasi/src/syscalls/unix/linux.rs b/lib/wasi/src/syscalls/unix/linux.rs index 78ee51c9a..e68d470fa 100644 --- a/lib/wasi/src/syscalls/unix/linux.rs +++ b/lib/wasi/src/syscalls/unix/linux.rs @@ -1,20 +1,54 @@ use crate::syscalls::types::*; -use crate::ptr::{Array, WasmPtr}, -use wasmer_runtime_core::{memory::Memory, vm::Ctx}; +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( - ctx: &mut Ctx, clock_id: __wasi_clockid_t, - resolution: WasmPtr<__wasi_timestamp_t>, + resolution: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { - __WASI_EINVAL + let linux_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 = unsafe { + let mut timespec_out: timespec = mem::uninitialized(); + clock_getres(linux_clock_id, &mut 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( - ctx: &mut Ctx, clock_id: __wasi_clockid_t, precision: __wasi_timestamp_t, - time: WasmPtr<__wasi_timestamp_t>, + time: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { - unimplemented!() + let linux_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 = unsafe { + let mut timespec_out: timespec = mem::uninitialized(); + clock_gettime(linux_clock_id, precision, &mut timespec_out); + }; + + resolution.set(timespec_out.tv_nsec as __wasi_timestamp_t); + + // TODO: map output of clock_gettime to __wasi_errno_t + __WASI_ESUCCESS } diff --git a/lib/wasi/src/syscalls/unix/macos.rs b/lib/wasi/src/syscalls/unix/macos.rs index 78ee51c9a..6273695d3 100644 --- a/lib/wasi/src/syscalls/unix/macos.rs +++ b/lib/wasi/src/syscalls/unix/macos.rs @@ -1,20 +1,17 @@ use crate::syscalls::types::*; -use crate::ptr::{Array, WasmPtr}, -use wasmer_runtime_core::{memory::Memory, vm::Ctx}; +use std::cell::Cell; pub fn platform_clock_res_get( - ctx: &mut Ctx, clock_id: __wasi_clockid_t, - resolution: WasmPtr<__wasi_timestamp_t>, + resolution: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { __WASI_EINVAL } pub fn platform_clock_time_get( - ctx: &mut Ctx, clock_id: __wasi_clockid_t, precision: __wasi_timestamp_t, - time: WasmPtr<__wasi_timestamp_t>, + time: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { unimplemented!() } diff --git a/lib/wasi/src/syscalls/windows.rs b/lib/wasi/src/syscalls/windows.rs index 78ee51c9a..6273695d3 100644 --- a/lib/wasi/src/syscalls/windows.rs +++ b/lib/wasi/src/syscalls/windows.rs @@ -1,20 +1,17 @@ use crate::syscalls::types::*; -use crate::ptr::{Array, WasmPtr}, -use wasmer_runtime_core::{memory::Memory, vm::Ctx}; +use std::cell::Cell; pub fn platform_clock_res_get( - ctx: &mut Ctx, clock_id: __wasi_clockid_t, - resolution: WasmPtr<__wasi_timestamp_t>, + resolution: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { __WASI_EINVAL } pub fn platform_clock_time_get( - ctx: &mut Ctx, clock_id: __wasi_clockid_t, precision: __wasi_timestamp_t, - time: WasmPtr<__wasi_timestamp_t>, + time: &Cell<__wasi_timestamp_t>, ) -> __wasi_errno_t { unimplemented!() }