From dda438ebd16288169fe7d2616019867fd7776c2b Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 27 Jun 2019 11:14:38 -0700 Subject: [PATCH 1/7] Fixed lseek --- lib/emscripten/src/syscalls/mod.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/emscripten/src/syscalls/mod.rs b/lib/emscripten/src/syscalls/mod.rs index 90c703d5826..c7acf490552 100644 --- a/lib/emscripten/src/syscalls/mod.rs +++ b/lib/emscripten/src/syscalls/mod.rs @@ -433,27 +433,31 @@ pub fn ___syscall192(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in } /// lseek +#[allow(exceeding_bitshifts)] pub fn ___syscall140(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { // -> c_int debug!("emscripten::___syscall140 (lseek) {}", _which); let fd: i32 = varargs.get(ctx); - let _ = varargs.get::(ctx); // ignore high offset + let _offset_high: i32 = varargs.get(ctx); let offset_low: i32 = varargs.get(ctx); - let result_ptr_value = varargs.get::(ctx); + let result_ptr_value: i32 = varargs.get(ctx); let whence: i32 = varargs.get(ctx); let offset = offset_low as off_t; - let ret = unsafe { lseek(fd, offset, whence) as i32 }; + let ret = unsafe { lseek(fd, offset, whence) }; #[allow(clippy::cast_ptr_alignment)] - let result_ptr = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value) as *mut i32; - assert_eq!(8, mem::align_of_val(&result_ptr)); + let result_ptr_0 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value) as *mut i32; + let result_ptr_1 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value+4) as *mut i32; + assert_eq!(8, mem::align_of_val(&result_ptr_0)); unsafe { - *result_ptr = ret; + // HEAP32[((result)>>2)]=tempI64[0],HEAP32[(((result)+(4))>>2)]=tempI64[1]); + *result_ptr_0 = ret as i32; + *result_ptr_1 = (ret >> 32) as i32; } debug!( - "=> fd: {}, offset: {}, result_ptr: {}, whence: {} = {}\nlast os error: {}", + "=> fd: {}, offset: {}, result: {}, whence: {} = {}\nlast os error: {}", fd, offset, - result_ptr_value, + ret, whence, 0, Error::last_os_error(), From 47e38f0b2abd64a4f96d17e6be8f6205937f934b Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 27 Jun 2019 11:18:49 -0700 Subject: [PATCH 2/7] Fixed formatting --- lib/emscripten/src/syscalls/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/emscripten/src/syscalls/mod.rs b/lib/emscripten/src/syscalls/mod.rs index c7acf490552..1d0f907efa6 100644 --- a/lib/emscripten/src/syscalls/mod.rs +++ b/lib/emscripten/src/syscalls/mod.rs @@ -446,7 +446,7 @@ pub fn ___syscall140(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { let ret = unsafe { lseek(fd, offset, whence) }; #[allow(clippy::cast_ptr_alignment)] let result_ptr_0 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value) as *mut i32; - let result_ptr_1 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value+4) as *mut i32; + let result_ptr_1 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value + 4) as *mut i32; assert_eq!(8, mem::align_of_val(&result_ptr_0)); unsafe { // HEAP32[((result)>>2)]=tempI64[0],HEAP32[(((result)+(4))>>2)]=tempI64[1]); From 10eab1ca680814feabbb9a69dc1ebbdfcf2d24d9 Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 27 Jun 2019 11:21:03 -0700 Subject: [PATCH 3/7] Improved code --- lib/emscripten/src/syscalls/mod.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/emscripten/src/syscalls/mod.rs b/lib/emscripten/src/syscalls/mod.rs index 1d0f907efa6..c65be55e33c 100644 --- a/lib/emscripten/src/syscalls/mod.rs +++ b/lib/emscripten/src/syscalls/mod.rs @@ -433,12 +433,11 @@ pub fn ___syscall192(ctx: &mut Ctx, _which: c_int, mut varargs: VarArgs) -> c_in } /// lseek -#[allow(exceeding_bitshifts)] pub fn ___syscall140(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { // -> c_int debug!("emscripten::___syscall140 (lseek) {}", _which); let fd: i32 = varargs.get(ctx); - let _offset_high: i32 = varargs.get(ctx); + let _offset_high: i32 = varargs.get(ctx); // We don't use the offset high as emscripten skips it let offset_low: i32 = varargs.get(ctx); let result_ptr_value: i32 = varargs.get(ctx); let whence: i32 = varargs.get(ctx); From 73367ef6e9873aa7e9bf4bce70a0a1ccdb00784f Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 27 Jun 2019 11:31:08 -0700 Subject: [PATCH 4/7] Fixed cast alignment issue --- lib/emscripten/src/syscalls/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/emscripten/src/syscalls/mod.rs b/lib/emscripten/src/syscalls/mod.rs index c65be55e33c..455a189ce7a 100644 --- a/lib/emscripten/src/syscalls/mod.rs +++ b/lib/emscripten/src/syscalls/mod.rs @@ -445,6 +445,7 @@ pub fn ___syscall140(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { let ret = unsafe { lseek(fd, offset, whence) }; #[allow(clippy::cast_ptr_alignment)] let result_ptr_0 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value) as *mut i32; + #[allow(clippy::cast_ptr_alignment)] let result_ptr_1 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value + 4) as *mut i32; assert_eq!(8, mem::align_of_val(&result_ptr_0)); unsafe { From 6aa0ba8344c4cde644786c233928e16d2747b19f Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 27 Jun 2019 11:31:51 -0700 Subject: [PATCH 5/7] Added changes to CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bdfa5da3a3..39e048dfaeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All PRs to the Wasmer repository must add to this file. Blocks of changes will separated by version increments. ## **[Unreleased]** +- [#513](https://github.com/wasmerio/wasmer/pull/510) Fix emscripten lseek implementation. - [#510](https://github.com/wasmerio/wasmer/pull/510) Simplify construction of floating point constants in LLVM backend. Fix LLVM assertion failure due to definition of %ctx. ## 0.5.1 - 2019-06-24 From 6aec631774f38c4e59f69de92ef5a58f15056ce8 Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 27 Jun 2019 12:37:29 -0700 Subject: [PATCH 6/7] Improved lseek assignment --- lib/emscripten/src/syscalls/mod.rs | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/lib/emscripten/src/syscalls/mod.rs b/lib/emscripten/src/syscalls/mod.rs index 455a189ce7a..5ee7c321e08 100644 --- a/lib/emscripten/src/syscalls/mod.rs +++ b/lib/emscripten/src/syscalls/mod.rs @@ -50,7 +50,6 @@ use super::env; use std::cell::Cell; #[allow(unused_imports)] use std::io::Error; -use std::mem; use std::slice; /// exit @@ -439,20 +438,14 @@ pub fn ___syscall140(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { let fd: i32 = varargs.get(ctx); let _offset_high: i32 = varargs.get(ctx); // We don't use the offset high as emscripten skips it let offset_low: i32 = varargs.get(ctx); - let result_ptr_value: i32 = varargs.get(ctx); + let result_ptr_value: WasmPtr = varargs.get(ctx); let whence: i32 = varargs.get(ctx); let offset = offset_low as off_t; let ret = unsafe { lseek(fd, offset, whence) }; - #[allow(clippy::cast_ptr_alignment)] - let result_ptr_0 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value) as *mut i32; - #[allow(clippy::cast_ptr_alignment)] - let result_ptr_1 = emscripten_memory_pointer!(ctx.memory(0), result_ptr_value + 4) as *mut i32; - assert_eq!(8, mem::align_of_val(&result_ptr_0)); - unsafe { - // HEAP32[((result)>>2)]=tempI64[0],HEAP32[(((result)+(4))>>2)]=tempI64[1]); - *result_ptr_0 = ret as i32; - *result_ptr_1 = (ret >> 32) as i32; - } + + let result_ptr = result_ptr_value.deref(ctx.memory(0)).unwrap(); + result_ptr.set(ret); + debug!( "=> fd: {}, offset: {}, result: {}, whence: {} = {}\nlast os error: {}", fd, From 6cc41f82c87e62a6db16fdc1c91e5bd11b9f45ff Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 27 Jun 2019 12:42:27 -0700 Subject: [PATCH 7/7] Fixed lseek error in Windows --- lib/emscripten/src/syscalls/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/emscripten/src/syscalls/mod.rs b/lib/emscripten/src/syscalls/mod.rs index 5ee7c321e08..34ba9081893 100644 --- a/lib/emscripten/src/syscalls/mod.rs +++ b/lib/emscripten/src/syscalls/mod.rs @@ -441,7 +441,7 @@ pub fn ___syscall140(ctx: &mut Ctx, _which: i32, mut varargs: VarArgs) -> i32 { let result_ptr_value: WasmPtr = varargs.get(ctx); let whence: i32 = varargs.get(ctx); let offset = offset_low as off_t; - let ret = unsafe { lseek(fd, offset, whence) }; + let ret = unsafe { lseek(fd, offset, whence) as i64 }; let result_ptr = result_ptr_value.deref(ctx.memory(0)).unwrap(); result_ptr.set(ret);