[hyper mode] Support ms buffer for pal
This commit is contained in:
parent
bec8aa1c38
commit
0b7b384241
@ -9,6 +9,9 @@
|
|||||||
#include "pal_syscall.h"
|
#include "pal_syscall.h"
|
||||||
#include "pal_thread_counter.h"
|
#include "pal_thread_counter.h"
|
||||||
#include "pal_check_fsgsbase.h"
|
#include "pal_check_fsgsbase.h"
|
||||||
|
#ifdef SGX_MODE_HYPER
|
||||||
|
#include "pal_ms_buffer.h"
|
||||||
|
#endif
|
||||||
#include "errno2str.h"
|
#include "errno2str.h"
|
||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
|
|
||||||
@ -153,8 +156,26 @@ int occlum_pal_create_process(struct occlum_pal_create_process_args *args) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SGX_MODE_HYPER
|
||||||
sgx_status_t ecall_status = occlum_ecall_new_process(eid, &ecall_ret, args->path,
|
sgx_status_t ecall_status = occlum_ecall_new_process(eid, &ecall_ret, args->path,
|
||||||
args->argv, args->env, args->stdio);
|
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) {
|
if (ecall_status != SGX_SUCCESS) {
|
||||||
const char *sgx_err = pal_get_sgx_error_msg(ecall_status);
|
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);
|
PAL_ERROR("Failed to do ECall with error code 0x%x: %s", ecall_status, sgx_err);
|
||||||
|
68
src/pal/src/pal_ms_buffer.c
Normal file
68
src/pal/src/pal_ms_buffer.c
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#ifdef SGX_MODE_HYPER
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sgx_eid.h>
|
||||||
|
|
||||||
|
#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
|
11
src/pal/src/pal_ms_buffer.h
Normal file
11
src/pal/src/pal_ms_buffer.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __PAL_MS_BUFFER_H__
|
||||||
|
#define __PAL_MS_BUFFER_H__
|
||||||
|
|
||||||
|
#ifdef SGX_MODE_HYPER
|
||||||
|
#include <sgx_eid.h>
|
||||||
|
|
||||||
|
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__ */
|
Loading…
Reference in New Issue
Block a user