This is an automated email from the ASF dual-hosted git repository. dingyu pushed a commit to branch oom_handling in repository https://gitbox.apache.org/repos/asf/incubator-teaclave-sgx-sdk.git
commit 635f3cb177009b99706dfc072a667ceb16421374 Author: Yu Ding <[email protected]> AuthorDate: Wed Aug 26 15:04:31 2020 -0700 sample oom handling --- samplecode/hello-rust/enclave/Cargo.toml | 2 + samplecode/hello-rust/enclave/src/lib.rs | 142 +++++++++++-------------------- 2 files changed, 53 insertions(+), 91 deletions(-) diff --git a/samplecode/hello-rust/enclave/Cargo.toml b/samplecode/hello-rust/enclave/Cargo.toml index 8e7afa9..5ab010e 100644 --- a/samplecode/hello-rust/enclave/Cargo.toml +++ b/samplecode/hello-rust/enclave/Cargo.toml @@ -13,6 +13,8 @@ default = [] [target.'cfg(not(target_env = "sgx"))'.dependencies] sgx_types = { git = "https://github.com/apache/teaclave-sgx-sdk.git" } sgx_tstd = { git = "https://github.com/apache/teaclave-sgx-sdk.git", features = ["backtrace"] } +sgx_libc = { git = "https://github.com/apache/teaclave-sgx-sdk.git" } + sgx_trts = { git = "https://github.com/apache/teaclave-sgx-sdk.git" } [patch.'https://github.com/apache/teaclave-sgx-sdk.git'] sgx_alloc = { path = "../../../sgx_alloc" } diff --git a/samplecode/hello-rust/enclave/src/lib.rs b/samplecode/hello-rust/enclave/src/lib.rs index f661955..4e22042 100644 --- a/samplecode/hello-rust/enclave/src/lib.rs +++ b/samplecode/hello-rust/enclave/src/lib.rs @@ -26,105 +26,65 @@ extern crate sgx_trts; #[cfg(not(target_env = "sgx"))] #[macro_use] extern crate sgx_tstd as std; +extern crate sgx_libc; use sgx_types::*; -use sgx_types::metadata::*; -use sgx_trts::enclave; -//use sgx_trts::{is_x86_feature_detected, is_cpu_feature_supported}; -use std::string::String; -use std::vec::Vec; -use std::io::{self, Write}; -use std::slice; -use std::backtrace::{self, PrintFormat}; - -#[no_mangle] -pub extern "C" fn say_something(some_string: *const u8, some_len: usize) -> sgx_status_t { - - let str_slice = unsafe { slice::from_raw_parts(some_string, some_len) }; - let _ = io::stdout().write(str_slice); - - // A sample &'static string - let rust_raw_string = "This is a in-Enclave "; - // An array - let word:[u8;4] = [82, 117, 115, 116]; - // An vector - let word_vec:Vec<u8> = vec![32, 115, 116, 114, 105, 110, 103, 33]; - - // Construct a string from &'static string - let mut hello_string = String::from(rust_raw_string); - - // Iterate on word array - for c in word.iter() { - hello_string.push(*c as char); - } - - // Rust style convertion - hello_string += String::from_utf8(word_vec).expect("Invalid UTF-8") - .as_str(); - - // Ocall to normal world for output - println!("{}", &hello_string); - - let _ = backtrace::enable_backtrace("enclave.signed.so", PrintFormat::Full); - - let gd = enclave::SgxGlobalData::new(); - println!("gd: {} {} {} {} ", gd.get_static_tcs_num(), gd.get_eremove_tcs_num(), gd.get_dyn_tcs_num(), gd.get_tcs_max_num()); - let (static_num, eremove_num, dyn_num) = get_thread_num(); - println!("static: {} eremove: {} dyn: {}", static_num, eremove_num, dyn_num); - - unsafe { - println!("EDMM: {}, feature: {}", EDMM_supported, g_cpu_feature_indicator); - } - if is_x86_feature_detected!("sgx") { - println!("supported sgx"); +use std::prelude::v1::*; +//use std::backtrace::{self, PrintFormat}; +use std::alloc::{Layout, set_alloc_error_hook}; +use std::panic; + +fn alloc_oom() { + let mut v = vec![]; + loop { + let array = [0u64; 16]; + v.push(Box::new(array)); } - - sgx_status_t::SGX_SUCCESS } -#[link(name = "sgx_trts")] -extern { - static g_cpu_feature_indicator: uint64_t; - static EDMM_supported: c_int; +fn sample_oom_hook(_: Layout) { + panic!("trigger oom unwind"); } +// no heap print +fn oom_write() { + use sgx_libc::ocall::write; + let fd = 0; + let buf = b"Catched\0".as_ptr() as _; + let count = 8; -fn get_thread_num() -> (u32, u32, u32) { - let gd = unsafe { - let p = enclave::rsgx_get_global_data(); - &*p - }; - - let mut static_thread_num: u32 = 0; - let mut eremove_thread_num: u32 = 0; - let mut dyn_thread_num: u32 = 0; - let layout_table = &gd.layout_table[0..gd.layout_entry_num as usize]; - unsafe { traversal_layout(&mut static_thread_num, &mut dyn_thread_num, &mut eremove_thread_num, layout_table); } + let _ = unsafe { write(fd, buf, count) }; +} - unsafe fn traversal_layout(static_num: &mut u32, dyn_num: &mut u32, eremove_num: &mut u32, layout_table: &[layout_t]) - { - for (i, layout) in layout_table.iter().enumerate() { - if !is_group_id!(layout.group.id as u32) { - if (layout.entry.attributes & PAGE_ATTR_EADD) != 0 { - if (layout.entry.content_offset != 0) && (layout.entry.si_flags == SI_FLAGS_TCS) { - if (layout.entry.attributes & PAGE_ATTR_EREMOVE) == 0 { - *static_num += 1; - } else { - *eremove_num += 1; - } - } - } - if (layout.entry.attributes & PAGE_ATTR_POST_ADD) != 0 { - if layout.entry.id == LAYOUT_ID_TCS_DYN as u16 { - *dyn_num += 1; - } - } - } else { - for _ in 0..layout.group.load_times { - traversal_layout(static_num, dyn_num, eremove_num, &layout_table[i - layout.group.entry_count as usize..i]) - } - } +#[no_mangle] +pub extern "C" fn say_something(_: *const u8, _: usize) -> sgx_status_t { + set_alloc_error_hook(sample_oom_hook); + for _ in 0..100 { + // This is OK + //if let Err(_) = panic::catch_unwind(|| { + // alloc_oom(); + //}){ + // return sgx_status_t::SGX_SUCCESS; + //}; + + //// This would double fault + //match panic::catch_unwind(|| { + // alloc_oom(); + //}) { + // Ok(s) => println!("Ok {:?}", s), + // Err(e) => println!("Catched {:?}", e), // heap allocation happened + //} + + // This would not trigger double fault + match panic::catch_unwind(|| { + alloc_oom(); + }) { + Ok(s) => println!("Ok {:?}", s), // never here + Err(e) => { + oom_write(); + return sgx_status_t::SGX_SUCCESS; + }, } } - (static_thread_num, eremove_thread_num, dyn_thread_num) -} \ No newline at end of file + sgx_status_t::SGX_SUCCESS +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
