This is an automated email from the ASF dual-hosted git repository. rduan pushed a commit to branch v2.0.0-preview in repository https://gitbox.apache.org/repos/asf/incubator-teaclave-sgx-sdk.git
commit 0b52204aae9c28b9479982fcf824b3283a69bdd0 Author: volcano <[email protected]> AuthorDate: Thu Sep 8 18:18:11 2022 +0800 Fix dead loop issue when sgx_trts is initialized --- sgx_trts/src/enclave/init.rs | 2 +- sgx_trts/src/enclave/mem.rs | 45 +++++++++++++++++++++----------------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/sgx_trts/src/enclave/init.rs b/sgx_trts/src/enclave/init.rs index 4742c2ea..1e61526d 100644 --- a/sgx_trts/src/enclave/init.rs +++ b/sgx_trts/src/enclave/init.rs @@ -42,7 +42,7 @@ pub fn rtinit(tcs: &mut Tcs, ms: *mut SystemFeatures, tidx: usize) -> SgxResult // TODO: pcl_entry parse::relocate()?; - mem::Image::get_or_init(); + mem::Image::init(); let features = SysFeatures::init(NonNull::new(ms).ok_or(SgxStatus::Unexpected)?)?; let heap = mem::Heap::get_or_init(); diff --git a/sgx_trts/src/enclave/mem.rs b/sgx_trts/src/enclave/mem.rs index d1120326..db578f84 100644 --- a/sgx_trts/src/enclave/mem.rs +++ b/sgx_trts/src/enclave/mem.rs @@ -19,7 +19,7 @@ use crate::arch; use crate::enclave::parse; use crate::error; use crate::feature::SysFeatures; -use core::mem; +use core::mem::{self, MaybeUninit}; use core::ptr; use sgx_types::marker::ContiguousMemory; use sgx_types::types::ProtectPerm; @@ -42,18 +42,18 @@ impl MmLayout { } #[inline] - pub fn entry_address() -> usize { - Image::get_or_init().entry_addr + pub fn elrange_base() -> usize { + Image::get().elrange_base } #[inline] - pub fn elrange_base() -> usize { - Image::get_or_init().elrange_base + pub fn elrange_size() -> usize { + Image::get().elrange_size } #[inline] - pub fn elrange_size() -> usize { - Image::get_or_init().elrange_size + pub fn entry_address() -> usize { + Image::get().entry_address } #[inline] @@ -96,30 +96,27 @@ impl MmLayout { pub struct Image { pub image_base: usize, pub image_size: usize, - pub entry_addr: usize, pub elrange_base: usize, pub elrange_size: usize, + pub entry_address: usize, } #[link_section = ".data.rel.ro"] -static mut IMAGE: Option<Image> = None; +static mut IMAGE: MaybeUninit<Image> = MaybeUninit::uninit(); impl Image { - pub fn get_or_init() -> &'static Image { - unsafe { - if let Some(ref enclave) = IMAGE { - enclave - } else { - IMAGE = Some(Image { - image_base: Self::image_base(), - image_size: Self::image_size(), - entry_addr: Self::entry_address(), - elrange_base: Self::elrange_base(), - elrange_size: Self::elrange_size(), - }); - IMAGE.as_ref().unwrap() - } - } + pub fn init() { + let mut image = unsafe { IMAGE.assume_init_mut() }; + image.image_base = Self::image_base(); + image.image_size = Self::image_size(); + image.elrange_base = Self::elrange_base(); + image.elrange_size = Self::elrange_size(); + image.entry_address = Self::entry_address(); + } + + #[inline] + pub fn get() -> &'static Image { + unsafe { IMAGE.assume_init_ref() } } #[inline] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
