Add support for pal library to run libos outside occlum instance

This commit is contained in:
Hui, Chunyang 2020-08-28 10:26:15 +00:00 committed by Tate, Hongliang Tian
parent e13242e7e5
commit 7b882bd368
4 changed files with 20 additions and 4 deletions

@ -18,8 +18,8 @@ build_src:
TOTAL_BYTES := 10000000000 # 10GB TOTAL_BYTES := 10000000000 # 10GB
test: test:
cd occlum_instance && LD_LIBRARY_PATH=../bench_driver/build:$(SGX_SDK)/sdk_libs RUST_BACKTRACE=1 \ LD_LIBRARY_PATH=bench_driver/build:$(SGX_SDK)/sdk_libs RUST_BACKTRACE=1 \
../bench_driver/build/bench_driver $(TOTAL_BYTES) bench_driver/build/bench_driver $(TOTAL_BYTES)
clean: clean:
@$(MAKE) --no-print-directory -C trusted_memcpy_bench clean @$(MAKE) --no-print-directory -C trusted_memcpy_bench clean

@ -44,6 +44,8 @@ int main(int argc, char *argv[]) {
// Init Occlum PAL // Init Occlum PAL
occlum_pal_attr_t pal_attr = OCCLUM_PAL_ATTR_INITVAL; occlum_pal_attr_t pal_attr = OCCLUM_PAL_ATTR_INITVAL;
pal_attr.instance_dir = "occlum_instance";
pal_attr.log_level = "off";
if (occlum_pal_init(&pal_attr) < 0) { if (occlum_pal_init(&pal_attr) < 0) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }

@ -1,4 +1,5 @@
use super::*; use super::*;
use crate::std::untrusted::path::PathEx;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::HashSet; use std::collections::HashSet;
use std::ffi::CString; use std::ffi::CString;
@ -217,6 +218,12 @@ impl ConfigMount {
target target
}; };
let source = input.source.as_ref().map(|s| PathBuf::from(s)); let source = input.source.as_ref().map(|s| PathBuf::from(s));
let source = if source.is_none() {
None
} else {
let path = unsafe { PathBuf::from(&INSTANCE_DIR) };
path.join(source.unwrap()).canonicalize().ok()
};
let options = ConfigMountOptions::from_input(&input.options)?; let options = ConfigMountOptions::from_input(&input.options)?;
Ok(ConfigMount { Ok(ConfigMount {
type_, type_,

@ -8,6 +8,7 @@
#include "pal_syscall.h" #include "pal_syscall.h"
#include "pal_thread_counter.h" #include "pal_thread_counter.h"
#include "errno2str.h" #include "errno2str.h"
#include <linux/limits.h>
int occlum_pal_get_version(void) { int occlum_pal_get_version(void) {
return OCCLUM_PAL_VERSION; return OCCLUM_PAL_VERSION;
@ -23,6 +24,12 @@ int occlum_pal_init(const struct occlum_pal_attr *attr) {
return -1; return -1;
} }
char resolved_path[PATH_MAX] = {0};
if (realpath(attr->instance_dir, resolved_path) == NULL) {
PAL_ERROR("realpath returns %s", errno2str(errno));
return -1;
}
sgx_enclave_id_t eid = pal_get_enclave_id(); sgx_enclave_id_t eid = pal_get_enclave_id();
if (eid != SGX_INVALID_ENCLAVE_ID) { if (eid != SGX_INVALID_ENCLAVE_ID) {
PAL_ERROR("Enclave has been initialized."); PAL_ERROR("Enclave has been initialized.");
@ -36,14 +43,14 @@ int occlum_pal_init(const struct occlum_pal_attr *attr) {
} }
#endif #endif
if (pal_init_enclave(attr->instance_dir) < 0) { if (pal_init_enclave(resolved_path) < 0) {
return -1; return -1;
} }
eid = pal_get_enclave_id(); eid = pal_get_enclave_id();
int ecall_ret = 0; int ecall_ret = 0;
sgx_status_t ecall_status = occlum_ecall_init(eid, &ecall_ret, attr->log_level, sgx_status_t ecall_status = occlum_ecall_init(eid, &ecall_ret, attr->log_level,
attr->instance_dir); resolved_path);
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: %s", sgx_err); PAL_ERROR("Failed to do ECall: %s", sgx_err);