summaryrefslogtreecommitdiffstats
path: root/rsnix/src/vt.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-08-02 01:59:45 +0200
committersalmonik <salmonik@tuta.io>2026-08-02 01:59:45 +0200
commit5185fe98d404c6c15a52f513313042ced16c350a (patch)
tree0fd00f065d9d566e59da1af463befeace36b1fc9 /rsnix/src/vt.rs
parentv0.5.5: visible boot progress + panic-on-screen for real hardware (diff)
downloadrs-dos-5185fe98d404c6c15a52f513313042ced16c350a.tar.gz
rs-dos-5185fe98d404c6c15a52f513313042ced16c350a.zip
v0.5.5: self-diagnosing boot — vt refuses 0x0 geometry, panic band shows last stage
The user's real-hardware boot showed 'PANIC: index out of bounds (len 0, index 0) at vt.rs:146' — the vt grid was created empty because the framebuffer geometry was 0x0 at vt::init (GOP missing or the active mode reporting zero resolution). The v0.5.4 blank screen was the same panic, previously invisible (no screen dump in the panic handler). - vt::init: rows/cols == 0 now halts with a visible white-on-red 'FATAL: no framebuffer geometry — GOP missing or active mode is 0x0' band instead of building an empty grid that panics at the first cell write. - boot_marker records the last boot stage; the panic band appends it as a 4th line so a crash shows exactly how far boot got. - The gop+vt marker now carries the measured geometry ('rsnix: gop 800x600 vt 100x37 ok') so a good boot is self-confirming on the screen. - All 5 test suites pass; build/clippy clean.
Diffstat (limited to 'rsnix/src/vt.rs')
-rw-r--r--rsnix/src/vt.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/rsnix/src/vt.rs b/rsnix/src/vt.rs
index 53821b7..4578f6c 100644
--- a/rsnix/src/vt.rs
+++ b/rsnix/src/vt.rs
@@ -96,6 +96,26 @@ static mut CUR: usize = 0;
96/// Allocate the cell grid. Call once after `gop::init()`. 96/// Allocate the cell grid. Call once after `gop::init()`.
97pub fn init() { 97pub fn init() {
98 let (cols, rows) = gop::dims(); 98 let (cols, rows) = gop::dims();
99 if rows == 0 || cols == 0 {
100 // No usable framebuffer geometry: GOP is missing entirely or the
101 // active mode reports 0x0. Without a display there is nothing
102 // the shell can do, so stop with a visible explanation instead
103 // of building an empty grid and panicking at the first cell
104 // write (a blank screen on real hardware, which has no serial
105 // console).
106 let lines = [
107 "FATAL: no framebuffer geometry",
108 "GOP missing or active mode is 0x0",
109 "see the 'gop:' boot marker / serial log",
110 ];
111 crate::gop::dump_lines(&lines);
112 crate::serial_println!("FATAL: no framebuffer geometry (GOP missing or 0x0 mode)");
113 loop {
114 unsafe {
115 core::arch::asm!("cli; hlt");
116 }
117 }
118 }
99 unsafe { 119 unsafe {
100 ROWS = rows; 120 ROWS = rows;
101 COLS = cols; 121 COLS = cols;