|
|
@ -37,13 +37,15 @@ static m3_wasi_context_t* wasi_context;
|
|
|
|
typedef size_t __wasi_size_t;
|
|
|
|
typedef size_t __wasi_size_t;
|
|
|
|
|
|
|
|
|
|
|
|
static inline
|
|
|
|
static inline
|
|
|
|
void copy_iov_to_host(void* _mem, __wasi_iovec_t* host_iov, __wasi_iovec_t* wasi_iov, int32_t iovs_len)
|
|
|
|
const void* copy_iov_to_host(IM3Runtime runtime, void* _mem, __wasi_iovec_t* host_iov, __wasi_iovec_t* wasi_iov, int32_t iovs_len)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Convert wasi memory offsets to host addresses
|
|
|
|
// Convert wasi memory offsets to host addresses
|
|
|
|
for (int i = 0; i < iovs_len; i++) {
|
|
|
|
for (int i = 0; i < iovs_len; i++) {
|
|
|
|
host_iov[i].buf = m3ApiOffsetToPtr(wasi_iov[i].buf);
|
|
|
|
host_iov[i].buf = m3ApiOffsetToPtr(wasi_iov[i].buf);
|
|
|
|
host_iov[i].buf_len = wasi_iov[i].buf_len;
|
|
|
|
host_iov[i].buf_len = wasi_iov[i].buf_len;
|
|
|
|
|
|
|
|
m3ApiCheckMem(host_iov[i].buf, host_iov[i].buf_len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
m3ApiSuccess();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if d_m3EnableWasiTracing
|
|
|
|
#if d_m3EnableWasiTracing
|
|
|
@ -665,7 +667,10 @@ m3ApiRawFunction(m3_wasi_generic_fd_pread)
|
|
|
|
m3ApiCheckMem(nread, sizeof(__wasi_size_t));
|
|
|
|
m3ApiCheckMem(nread, sizeof(__wasi_size_t));
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
copy_iov_to_host(_mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
const void* mem_check = copy_iov_to_host(runtime, _mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
|
|
|
|
if (mem_check != m3Err_none) {
|
|
|
|
|
|
|
|
return mem_check;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_errno_t ret = __wasi_fd_pread(fd, iovs, iovs_len, offset, nread);
|
|
|
|
__wasi_errno_t ret = __wasi_fd_pread(fd, iovs, iovs_len, offset, nread);
|
|
|
|
|
|
|
|
|
|
|
@ -686,7 +691,10 @@ m3ApiRawFunction(m3_wasi_generic_fd_read)
|
|
|
|
m3ApiCheckMem(nread, sizeof(__wasi_size_t));
|
|
|
|
m3ApiCheckMem(nread, sizeof(__wasi_size_t));
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
copy_iov_to_host(_mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
const void* mem_check = copy_iov_to_host(runtime, _mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
|
|
|
|
if (mem_check != m3Err_none) {
|
|
|
|
|
|
|
|
return mem_check;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_errno_t ret = __wasi_fd_read(fd, iovs, iovs_len, nread);
|
|
|
|
__wasi_errno_t ret = __wasi_fd_read(fd, iovs, iovs_len, nread);
|
|
|
|
|
|
|
|
|
|
|
@ -707,7 +715,10 @@ m3ApiRawFunction(m3_wasi_generic_fd_write)
|
|
|
|
m3ApiCheckMem(nwritten, sizeof(__wasi_size_t));
|
|
|
|
m3ApiCheckMem(nwritten, sizeof(__wasi_size_t));
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
copy_iov_to_host(_mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
const void* mem_check = copy_iov_to_host(runtime, _mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
|
|
|
|
if (mem_check != m3Err_none) {
|
|
|
|
|
|
|
|
return mem_check;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_errno_t ret = __wasi_fd_write(fd, (__wasi_ciovec_t*)iovs, iovs_len, nwritten);
|
|
|
|
__wasi_errno_t ret = __wasi_fd_write(fd, (__wasi_ciovec_t*)iovs, iovs_len, nwritten);
|
|
|
|
|
|
|
|
|
|
|
@ -729,8 +740,11 @@ m3ApiRawFunction(m3_wasi_generic_fd_pwrite)
|
|
|
|
m3ApiCheckMem(nwritten, sizeof(__wasi_size_t));
|
|
|
|
m3ApiCheckMem(nwritten, sizeof(__wasi_size_t));
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
__wasi_iovec_t iovs[iovs_len];
|
|
|
|
copy_iov_to_host(_mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
const void* mem_check = copy_iov_to_host(runtime, _mem, iovs, wasi_iovs, iovs_len);
|
|
|
|
|
|
|
|
if (mem_check != m3Err_none) {
|
|
|
|
|
|
|
|
return mem_check;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
__wasi_errno_t ret = __wasi_fd_pwrite(fd, (__wasi_ciovec_t*)iovs, iovs_len, offset, nwritten);
|
|
|
|
__wasi_errno_t ret = __wasi_fd_pwrite(fd, (__wasi_ciovec_t*)iovs, iovs_len, offset, nwritten);
|
|
|
|
|
|
|
|
|
|
|
|
WASI_TRACE("fd:%d | nwritten:%d", fd, *nwritten);
|
|
|
|
WASI_TRACE("fd:%d | nwritten:%d", fd, *nwritten);
|
|
|
|