//! mem — show memory statistics via the exports table. #![no_std] #![no_main] #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { loop { core::hint::spin_loop(); } } fn put(exports: &rsapi::Exports, buf: &[u8]) { (exports.put_line)(rsapi::Line { ptr: buf.as_ptr(), len: buf.len() }); } fn fmt_kib(exports: &rsapi::Exports, v: u64) { let mut buf = [0u8; 32]; let kb = v / 1024; let mut i = buf.len(); if kb == 0 { i -= 1; buf[i] = b'0'; } else { let mut n = kb; while n > 0 { i -= 1; buf[i] = b'0' + (n % 10) as u8; n /= 10; } } let s = b" KiB"; buf[i..i+s.len()].copy_from_slice(s); put(exports, &buf[i..i+s.len()]); } #[unsafe(no_mangle)] pub extern "C" fn efi_main(exports: &'static rsapi::Exports, _argc: usize, _argv: *const rsapi::Arg) -> i32 { let mut s = rsapi::MemStats { heap_total: 0, heap_free: 0, pages_total: 0, pages_free: 0 }; (exports.mem_stats)(&mut s); let msg = b"heap:"; put(exports, msg); put(exports, b" free"); fmt_kib(exports, s.heap_free); put(exports, b" / total"); fmt_kib(exports, s.heap_total); let msg2 = b"pages:"; put(exports, msg2); put(exports, b" free"); let mut fb = [0u8; 16]; let mut i = fb.len(); let n = s.pages_free; if n==0 { i-=1; fb[i]=b'0'; } else { let mut m=n; while m>0 { i-=1; fb[i]=b'0'+(m%10) as u8; m/=10; } } put(exports, &fb[i..]); put(exports, b" / "); let mut tb = [0u8; 16]; let mut j = tb.len(); let t = s.pages_total; if t==0 { j-=1; tb[j]=b'0'; } else { let mut m=t; while m>0 { j-=1; tb[j]=b'0'+(m%10) as u8; m/=10; } } put(exports, &tb[j..]); 0 }