blob: 1f26a95e4c02b7267f2c958e049a3c616cf13c72 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License..
use core::sync::atomic::{AtomicU64, Ordering};
use crate::io;
use crate::path::{Path, PathBuf};
use crate::sync::SgxThreadSpinlock;
use crate::untrusted::fs;
use sgx_trts::enclave;
use sgx_types::*;
pub use sgx_trts::enclave::SgxThreadPolicy;
static LOCK: SgxThreadSpinlock = SgxThreadSpinlock::new();
static mut ENCLAVE_PATH: Option<PathBuf> = None;
static ENCLAVE_ID: AtomicU64 = AtomicU64::new(0);
///
/// get_enclave_base is to get enclave map base address.
///
#[inline]
pub fn get_enclave_base() -> *const u8 {
enclave::rsgx_get_enclave_base()
}
///
/// get_enclave_size is to get enclave map size.
///
#[inline]
pub fn get_enclave_size() -> usize {
enclave::rsgx_get_enclave_size()
}
///
/// get_heap_base is to get heap base address.
///
#[inline]
pub fn get_heap_base() -> *const u8 {
enclave::rsgx_get_heap_base()
}
///
/// get_heap_size is to get heap size.
///
#[inline]
pub fn get_heap_size() -> usize {
enclave::rsgx_get_heap_size()
}
///
/// get_rsrv_base is to get reserved memory base address.
///
#[inline]
pub fn get_rsrv_base() -> *const u8 {
enclave::rsgx_get_rsrv_base()
}
///
/// get_rsrv_size is to get reserved memory size.
///
#[inline]
pub fn get_rsrv_size() -> usize {
enclave::rsgx_get_rsrv_size()
}
///
/// get_tcs_max_num is to get max tcs number.
///
#[inline]
pub fn get_tcs_max_num() -> u32 {
enclave::rsgx_get_tcs_max_num()
}
///
/// get_thread_policy is to get TCS policy.
///
#[inline]
pub fn get_thread_policy() -> SgxThreadPolicy {
enclave::rsgx_get_thread_policy()
}
///
/// get_enclave_id is to get enclave ID.
///
pub fn get_enclave_id() -> sgx_enclave_id_t {
ENCLAVE_ID.load(Ordering::SeqCst) as sgx_enclave_id_t
}
///
/// set_enclave_id is to set enclave ID.
///
pub fn set_enclave_id(eid: sgx_enclave_id_t) {
ENCLAVE_ID.store(eid as u64, Ordering::SeqCst);
}
///
/// get_enclave_path is to get the path or name of the enclave.
///
pub fn get_enclave_path() -> Option<PathBuf> {
unsafe {
LOCK.lock();
let path = ENCLAVE_PATH.as_ref().map(|p| p.to_owned());
LOCK.unlock();
path
}
}
///
/// set_enclave_path is to set the path or name of the enclave.
///
pub fn set_enclave_path<P: AsRef<Path>>(path: P) -> io::Result<()> {
let _ = fs::metadata(&path)?;
unsafe {
LOCK.lock();
if ENCLAVE_PATH.is_none() {
ENCLAVE_PATH = Some(path.as_ref().to_owned());
}
LOCK.unlock();
Ok(())
}
}