Skip to content

Commit 912c2a6

Browse files
authored
add a set of apis to configure wasi via InstantiationArgs2 (#4707)
* track if WASIArguments is configured by user i plan to use this to decide which wasi arguments (the one from module or the one from InstantiationArgs2) to use. * add WASIArguments to InstantiationArgs2 * use wasi configuration from InstantiationArgs2 if any fallback to the via-module configuration for now. * add a few api to configure wasi via InstantiationArgs2 * configure wasi via InstantiationArgs2 for platforms using libc_wasi.c * rt-thread: migrate to libc_wasi_set_init_args * common/libc_wasi.c: retire libc_wasi_init * fix build without wasi
1 parent 0cefefa commit 912c2a6

File tree

10 files changed

+213
-40
lines changed

10 files changed

+213
-40
lines changed

core/iwasm/aot/aot_runtime.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2081,17 +2081,25 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent,
20812081

20822082
#if WASM_ENABLE_LIBC_WASI != 0
20832083
if (!is_sub_inst) {
2084+
const WASIArguments *wasi_args = &args->wasi;
2085+
if (module->wasi_args.set_by_user) {
2086+
if (wasi_args->set_by_user) {
2087+
set_error_buf(error_buf, error_buf_size,
2088+
"WASI configuration was given via both of module "
2089+
"and InstantiationArgs2");
2090+
goto fail;
2091+
}
2092+
wasi_args = &module->wasi_args;
2093+
}
20842094
if (!wasm_runtime_init_wasi(
2085-
(WASMModuleInstanceCommon *)module_inst,
2086-
module->wasi_args.dir_list, module->wasi_args.dir_count,
2087-
module->wasi_args.map_dir_list, module->wasi_args.map_dir_count,
2088-
module->wasi_args.env, module->wasi_args.env_count,
2089-
module->wasi_args.addr_pool, module->wasi_args.addr_count,
2090-
module->wasi_args.ns_lookup_pool,
2091-
module->wasi_args.ns_lookup_count, module->wasi_args.argv,
2092-
module->wasi_args.argc, module->wasi_args.stdio[0],
2093-
module->wasi_args.stdio[1], module->wasi_args.stdio[2],
2094-
error_buf, error_buf_size))
2095+
(WASMModuleInstanceCommon *)module_inst, wasi_args->dir_list,
2096+
wasi_args->dir_count, wasi_args->map_dir_list,
2097+
wasi_args->map_dir_count, wasi_args->env, wasi_args->env_count,
2098+
wasi_args->addr_pool, wasi_args->addr_count,
2099+
wasi_args->ns_lookup_pool, wasi_args->ns_lookup_count,
2100+
wasi_args->argv, wasi_args->argc, wasi_args->stdio[0],
2101+
wasi_args->stdio[1], wasi_args->stdio[2], error_buf,
2102+
error_buf_size))
20952103
goto fail;
20962104
}
20972105
#endif

core/iwasm/common/wasm_runtime_common.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,6 +1648,9 @@ void
16481648
wasm_runtime_instantiation_args_set_defaults(struct InstantiationArgs2 *args)
16491649
{
16501650
memset(args, 0, sizeof(*args));
1651+
#if WASM_ENABLE_LIBC_WASI != 0
1652+
wasi_args_set_defaults(&args->wasi);
1653+
#endif
16511654
}
16521655

16531656
WASMModuleInstanceCommon *
@@ -1714,6 +1717,84 @@ wasm_runtime_instantiation_args_set_max_memory_pages(
17141717
p->v1.max_memory_pages = v;
17151718
}
17161719

1720+
#if WASM_ENABLE_LIBC_WASI != 0
1721+
void
1722+
wasm_runtime_instantiation_args_set_wasi_arg(struct InstantiationArgs2 *p,
1723+
char *argv[], int argc)
1724+
{
1725+
WASIArguments *wasi_args = &p->wasi;
1726+
1727+
wasi_args->argv = argv;
1728+
wasi_args->argc = (uint32)argc;
1729+
wasi_args->set_by_user = true;
1730+
}
1731+
1732+
void
1733+
wasm_runtime_instantiation_args_set_wasi_env(struct InstantiationArgs2 *p,
1734+
const char *env[],
1735+
uint32 env_count)
1736+
{
1737+
WASIArguments *wasi_args = &p->wasi;
1738+
1739+
wasi_args->env = env;
1740+
wasi_args->env_count = env_count;
1741+
wasi_args->set_by_user = true;
1742+
}
1743+
1744+
void
1745+
wasm_runtime_instantiation_args_set_wasi_dir(struct InstantiationArgs2 *p,
1746+
const char *dir_list[],
1747+
uint32 dir_count,
1748+
const char *map_dir_list[],
1749+
uint32 map_dir_count)
1750+
{
1751+
WASIArguments *wasi_args = &p->wasi;
1752+
1753+
wasi_args->dir_list = dir_list;
1754+
wasi_args->dir_count = dir_count;
1755+
wasi_args->map_dir_list = map_dir_list;
1756+
wasi_args->map_dir_count = map_dir_count;
1757+
wasi_args->set_by_user = true;
1758+
}
1759+
1760+
void
1761+
wasm_runtime_instantiation_args_set_wasi_stdio(struct InstantiationArgs2 *p,
1762+
int64 stdinfd, int64 stdoutfd,
1763+
int64 stderrfd)
1764+
{
1765+
WASIArguments *wasi_args = &p->wasi;
1766+
1767+
wasi_args->stdio[0] = (os_raw_file_handle)stdinfd;
1768+
wasi_args->stdio[1] = (os_raw_file_handle)stdoutfd;
1769+
wasi_args->stdio[2] = (os_raw_file_handle)stderrfd;
1770+
wasi_args->set_by_user = true;
1771+
}
1772+
1773+
void
1774+
wasm_runtime_instantiation_args_set_wasi_addr_pool(struct InstantiationArgs2 *p,
1775+
const char *addr_pool[],
1776+
uint32 addr_pool_size)
1777+
{
1778+
WASIArguments *wasi_args = &p->wasi;
1779+
1780+
wasi_args->addr_pool = addr_pool;
1781+
wasi_args->addr_count = addr_pool_size;
1782+
wasi_args->set_by_user = true;
1783+
}
1784+
1785+
void
1786+
wasm_runtime_instantiation_args_set_wasi_ns_lookup_pool(
1787+
struct InstantiationArgs2 *p, const char *ns_lookup_pool[],
1788+
uint32 ns_lookup_pool_size)
1789+
{
1790+
WASIArguments *wasi_args = &p->wasi;
1791+
1792+
wasi_args->ns_lookup_pool = ns_lookup_pool;
1793+
wasi_args->ns_lookup_count = ns_lookup_pool_size;
1794+
wasi_args->set_by_user = true;
1795+
}
1796+
#endif /* WASM_ENABLE_LIBC_WASI != 0 */
1797+
17171798
WASMModuleInstanceCommon *
17181799
wasm_runtime_instantiate_ex2(WASMModuleCommon *module,
17191800
const struct InstantiationArgs2 *args,
@@ -3494,6 +3575,7 @@ wasm_runtime_set_wasi_args_ex(WASMModuleCommon *module, const char *dir_list[],
34943575
wasi_args->stdio[0] = (os_raw_file_handle)stdinfd;
34953576
wasi_args->stdio[1] = (os_raw_file_handle)stdoutfd;
34963577
wasi_args->stdio[2] = (os_raw_file_handle)stderrfd;
3578+
wasi_args->set_by_user = true;
34973579

34983580
#if WASM_ENABLE_MULTI_MODULE != 0
34993581
#if WASM_ENABLE_INTERP != 0
@@ -3524,6 +3606,7 @@ wasm_runtime_set_wasi_addr_pool(wasm_module_t module, const char *addr_pool[],
35243606
if (wasi_args) {
35253607
wasi_args->addr_pool = addr_pool;
35263608
wasi_args->addr_count = addr_pool_size;
3609+
wasi_args->set_by_user = true;
35273610
}
35283611
}
35293612

@@ -3537,6 +3620,7 @@ wasm_runtime_set_wasi_ns_lookup_pool(wasm_module_t module,
35373620
if (wasi_args) {
35383621
wasi_args->ns_lookup_pool = ns_lookup_pool;
35393622
wasi_args->ns_lookup_count = ns_lookup_pool_size;
3623+
wasi_args->set_by_user = true;
35403624
}
35413625
}
35423626

core/iwasm/common/wasm_runtime_common.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,9 @@ wasm_runtime_get_exec_env_tls(void);
614614

615615
struct InstantiationArgs2 {
616616
InstantiationArgs v1;
617+
#if WASM_ENABLE_LIBC_WASI != 0
618+
WASIArguments wasi;
619+
#endif
617620
};
618621

619622
void
@@ -735,6 +738,43 @@ void
735738
wasm_runtime_instantiation_args_set_max_memory_pages(
736739
struct InstantiationArgs2 *p, uint32 v);
737740

741+
/* See wasm_export.h for description */
742+
WASM_RUNTIME_API_EXTERN void
743+
wasm_runtime_instantiation_args_set_wasi_arg(struct InstantiationArgs2 *p,
744+
char *argv[], int argc);
745+
746+
/* See wasm_export.h for description */
747+
WASM_RUNTIME_API_EXTERN void
748+
wasm_runtime_instantiation_args_set_wasi_env(struct InstantiationArgs2 *p,
749+
const char *env[],
750+
uint32 env_count);
751+
752+
/* See wasm_export.h for description */
753+
WASM_RUNTIME_API_EXTERN void
754+
wasm_runtime_instantiation_args_set_wasi_dir(struct InstantiationArgs2 *p,
755+
const char *dir_list[],
756+
uint32 dir_count,
757+
const char *map_dir_list[],
758+
uint32 map_dir_count);
759+
760+
/* See wasm_export.h for description */
761+
WASM_RUNTIME_API_EXTERN void
762+
wasm_runtime_instantiation_args_set_wasi_stdio(struct InstantiationArgs2 *p,
763+
int64 stdinfd, int64 stdoutfd,
764+
int64 stderrfd);
765+
766+
/* See wasm_export.h for description */
767+
WASM_RUNTIME_API_EXTERN void
768+
wasm_runtime_instantiation_args_set_wasi_addr_pool(struct InstantiationArgs2 *p,
769+
const char *addr_pool[],
770+
uint32 addr_pool_size);
771+
772+
/* See wasm_export.h for description */
773+
WASM_RUNTIME_API_EXTERN void
774+
wasm_runtime_instantiation_args_set_wasi_ns_lookup_pool(
775+
struct InstantiationArgs2 *p, const char *ns_lookup_pool[],
776+
uint32 ns_lookup_pool_size);
777+
738778
/* See wasm_export.h for description */
739779
WASM_RUNTIME_API_EXTERN WASMModuleInstanceCommon *
740780
wasm_runtime_instantiate_ex2(WASMModuleCommon *module,

core/iwasm/include/wasm_export.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,38 @@ WASM_RUNTIME_API_EXTERN void
764764
wasm_runtime_instantiation_args_set_max_memory_pages(
765765
struct InstantiationArgs2 *p, uint32_t v);
766766

767+
WASM_RUNTIME_API_EXTERN void
768+
wasm_runtime_instantiation_args_set_wasi_arg(struct InstantiationArgs2 *p,
769+
char *argv[], int argc);
770+
771+
WASM_RUNTIME_API_EXTERN void
772+
wasm_runtime_instantiation_args_set_wasi_env(struct InstantiationArgs2 *p,
773+
const char *env[],
774+
uint32_t env_count);
775+
776+
WASM_RUNTIME_API_EXTERN void
777+
wasm_runtime_instantiation_args_set_wasi_dir(struct InstantiationArgs2 *p,
778+
const char *dir_list[],
779+
uint32_t dir_count,
780+
const char *map_dir_list[],
781+
uint32_t map_dir_count);
782+
783+
WASM_RUNTIME_API_EXTERN void
784+
wasm_runtime_instantiation_args_set_wasi_stdio(struct InstantiationArgs2 *p,
785+
int64_t stdinfd,
786+
int64_t stdoutfd,
787+
int64_t stderrfd);
788+
789+
WASM_RUNTIME_API_EXTERN void
790+
wasm_runtime_instantiation_args_set_wasi_addr_pool(struct InstantiationArgs2 *p,
791+
const char *addr_pool[],
792+
uint32_t addr_pool_size);
793+
794+
WASM_RUNTIME_API_EXTERN void
795+
wasm_runtime_instantiation_args_set_wasi_ns_lookup_pool(
796+
struct InstantiationArgs2 *p, const char *ns_lookup_pool[],
797+
uint32_t ns_lookup_pool_size);
798+
767799
/**
768800
* Instantiate a WASM module, with specified instantiation arguments
769801
*

core/iwasm/interpreter/wasm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,7 @@ typedef struct WASIArguments {
848848
char **argv;
849849
uint32 argc;
850850
os_raw_file_handle stdio[3];
851+
bool set_by_user;
851852
} WASIArguments;
852853
#endif
853854

core/iwasm/interpreter/wasm_runtime.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3276,17 +3276,25 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent,
32763276
#if WASM_ENABLE_LIBC_WASI != 0
32773277
/* The sub-instance will get the wasi_ctx from main-instance */
32783278
if (!is_sub_inst) {
3279+
const WASIArguments *wasi_args = &args->wasi;
3280+
if (module->wasi_args.set_by_user) {
3281+
if (wasi_args->set_by_user) {
3282+
set_error_buf(error_buf, error_buf_size,
3283+
"WASI configuration was given via both of module "
3284+
"and InstantiationArgs2");
3285+
goto fail;
3286+
}
3287+
wasi_args = &module->wasi_args;
3288+
}
32793289
if (!wasm_runtime_init_wasi(
3280-
(WASMModuleInstanceCommon *)module_inst,
3281-
module->wasi_args.dir_list, module->wasi_args.dir_count,
3282-
module->wasi_args.map_dir_list, module->wasi_args.map_dir_count,
3283-
module->wasi_args.env, module->wasi_args.env_count,
3284-
module->wasi_args.addr_pool, module->wasi_args.addr_count,
3285-
module->wasi_args.ns_lookup_pool,
3286-
module->wasi_args.ns_lookup_count, module->wasi_args.argv,
3287-
module->wasi_args.argc, module->wasi_args.stdio[0],
3288-
module->wasi_args.stdio[1], module->wasi_args.stdio[2],
3289-
error_buf, error_buf_size)) {
3290+
(WASMModuleInstanceCommon *)module_inst, wasi_args->dir_list,
3291+
wasi_args->dir_count, wasi_args->map_dir_list,
3292+
wasi_args->map_dir_count, wasi_args->env, wasi_args->env_count,
3293+
wasi_args->addr_pool, wasi_args->addr_count,
3294+
wasi_args->ns_lookup_pool, wasi_args->ns_lookup_count,
3295+
wasi_args->argv, wasi_args->argc, wasi_args->stdio[0],
3296+
wasi_args->stdio[1], wasi_args->stdio[2], error_buf,
3297+
error_buf_size)) {
32903298
goto fail;
32913299
}
32923300
}

product-mini/platforms/common/libc_wasi.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,18 @@ libc_wasi_parse(char *arg, libc_wasi_parse_context_t *ctx)
162162
return LIBC_WASI_PARSE_RESULT_OK;
163163
}
164164

165-
void
166-
libc_wasi_init(wasm_module_t wasm_module, int argc, char **argv,
167-
libc_wasi_parse_context_t *ctx)
165+
static void
166+
libc_wasi_set_init_args(struct InstantiationArgs2 *args, int argc, char **argv,
167+
libc_wasi_parse_context_t *ctx)
168168
{
169-
wasm_runtime_set_wasi_args(wasm_module, ctx->dir_list, ctx->dir_list_size,
170-
ctx->map_dir_list, ctx->map_dir_list_size,
171-
ctx->env_list, ctx->env_list_size, argv, argc);
172-
173-
wasm_runtime_set_wasi_addr_pool(wasm_module, ctx->addr_pool,
174-
ctx->addr_pool_size);
175-
wasm_runtime_set_wasi_ns_lookup_pool(wasm_module, ctx->ns_lookup_pool,
176-
ctx->ns_lookup_pool_size);
169+
wasm_runtime_instantiation_args_set_wasi_arg(args, argv, argc);
170+
wasm_runtime_instantiation_args_set_wasi_env(args, ctx->env_list,
171+
ctx->env_list_size);
172+
wasm_runtime_instantiation_args_set_wasi_dir(
173+
args, ctx->dir_list, ctx->dir_list_size, ctx->map_dir_list,
174+
ctx->map_dir_list_size);
175+
wasm_runtime_instantiation_args_set_wasi_addr_pool(args, ctx->addr_pool,
176+
ctx->addr_pool_size);
177+
wasm_runtime_instantiation_args_set_wasi_ns_lookup_pool(
178+
args, ctx->ns_lookup_pool, ctx->ns_lookup_pool_size);
177179
}

product-mini/platforms/posix/main.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -962,10 +962,6 @@ main(int argc, char *argv[])
962962
}
963963
#endif
964964

965-
#if WASM_ENABLE_LIBC_WASI != 0
966-
libc_wasi_init(wasm_module, argc, argv, &wasi_parse_ctx);
967-
#endif
968-
969965
if (!wasm_runtime_instantiation_args_create(&inst_args)) {
970966
printf("failed to create instantiate args\n");
971967
goto fail3;
@@ -974,6 +970,9 @@ main(int argc, char *argv[])
974970
stack_size);
975971
wasm_runtime_instantiation_args_set_host_managed_heap_size(inst_args,
976972
heap_size);
973+
#if WASM_ENABLE_LIBC_WASI != 0
974+
libc_wasi_set_init_args(inst_args, argc, argv, &wasi_parse_ctx);
975+
#endif
977976

978977
/* instantiate the module */
979978
wasm_module_inst = wasm_runtime_instantiate_ex2(

product-mini/platforms/rt-thread/iwasm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ iwasm(int argc, char **argv)
380380
wasm_runtime_instantiation_args_set_host_managed_heap_size(inst_args,
381381
heap_size);
382382
#if WASM_ENABLE_LIBC_WASI != 0
383-
libc_wasi_init(wasm_module, argc, argv, &wasi_parse_ctx);
383+
libc_wasi_set_init_args(wasm_module, argc, argv, &wasi_parse_ctx);
384384
#endif
385385

386386
rt_memset(error_buf, 0x00, sizeof(error_buf));

product-mini/platforms/windows/main.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -598,10 +598,6 @@ main(int argc, char *argv[])
598598
goto fail2;
599599
}
600600

601-
#if WASM_ENABLE_LIBC_WASI != 0
602-
libc_wasi_init(wasm_module, argc, argv, &wasi_parse_ctx);
603-
#endif
604-
605601
if (!wasm_runtime_instantiation_args_create(&inst_args)) {
606602
printf("failed to create instantiate args\n");
607603
goto fail3;
@@ -610,6 +606,9 @@ main(int argc, char *argv[])
610606
stack_size);
611607
wasm_runtime_instantiation_args_set_host_managed_heap_size(inst_args,
612608
heap_size);
609+
#if WASM_ENABLE_LIBC_WASI != 0
610+
libc_wasi_set_init_args(inst_args, argc, argv, &wasi_parse_ctx);
611+
#endif
613612

614613
/* instantiate the module */
615614
wasm_module_inst = wasm_runtime_instantiate_ex2(

0 commit comments

Comments
 (0)