diff options
Diffstat (limited to '')
| -rw-r--r-- | rsnix/src/klog.rs | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/rsnix/src/klog.rs b/rsnix/src/klog.rs index 0c7dc06..5da5094 100644 --- a/rsnix/src/klog.rs +++ b/rsnix/src/klog.rs | |||
| @@ -79,16 +79,19 @@ pub fn append(line: &str, mut ms: u64) { | |||
| 79 | r.seq += 1; | 79 | r.seq += 1; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | /// Append the formatted output of a `serial_println!` — the macro hook. | 82 | /// Format one serial line, write it to the serial port, and append it |
| 83 | /// `fmt::Write` may deliver the line in several chunks, so accumulate | 83 | /// to the ring — all under the scheduler lock, so a line from one task |
| 84 | /// into one line buffer first, then append the whole line. The | 84 | /// never interleaves with another task's line (line atomicity). |
| 85 | /// timestamp is taken when the line is emitted (monotonic ms since | 85 | /// `serial_println!` funnels through here. |
| 86 | /// boot, from the PIT tick + live-counter interpolation). | 86 | pub fn emit(args: core::fmt::Arguments<'_>) { |
| 87 | pub fn append_fmt(args: core::fmt::Arguments<'_>) { | ||
| 88 | let ms = crate::interrupts::uptime_ms(); | ||
| 89 | let mut line = LineBuf::new(); | 87 | let mut line = LineBuf::new(); |
| 90 | let _ = core::fmt::write(&mut line, args); | 88 | let _ = core::fmt::write(&mut line, args); |
| 89 | let ms = crate::interrupts::uptime_ms(); | ||
| 90 | crate::sched::lock(); | ||
| 91 | crate::serial::write_raw(line.as_str()); | ||
| 92 | crate::serial::write_raw("\r\n"); | ||
| 91 | append(line.as_str(), ms); | 93 | append(line.as_str(), ms); |
| 94 | crate::sched::unlock(); | ||
| 92 | } | 95 | } |
| 93 | 96 | ||
| 94 | struct LineBuf { | 97 | struct LineBuf { |
