Try fixing MetaWASI. #189

extensions
Volodymyr Shymanskyy 4 years ago
parent 66094b585d
commit e1eabe768a

@ -30,6 +30,8 @@
# error "Missing WASI headers"
#endif
static m3_wasi_context_t* wasi_context;
typedef size_t __wasi_size_t;
static inline
@ -52,14 +54,16 @@ m3ApiRawFunction(m3_wasi_unstable_args_get)
m3ApiGetArgMem (uint32_t * , argv)
m3ApiGetArgMem (char * , argv_buf)
if (runtime == NULL) { m3ApiReturn(__WASI_ERRNO_INVAL); }
m3_wasi_context_t* context = (m3_wasi_context_t*)userdata;
if (context == NULL) { m3ApiReturn(__WASI_ERRNO_INVAL); }
for (u32 i = 0; i < runtime->argc; ++i)
for (u32 i = 0; i < context->argc; ++i)
{
argv[i] = m3ApiPtrToOffset (argv_buf);
m3ApiWriteMem32(&argv[i], m3ApiPtrToOffset(argv_buf));
size_t len = strlen (runtime->argv[i]);
memcpy (argv_buf, runtime->argv[i], len);
size_t len = strlen (context->argv[i]);
memcpy (argv_buf, context->argv[i], len);
argv_buf += len;
* argv_buf++ = 0;
}
@ -73,14 +77,19 @@ m3ApiRawFunction(m3_wasi_unstable_args_sizes_get)
m3ApiGetArgMem (__wasi_size_t * , argc)
m3ApiGetArgMem (__wasi_size_t * , argv_buf_size)
if (runtime == NULL) { m3ApiReturn(__WASI_ERRNO_INVAL); }
m3_wasi_context_t* context = (m3_wasi_context_t*)userdata;
if (context == NULL) { m3ApiReturn(__WASI_ERRNO_INVAL); }
*argc = runtime->argc;
*argv_buf_size = 0;
for (u32 i = 0; i < runtime->argc; ++i)
__wasi_size_t buflen = 0;
for (u32 i = 0; i < context->argc; ++i)
{
* argv_buf_size += strlen (runtime->argv[i]) + 1;
buflen += strlen (context->argv[i]) + 1;
}
m3ApiWriteMem32(argc, context->argc);
m3ApiWriteMem32(argv_buf_size, buflen);
m3ApiReturn(__WASI_ERRNO_SUCCESS);
}
@ -333,7 +342,11 @@ m3ApiRawFunction(m3_wasi_unstable_proc_exit)
{
m3ApiGetArg (uint32_t, code)
runtime->exit_code = code;
m3_wasi_context_t* context = (m3_wasi_context_t*)userdata;
if (context) {
context->exit_code = code;
}
m3ApiTrap(m3Err_trapExit);
}
@ -348,19 +361,29 @@ M3Result SuppressLookupFailure(M3Result i_result)
return i_result;
}
m3_wasi_context_t* m3_GetWasiContext()
{
return wasi_context;
}
M3Result m3_LinkWASI (IM3Module module)
{
M3Result result = m3Err_none;
wasi_context = (m3_wasi_context_t*)malloc(sizeof(m3_wasi_context_t));
wasi_context->exit_code = 0;
wasi_context->argc = 0;
wasi_context->argv = 0;
static const char* namespaces[2] = { "wasi_unstable", "wasi_snapshot_preview1" };
for (int i=0; i<2; i++)
{
const char* wasi = namespaces[i];
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "args_get", "i(**)", &m3_wasi_unstable_args_get)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "args_sizes_get", "i(**)", &m3_wasi_unstable_args_sizes_get)));
_ (SuppressLookupFailure (m3_LinkRawFunctionEx (module, wasi, "args_get", "i(**)", &m3_wasi_unstable_args_get, wasi_context)));
_ (SuppressLookupFailure (m3_LinkRawFunctionEx (module, wasi, "args_sizes_get", "i(**)", &m3_wasi_unstable_args_sizes_get, wasi_context)));
_ (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, "environ_get", "i(**)", &m3_wasi_unstable_environ_get)));
@ -400,7 +423,7 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open",
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_unlink_file", "i(i*i)", )));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "poll_oneoff", "i(**i*)", &m3_wasi_unstable_poll_oneoff)));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "proc_exit", "v(i)", &m3_wasi_unstable_proc_exit)));
_ (SuppressLookupFailure (m3_LinkRawFunctionEx (module, wasi, "proc_exit", "v(i)", &m3_wasi_unstable_proc_exit, wasi_context)));
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "proc_raise", "i(i)", )));
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "random_get", "i(*i)", &m3_wasi_unstable_random_get)));
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "sched_yield", "i()", )));

@ -15,6 +15,12 @@
#if defined(d_m3HasWASI)
// Fixup wasi_core.h
#if defined (M3_COMPILER_MSVC)
# define _Static_assert(...)
# define __attribute__(...)
#endif
#include "extra/wasi_core.h"
#include <sys/types.h>

Loading…
Cancel
Save