Implement Inclavare Containers PAL interface in WAMR Linux-SGX (#429)

* Implement the PAL interface for rune

Work in progress

Signed-off-by: Le Yao <le.yao@intel.com>

* Support PAL for one runtime with multi-instances

Load runtime into enclave and run multi-instances

Signed-off-by: Le Yao <le.yao@intel.com>
This commit is contained in:
YaoLe
2020-10-29 11:34:34 +08:00
committed by GitHub
parent ad4aa9a85f
commit ed94b7dcc4
4 changed files with 584 additions and 0 deletions

View File

@ -16,6 +16,7 @@
#include "Enclave_u.h"
#include "sgx_urts.h"
#include "pal_api.h"
#ifndef TRUE
#define TRUE 1
@ -33,6 +34,12 @@
static sgx_enclave_id_t g_eid = 0;
sgx_enclave_id_t
pal_get_enclave_id(void)
{
return g_eid;
}
void
ocall_print(const char* str)
{
@ -734,3 +741,163 @@ fail1:
return 0;
}
int
wamr_pal_get_version(void)
{
return WAMR_PAL_VERSION;
}
int
wamr_pal_init(const struct wamr_pal_attr *args)
{
sgx_enclave_id_t *p_eid = &g_eid;
if (enclave_init(&g_eid) < 0) {
std::cout << "Fail to initialize enclave." << std::endl;
return 1;
}
}
int
wamr_pal_create_process(struct wamr_pal_create_process_args *args)
{
uint32_t stack_size = 16 * 1024, heap_size = 16 * 1024;
int log_verbose_level = 2;
bool is_repl_mode = false, alloc_with_pool = false;
const char *dir_list[8] = { NULL };
uint32_t dir_list_size = 0;
const char *env_list[8] = { NULL };
uint32_t env_list_size = 0;
uint32_t max_thread_num = 4;
char *wasm_files[16];
void *wasm_module_inst[16];
int argc = 2;
char *argv[argc] = { (char*)"./iwasm", (char *)args->argv[0] };
uint8_t *wasm_files_buf = NULL;
void *wasm_modules = NULL;
int len = 0, i;
char *temp = (char *)args->argv[0];
while(temp) {
len++;
temp=(char *)args->argv[len];
}
if (len > sizeof(wasm_files)/sizeof(char *)) {
printf("Number of input files is out of range\n");
return -1;
}
for (i = 0; i < len; ++i) {
wasm_files[i] = (char *)args->argv[i];
}
/* Init runtime */
if (!init_runtime(alloc_with_pool, max_thread_num)) {
printf("Failed to init runtime\n");
return -1;
}
/* Set log verbose level */
if (!set_log_verbose_level(log_verbose_level)) {
printf("Failed to set log level\n");
destroy_runtime();
return -1;
}
for (i = 0; i < len; ++i) {
uint8_t *wasm_file_buf = NULL;
uint32_t wasm_file_size;
void *wasm_module = NULL;
char error_buf[128] = { 0 };
/* Load WASM byte buffer from WASM bin file */
if (!(wasm_file_buf = (uint8_t *)read_file_to_buffer
(wasm_files[i], &wasm_file_size))) {
printf("Failed to read file to buffer\n");
destroy_runtime();
return -1;
}
/* Load module */
if (!(wasm_module = load_module(wasm_file_buf, wasm_file_size,
error_buf, sizeof(error_buf)))) {
printf("%s\n", error_buf);
free(wasm_file_buf);
destroy_runtime();
return -1;
}
/* Set wasi arguments */
if (!set_wasi_args(wasm_module, dir_list, dir_list_size,
env_list, env_list_size, argv, argc)) {
printf("%s\n", "set wasi arguments failed.\n");
unload_module(wasm_module);
free(wasm_file_buf);
destroy_runtime();
return -1;
}
/* Instantiate module */
if (!(wasm_module_inst[i] = instantiate_module(wasm_module,
stack_size, heap_size,
error_buf,
sizeof(error_buf)))) {
printf("%s\n", error_buf);
unload_module(wasm_module);
free(wasm_file_buf);
destroy_runtime();
return -1;
}
app_instance_main(wasm_module_inst[i], argc, argv);
/* Deinstantiate module */
deinstantiate_module(wasm_module_inst[i]);
unload_module(wasm_module);
free(wasm_file_buf);
}
destroy_runtime();
return 0;
}
int
wamr_pal_destroy(void)
{
//sgx_destroy_enclave(g_eid);
return 0;
}
int
wamr_pal_exec(struct wamr_pal_exec_args *args)
{
//app_instance_main(wasm_module_inst[i], argc, argv);
return 0;
}
int
wamr_pal_kill(int pid, int sig)
{
//deinstantiate_module(wasm_module_inst[i]);
//unload_module(wasm_module);
//free(wasm_file_buf);
return 0;
}
int pal_get_version(void) __attribute__((weak, alias ("wamr_pal_get_version")));
int pal_init(const struct wamr_pal_attr *attr)\
__attribute__ ((weak, alias ("wamr_pal_init")));
int pal_create_process(struct wamr_pal_create_process_args *args)\
__attribute__ ((weak, alias ("wamr_pal_create_process")));
int pal_exec(struct wamr_pal_exec_args *args)\
__attribute__ ((weak, alias ("wamr_pal_exec")));
int pal_kill(int pid, int sig) __attribute__ ((weak, alias ("wamr_pal_kill")));
int pal_destroy(void) __attribute__ ((weak, alias ("wamr_pal_destroy")));