Update WASI

extensions
Volodymyr Shymanskyy 5 years ago
parent 349855253f
commit d23269c76b

@ -39,19 +39,19 @@ void copy_iov_to_host(void* _mem, __wasi_iovec_t* host_iov, __wasi_iovec_t* wasi
m3ApiRawFunction(m3_wasi_unstable_args_get)
{
m3ApiReturnType (uint32_t)
m3ApiGetArgMem (u32 * , argv_offset)
m3ApiGetArgMem (u8 * , argv_buf_offset)
m3ApiGetArgMem (u32* , argv)
m3ApiGetArgMem (char* , argv_buf)
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
for (u32 i = 0; i < runtime->argc; ++i)
{
argv_offset [i] = m3ApiPtrToOffset (argv_buf_offset);
argv[i] = m3ApiPtrToOffset (argv_buf);
size_t len = strlen (runtime->argv [i]);
memcpy (argv_buf_offset, runtime->argv [i], len);
argv_buf_offset += len;
* argv_buf_offset++ = 0;
memcpy (argv_buf, runtime->argv [i], len);
argv_buf += len;
* argv_buf++ = 0;
}
m3ApiReturn(__WASI_ESUCCESS);
@ -77,12 +77,23 @@ m3ApiRawFunction(m3_wasi_unstable_args_sizes_get)
m3ApiRawFunction(m3_wasi_unstable_environ_get)
{
m3ApiReturnType (uint32_t)
m3ApiGetArg (uint32_t , environ_ptrs_offset)
m3ApiGetArg (uint32_t , environ_strs_offset)
m3ApiGetArgMem (u32* , environ)
m3ApiGetArgMem (char* , environ_buf)
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
// TODO
m3ApiReturn(__WASI_ESUCCESS);
__wasi_errno_t ret;
__wasi_size_t environ_count, environ_buf_size;
ret = __wasi_environ_sizes_get(&environ_count, &environ_buf_size);
if (ret != __WASI_ESUCCESS) m3ApiReturn(ret);
ret = __wasi_environ_get(environ, environ_buf);
if (ret != __WASI_ESUCCESS) m3ApiReturn(ret);
for (u32 i = 0; i < environ_count; ++i) {
environ[i] = m3ApiPtrToOffset (environ[i]);
}
m3ApiReturn(ret);
}
m3ApiRawFunction(m3_wasi_unstable_environ_sizes_get)
@ -91,11 +102,9 @@ m3ApiRawFunction(m3_wasi_unstable_environ_sizes_get)
m3ApiGetArgMem (__wasi_size_t* , environ_count)
m3ApiGetArgMem (__wasi_size_t* , environ_buf_size)
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
// TODO
*environ_count = 0;
*environ_buf_size = 0;
m3ApiReturn(__WASI_ESUCCESS);
__wasi_errno_t ret = __wasi_environ_sizes_get(environ_count, environ_buf_size);
m3ApiReturn(ret);
}
m3ApiRawFunction(m3_wasi_unstable_fd_prestat_dir_name)
@ -132,6 +141,17 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get)
m3ApiReturn(ret);
}
m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_set_flags)
{
m3ApiReturnType (uint32_t)
m3ApiGetArg (__wasi_fd_t , fd)
m3ApiGetArg (__wasi_fdflags_t , flags)
__wasi_errno_t ret = __wasi_fd_fdstat_set_flags(fd, flags);
m3ApiReturn(ret);
}
m3ApiRawFunction(m3_wasi_unstable_fd_seek)
{
m3ApiReturnType (uint32_t)
@ -253,6 +273,19 @@ m3ApiRawFunction(m3_wasi_unstable_clock_time_get)
m3ApiReturn(ret);
}
m3ApiRawFunction(m3_wasi_unstable_poll_oneoff)
{
m3ApiReturnType (uint32_t)
m3ApiGetArgMem (const __wasi_subscription_t* , in)
m3ApiGetArgMem (__wasi_event_t* , out)
m3ApiGetArg (__wasi_size_t , nsubscriptions)
m3ApiGetArgMem (__wasi_size_t* , nevents)
__wasi_errno_t ret = __wasi_poll_oneoff(in, out, nsubscriptions, nevents);
m3ApiReturn(ret);
}
m3ApiRawFunction(m3_wasi_unstable_proc_exit)
{
m3ApiReturnType (uint32_t)
@ -294,6 +327,7 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_get",
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", "i(ii*iiiii*)", &m3_wasi_unstable_path_open)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_unstable_fd_fdstat_get)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_unstable_fd_fdstat_set_flags)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(iii*)", &m3_wasi_unstable_fd_write)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(iii*)", &m3_wasi_unstable_fd_read)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_seek", "i(iii*)", &m3_wasi_unstable_fd_seek)));
@ -304,6 +338,8 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "random_get",
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_res_get", "i(i*)", &m3_wasi_unstable_clock_res_get)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_time_get", "i(ii*)", &m3_wasi_unstable_clock_time_get)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "poll_oneoff", "i(**i*)", &m3_wasi_unstable_poll_oneoff)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "proc_exit", "i(i)", &m3_wasi_unstable_proc_exit)));
_catch:

@ -45,11 +45,11 @@ typedef uint32_t __wasi_size_t;
# define close _close
#endif
struct wasi_iovec
typedef struct wasi_iovec_t
{
__wasi_size_t iov_base;
__wasi_size_t iov_len;
};
__wasi_size_t buf;
__wasi_size_t buf_len;
} wasi_iovec_t;
#define PREOPEN_CNT 5
@ -154,14 +154,13 @@ __wasi_timestamp_t convert_timespec(const struct timespec *ts) {
#if defined(HAS_IOVEC)
static
void copy_iov_to_host(struct iovec* host_iov, void* _mem, uint32_t iov_offset, int32_t iovs_len)
static inline
void copy_iov_to_host(void* _mem, struct iovec* host_iov, wasi_iovec_t* wasi_iov, int32_t iovs_len)
{
// Convert wasi_memory offsets to host addresses
struct wasi_iovec *wasi_iov = m3ApiOffsetToPtr(iov_offset);
// Convert wasi memory offsets to host addresses
for (int i = 0; i < iovs_len; i++) {
host_iov[i].iov_base = m3ApiOffsetToPtr(wasi_iov[i].iov_base);
host_iov[i].iov_len = wasi_iov[i].iov_len;
host_iov[i].iov_base = m3ApiOffsetToPtr(wasi_iov[i].buf);
host_iov[i].iov_len = wasi_iov[i].buf_len;
}
}
@ -174,19 +173,19 @@ void copy_iov_to_host(struct iovec* host_iov, void* _mem, uint32_t iov_offset, i
m3ApiRawFunction(m3_wasi_unstable_args_get)
{
m3ApiReturnType (uint32_t)
m3ApiGetArgMem (u32 * , argv_offset)
m3ApiGetArgMem (u8 * , argv_buf_offset)
m3ApiGetArgMem (u32* , argv)
m3ApiGetArgMem (char* , argv_buf)
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
for (u32 i = 0; i < runtime->argc; ++i)
{
argv_offset [i] = m3ApiPtrToOffset (argv_buf_offset);
argv[i] = m3ApiPtrToOffset (argv_buf);
size_t len = strlen (runtime->argv [i]);
memcpy (argv_buf_offset, runtime->argv [i], len);
argv_buf_offset += len;
* argv_buf_offset++ = 0;
memcpy (argv_buf, runtime->argv [i], len);
argv_buf += len;
* argv_buf++ = 0;
}
m3ApiReturn(__WASI_ESUCCESS);
@ -212,8 +211,8 @@ m3ApiRawFunction(m3_wasi_unstable_args_sizes_get)
m3ApiRawFunction(m3_wasi_unstable_environ_get)
{
m3ApiReturnType (uint32_t)
m3ApiGetArg (uint32_t , environ_ptrs_offset)
m3ApiGetArg (uint32_t , environ_strs_offset)
m3ApiGetArgMem (u32* , environ)
m3ApiGetArgMem (char* , environ_buf)
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
// TODO
@ -304,6 +303,17 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get)
#endif
}
m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_set_flags)
{
m3ApiReturnType (uint32_t)
m3ApiGetArg (__wasi_fd_t , fd)
m3ApiGetArg (__wasi_fdflags_t , flags)
// TODO
m3ApiReturn(__WASI_ESUCCESS);
}
m3ApiRawFunction(m3_wasi_unstable_fd_seek)
{
m3ApiReturnType (uint32_t)
@ -422,7 +432,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
{
m3ApiReturnType (uint32_t)
m3ApiGetArg (__wasi_fd_t , fd)
m3ApiGetArg (uint32_t , iovs_offset)
m3ApiGetArgMem (wasi_iovec_t* , wasi_iovs)
m3ApiGetArg (__wasi_size_t , iovs_len)
m3ApiGetArgMem (__wasi_size_t* , nread)
@ -430,7 +440,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
#if defined(HAS_IOVEC)
struct iovec iovs[iovs_len];
copy_iov_to_host(iovs, _mem, iovs_offset, iovs_len);
copy_iov_to_host(_mem, iovs, wasi_iovs, iovs_len);
ssize_t ret = readv(fd, iovs, iovs_len);
if (ret < 0) { m3ApiReturn(errno_to_wasi(errno)); }
@ -438,10 +448,9 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
m3ApiReturn(__WASI_ESUCCESS);
#else
ssize_t res = 0;
struct wasi_iovec *wasi_iov = m3ApiOffsetToPtr(iovs_offset);
for (__wasi_size_t i = 0; i < iovs_len; i++) {
void* addr = m3ApiOffsetToPtr(wasi_iov[i].iov_base);
size_t len = wasi_iov[i].iov_len;
void* addr = m3ApiOffsetToPtr(wasi_iovs[i].buf);
size_t len = wasi_iovs[i].buf_len;
if (len == 0) continue;
int ret = read (fd, addr, len);
@ -458,7 +467,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
{
m3ApiReturnType (uint32_t)
m3ApiGetArg (__wasi_fd_t , fd)
m3ApiGetArg (uint32_t , iovs_offset)
m3ApiGetArgMem (wasi_iovec_t* , wasi_iovs)
m3ApiGetArg (__wasi_size_t , iovs_len)
m3ApiGetArgMem (__wasi_size_t* , nwritten)
@ -466,7 +475,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
#if defined(HAS_IOVEC)
struct iovec iovs[iovs_len];
copy_iov_to_host(iovs, _mem, iovs_offset, iovs_len);
copy_iov_to_host(_mem, iovs, wasi_iovs, iovs_len);
ssize_t ret = writev(fd, iovs, iovs_len);
if (ret < 0) { m3ApiReturn(errno_to_wasi(errno)); }
@ -474,10 +483,9 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
m3ApiReturn(__WASI_ESUCCESS);
#else
ssize_t res = 0;
struct wasi_iovec *wasi_iov = m3ApiOffsetToPtr(iovs_offset);
for (__wasi_size_t i = 0; i < iovs_len; i++) {
void* addr = m3ApiOffsetToPtr(wasi_iov[i].iov_base);
size_t len = wasi_iov[i].iov_len;
void* addr = m3ApiOffsetToPtr(wasi_iovs[i].buf);
size_t len = wasi_iovs[i].buf_len;
if (len == 0) continue;
int ret = write (fd, addr, len);
@ -648,6 +656,7 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_get",
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", "i(ii*iiiii*)", &m3_wasi_unstable_path_open)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_unstable_fd_fdstat_get)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_unstable_fd_fdstat_set_flags)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(iii*)", &m3_wasi_unstable_fd_write)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(iii*)", &m3_wasi_unstable_fd_read)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_seek", "i(iii*)", &m3_wasi_unstable_fd_seek)));

Loading…
Cancel
Save