@@ -125,6 +125,39 @@ impl fmt::Debug for Frame {
125125 }
126126}
127127
128+ #[ cfg( all( target_env = "sgx" , target_vendor = "fortanix" , not( feature = "std" ) ) ) ]
129+ mod sgx_no_std_image_base {
130+ use core:: ffi:: c_void;
131+ use core:: sync:: atomic:: { AtomicUsize , Ordering :: SeqCst } ;
132+
133+ static IMAGE_BASE : AtomicUsize = AtomicUsize :: new ( 0 ) ;
134+
135+ /// Set the image base address. This is only available for Fortanix SGX
136+ /// target when the `std` feature is not enabled. This can be used in the
137+ /// standard library to set the correct base address.
138+ #[ doc( hidden) ]
139+ pub fn set_image_base ( base_addr : * mut c_void ) {
140+ IMAGE_BASE . store ( base_addr as _ , SeqCst ) ;
141+ }
142+
143+ pub ( crate ) fn get_image_base ( ) -> * mut c_void {
144+ IMAGE_BASE . load ( SeqCst ) as _
145+ }
146+ }
147+
148+ #[ cfg( all( target_env = "sgx" , target_vendor = "fortanix" , not( feature = "std" ) ) ) ]
149+ pub use self :: sgx_no_std_image_base:: set_image_base;
150+
151+ #[ cfg( all( target_env = "sgx" , target_vendor = "fortanix" , not( feature = "std" ) ) ) ]
152+ #[ deny( unused) ]
153+ pub ( crate ) use self :: sgx_no_std_image_base:: get_image_base;
154+
155+ #[ cfg( all( target_env = "sgx" , target_vendor = "fortanix" , feature = "std" ) ) ]
156+ #[ deny( unused) ]
157+ pub ( crate ) fn get_image_base ( ) -> * mut c_void {
158+ std:: os:: fortanix_sgx:: mem:: image_base ( ) as _
159+ }
160+
128161cfg_if:: cfg_if! {
129162 // This needs to come first, to ensure that
130163 // Miri takes priority over the host platform
0 commit comments