#![cfg(all(target_env = "sgx", target_vendor = "fortanix"))] #![feature(sgx_platform)] #[cfg(feature = "std")] #[test] fn sgx_image_base_with_std() { use backtrace::trace; let image_base = std::os::fortanix_sgx::mem::image_base(); let mut frame_ips = Vec::new(); trace(|frame| { frame_ips.push(frame.ip()); true }); assert!(frame_ips.len() > 0); for ip in frame_ips { let ip: u64 = ip as _; assert!(ip < image_base); } } #[cfg(not(feature = "std"))] #[test] fn sgx_image_base_no_std() { use backtrace::trace_unsynchronized; fn guess_image_base() -> u64 { let mut top_frame_ip = None; unsafe { trace_unsynchronized(|frame| { top_frame_ip = Some(frame.ip()); false }); } top_frame_ip.unwrap() as u64 & 0xFFFFFF000000 } let image_base = guess_image_base(); backtrace::set_image_base(image_base as _); let mut frame_ips = Vec::new(); unsafe { trace_unsynchronized(|frame| { frame_ips.push(frame.ip()); true }); } assert!(frame_ips.len() > 0); for ip in frame_ips { let ip: u64 = ip as _; assert!(ip < image_base); } }