diff --git a/src/pal/src/pal_api.c b/src/pal/src/pal_api.c index 82e0cd69..d2e35504 100644 --- a/src/pal/src/pal_api.c +++ b/src/pal/src/pal_api.c @@ -9,6 +9,9 @@ #include "pal_syscall.h" #include "pal_thread_counter.h" #include "pal_check_fsgsbase.h" +#ifdef SGX_MODE_HYPER +#include "pal_ms_buffer.h" +#endif #include "errno2str.h" #include @@ -153,8 +156,26 @@ int occlum_pal_create_process(struct occlum_pal_create_process_args *args) { return -1; } +#ifndef SGX_MODE_HYPER sgx_status_t ecall_status = occlum_ecall_new_process(eid, &ecall_ret, args->path, args->argv, args->env, args->stdio); +#else + const char **ms_buffer_argv = ms_buffer_convert_string_array(eid, args->argv); + const char **ms_buffer_env = ms_buffer_convert_string_array(eid, args->env); + if ((!args->argv != !ms_buffer_argv) || (!args->env != !ms_buffer_env)) { + PAL_ERROR("Marshal buffer size is not enough"); + return -1; + } + sgx_status_t ecall_status = occlum_ecall_new_process( + eid, + &ecall_ret, + args->path, + ms_buffer_argv, + ms_buffer_env, + args->stdio); + ms_buffer_string_array_free(eid, ms_buffer_argv); + ms_buffer_string_array_free(eid, ms_buffer_env); +#endif if (ecall_status != SGX_SUCCESS) { const char *sgx_err = pal_get_sgx_error_msg(ecall_status); PAL_ERROR("Failed to do ECall with error code 0x%x: %s", ecall_status, sgx_err); diff --git a/src/pal/src/pal_ms_buffer.c b/src/pal/src/pal_ms_buffer.c new file mode 100644 index 00000000..28e598dc --- /dev/null +++ b/src/pal/src/pal_ms_buffer.c @@ -0,0 +1,68 @@ +#ifdef SGX_MODE_HYPER +#include +#include +#include + +#include "Enclave_u.h" +#include "pal_ms_buffer.h" + +void ms_buffer_string_array_free(sgx_enclave_id_t eid, const char **str_array) { + if (!str_array) { + return; + } + + const char *string = *str_array; + int array_size = 0; + + while (string) { + sgx_ecall_ms_buffer_free(eid); + array_size++; + string = str_array[array_size]; + } + sgx_ecall_ms_buffer_free(eid); +} + +const char **ms_buffer_convert_string_array(sgx_enclave_id_t eid, + const char **str_array) { + if (str_array == NULL) { + return NULL; + } + + int string_len = 0; + const char *string = *str_array; + int array_size = 0; + + while (string) { + array_size++; + string = str_array[array_size]; + } + + const char **ms_buf_str_array = (const char **)sgx_ecall_ms_buffer_alloc(eid, + sizeof(char *) * (array_size + 1)); + + if (!ms_buf_str_array) { + return NULL; + } + + for (int i = 0; i < array_size; ++i) { + ms_buf_str_array[i] = NULL; + string = str_array[i]; + string_len = strlen(string); + + char *ms_parameter = (char *)sgx_ecall_ms_buffer_alloc(eid, string_len + 1); + + if (!ms_parameter) { + ms_buffer_string_array_free(eid, ms_buf_str_array); + return NULL; + } + + memcpy(ms_parameter, string, string_len); + ms_parameter[string_len] = 0; + + ms_buf_str_array[i] = ms_parameter; + } + + ms_buf_str_array[array_size] = NULL; + return ms_buf_str_array; +} +#endif //SGX_MODE_HYPER diff --git a/src/pal/src/pal_ms_buffer.h b/src/pal/src/pal_ms_buffer.h new file mode 100644 index 00000000..525e4617 --- /dev/null +++ b/src/pal/src/pal_ms_buffer.h @@ -0,0 +1,11 @@ +#ifndef __PAL_MS_BUFFER_H__ +#define __PAL_MS_BUFFER_H__ + +#ifdef SGX_MODE_HYPER +#include + +const char **ms_buffer_convert_string_array(sgx_enclave_id_t eid, const char **str_array); +void ms_buffer_string_array_free(sgx_enclave_id_t eid, const char **str_array); +#endif + +#endif /* __PAL_MS_BUFFER_H__ */