Implement Berkeley Socket API for Intel SGX (#1061)

Implement Berkeley Socket API for Intel SGX
- bring Berkeley socket API in Intel SGX enclaves,
- adapt the documentation of the socket API to mention Intel SGX enclaves,
- adapt _iwasm_ in the mini-product _linux-sgx_ to support the same option as the one for _linux_,
- tested on the socket sample as provided by WAMR (the TCP client/server).
This commit is contained in:
Jämes Ménétrey
2022-03-25 10:46:29 +01:00
committed by GitHub
parent 5264ce4118
commit 106974d915
7 changed files with 543 additions and 38 deletions

View File

@ -50,6 +50,8 @@ typedef struct EnclaveModule {
uint32 wasi_dir_list_size;
char **wasi_env_list;
uint32 wasi_env_list_size;
char **wasi_addr_pool_list;
uint32 wasi_addr_pool_list_size;
char **wasi_argv;
uint32 wasi_argc;
bool is_xip_file;
@ -407,6 +409,8 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
char **wasi_argv = *(char ***)args++;
char *p, *p1;
uint32 wasi_argc = *(uint32 *)args++;
char **addr_pool_list = *(char ***)args++;
uint32 addr_pool_list_size = *(uint32 *)args++;
uint64 total_size = 0;
int32 i, str_len;
@ -414,6 +418,7 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
total_size += sizeof(char *) * (uint64)dir_list_size
+ sizeof(char *) * (uint64)env_list_size
+ sizeof(char *) * (uint64)addr_pool_list_size
+ sizeof(char *) * (uint64)wasi_argc;
for (i = 0; i < dir_list_size; i++) {
@ -424,6 +429,10 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
total_size += strlen(env_list[i]) + 1;
}
for (i = 0; i < addr_pool_list_size; i++) {
total_size += strlen(addr_pool_list[i]) + 1;
}
for (i = 0; i < wasi_argc; i++) {
total_size += strlen(wasi_argv[i]) + 1;
}
@ -436,7 +445,7 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
}
p1 = p + sizeof(char *) * dir_list_size + sizeof(char *) * env_list_size
+ sizeof(char *) * wasi_argc;
+ sizeof(char *) * addr_pool_list_size + sizeof(char *) * wasi_argc;
if (dir_list_size > 0) {
enclave_module->wasi_dir_list = (char **)p;
@ -462,6 +471,18 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
p += sizeof(char *) * env_list_size;
}
if (addr_pool_list_size > 0) {
enclave_module->wasi_addr_pool_list = (char **)p;
enclave_module->wasi_addr_pool_list_size = addr_pool_list_size;
for (i = 0; i < addr_pool_list_size; i++) {
enclave_module->wasi_addr_pool_list[i] = p1;
str_len = strlen(addr_pool_list[i]);
bh_memcpy_s(p1, str_len + 1, addr_pool_list[i], str_len + 1);
p1 += str_len + 1;
}
p += sizeof(char *) * addr_pool_list_size;
}
if (wasi_argc > 0) {
enclave_module->wasi_argv = (char **)p;
enclave_module->wasi_argc = wasi_argc;
@ -481,6 +502,11 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
(stdinfd != -1) ? stdinfd : 0, (stdoutfd != -1) ? stdoutfd : 1,
(stderrfd != -1) ? stderrfd : 2);
wasm_runtime_set_wasi_addr_pool(
enclave_module->module,
(const char **)enclave_module->wasi_addr_pool_list,
addr_pool_list_size);
*args_org = true;
}
#else