]> git.lizzy.rs Git - rust.git/blob - src/libstd/sys/sgx/abi/panic.rs
5ace7fb3368b66be9ad718b709f09afc8835ae8d
[rust.git] / src / libstd / sys / sgx / abi / panic.rs
1 use io::{self, Write};
2 use slice::from_raw_parts_mut;
3
4 extern "C" {
5     fn take_debug_panic_buf_ptr() -> *mut u8;
6     static DEBUG: u8;
7 }
8
9 pub(crate) struct SgxPanicOutput(Option<&'static mut [u8]>);
10
11 impl SgxPanicOutput {
12     pub(crate) fn new() -> Option<Self> {
13         if unsafe { DEBUG == 0 } {
14             None
15         } else {
16             Some(SgxPanicOutput(None))
17         }
18     }
19
20     fn init(&mut self) -> &mut &'static mut [u8] {
21         self.0.get_or_insert_with(|| unsafe {
22             let ptr = take_debug_panic_buf_ptr();
23             if ptr.is_null() {
24                 &mut []
25             } else {
26                 from_raw_parts_mut(ptr, 1024)
27             }
28         })
29     }
30 }
31
32 impl Write for SgxPanicOutput {
33     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
34         self.init().write(buf)
35     }
36
37     fn flush(&mut self) -> io::Result<()> {
38         self.init().flush()
39     }
40 }
41
42 #[no_mangle]
43 pub extern "C" fn panic_msg(msg: &str) -> ! {
44     let _ = SgxPanicOutput::new().map(|mut out| out.write(msg.as_bytes()));
45     unsafe { panic_exit(); }
46 }
47
48 extern "C" { pub fn panic_exit() -> !; }