sparreal_kernel/io/
print.rs1use core::fmt;
2
3use alloc::boxed::Box;
4use spin::Mutex;
5
6use crate::{boot::debug, platform_if::PlatformImpl};
7
8static STDOUT: Mutex<Option<Box<dyn fmt::Write + Send>>> = Mutex::new(None);
9
10pub fn stdout_use_debug() {
11 *STDOUT.lock() = Some(Box::new(debug::DebugWriter {}));
12}
13
14pub fn print(args: fmt::Arguments<'_>) {
15 let mut g = STDOUT.lock();
16
17 if let Some(ref mut writer) = *g {
18 let _ = writer.write_fmt(args);
19 }
20}
21
22pub fn early_dbg(s: &str) {
23 for c in s.bytes() {
24 PlatformImpl::debug_put(c);
25 }
26}
27
28pub fn early_dbgln(s: &str) {
29 early_dbg(s);
30 early_dbg("\r\n");
31}
32
33pub fn early_dbg_hexln(v: u64) {
34 early_dbg_hex(v);
35 early_dbg("\r\n");
36}
37pub fn early_dbg_mem(name: &str, mem: &[u8]) {
38 let range = mem.as_ptr_range();
39 early_dbg_range(name, (range.start as usize)..(range.end as usize));
40}
41pub fn early_dbg_range(name: &str, range: core::ops::Range<usize>) {
42 early_dbg(name);
43 early_dbg(": [");
44 early_dbg_hex(range.start as _);
45 early_dbg(", ");
46 early_dbg_hex(range.end as _);
47 early_dbg(")\r\n");
48}
49
50pub fn early_dbg_hex(v: u64) {
51 const HEX_BUF_SIZE: usize = 20; let mut hex_buf: [u8; HEX_BUF_SIZE] = [b'0'; HEX_BUF_SIZE];
53 let mut n = v;
54 early_dbg("0x");
55
56 if n == 0 {
57 early_dbg("0");
58 return;
59 }
60 let mut i = 0;
61 while n > 0 {
62 let digit = n & 0xf;
63 let ch = if digit < 10 {
64 b'0' + digit as u8
65 } else {
66 b'a' + (digit - 10) as u8
67 };
68 n >>= 4; hex_buf[i] = ch;
70 i += 1;
71 }
72 let s = &hex_buf[..i];
73 for ch in s.iter().rev() {
74 PlatformImpl::debug_put(*ch);
75 }
76}