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:
@ -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")));
|
||||
|
||||
Reference in New Issue
Block a user