summaryrefslogtreecommitdiffstats
path: root/rsnix/src/gop.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-08-01 03:44:57 +0200
committersalmonik <salmonik@tuta.io>2026-08-01 03:44:57 +0200
commit63d01e9d8eb6f3ccb6a96b7c577834276cf51add (patch)
treef490b9969a8f781f48c2f168dc3e6c71c41339a9 /rsnix/src/gop.rs
parentrustfmt: reflow fat.rs/fs.rs formatting (diff)
downloadrs-dos-63d01e9d8eb6f3ccb6a96b7c577834276cf51add.tar.gz
rs-dos-63d01e9d8eb6f3ccb6a96b7c577834276cf51add.zip
Clean up warnings, fix FAT32 multi-cluster dirs, prep for edition 2024
Warning cleanup (cargo check + clippy now 0 across the workspace): - Migrate all 21 static_mut_refs sites to &raw mut accessors (fat, gop, ps2, vt, ahci, interrupts, memory) so edition 2024 won't deny them - panic = "abort" profiles: bare cargo check/build now works without nightly/-Zbuild-std - Wire TICKS in the timer ISR (it was never incremented, so the vt scroll batching trigger was dead code) - Clippy: efi_main becomes unsafe extern "efiapi" with a # Safety doc, KeyBuf::new uses inline-const array repeat (no interior-mutable const), editor main loop is a while-let, PIT control byte regrouped - [workspace.lints.clippy] allows result_unit_err + needless_range_loop (deliberate kernel style); large_enum_variant allowed on LineInput - Drop now-stale static_mut_refs allow from the rsdos bin FAT32 correctness fixes (both pre-existing, exposed by the SFN fix): - Unique 8.3 short names: to_8_3() never disambiguated collisions, so files sharing a long-name prefix got identical SFNs and fsck reported duplicate directory entries. Add dir_short_names() + unique_short_name() (~N tails, Windows-style) and force LFN when the SFN changes. - Multi-cluster directories: scan_dir/dir_short_names stopped at the first 0x00 slot, hiding every entry written into a chained cluster (writes failed with 'cannot write', duplicate SFNs accumulated); add_dir_entry now packs the cluster (0xE5 deleted-markers) before extending so other FAT readers (mtools, Windows) see the continuation too. Other: delete dead fields (Disk.fis, Volume.fat_count), drop timer_irq/ keyboard_irq/rendered, refresh_and_exit is a documented unsafe fn, CONTEXT .md corrected (stable toolchain, IRQ input, 4-crate layout), .gitignore excludes .pi-subagents artifacts. Validated: cargo check/clippy/fmt clean, make test-disk PASS on fresh and reused images (incl. two directory-chain extensions and ~10 SFN tails), editor round-trip smoke test PASS.
Diffstat (limited to '')
-rw-r--r--rsnix/src/gop.rs26
1 files changed, 14 insertions, 12 deletions
diff --git a/rsnix/src/gop.rs b/rsnix/src/gop.rs
index 77cc514..0d24d7d 100644
--- a/rsnix/src/gop.rs
+++ b/rsnix/src/gop.rs
@@ -105,23 +105,25 @@ pub fn clear_screen() {
105 crate::vt::clear_all(); 105 crate::vt::clear_all();
106} 106}
107 107
108/// Raw-pointer accessor for the framebuffer static (single-threaded
109/// kernel; keeps `static_mut_refs` quiet).
110fn fb() -> &'static mut Option<Framebuffer> {
111 unsafe { &mut *core::ptr::addr_of_mut!(FB) }
112}
113
108/// (cols, rows) of the text surface, from the current framebuffer mode. 114/// (cols, rows) of the text surface, from the current framebuffer mode.
109pub fn dims() -> (usize, usize) { 115pub fn dims() -> (usize, usize) {
110 unsafe { 116 match fb().as_ref() {
111 match FB.as_ref() { 117 Some(f) => (f.width / 8, f.height / 16),
112 Some(f) => (f.width / 8, f.height / 16), 118 None => (0, 0),
113 None => (0, 0),
114 }
115 } 119 }
116} 120}
117 121
118/// Pack an (r, g, b) colour for the framebuffer's pixel format. 122/// Pack an (r, g, b) colour for the framebuffer's pixel format.
119pub fn rgb(r: u8, g: u8, b: u8) -> u32 { 123pub fn rgb(r: u8, g: u8, b: u8) -> u32 {
120 unsafe { 124 match fb().as_ref() {
121 match FB.as_ref() { 125 Some(f) if f.bgr => ((r as u32) << 16) | ((g as u32) << 8) | b as u32,
122 Some(f) if f.bgr => ((r as u32) << 16) | ((g as u32) << 8) | b as u32, 126 _ => ((b as u32) << 16) | ((g as u32) << 8) | r as u32,
123 _ => ((b as u32) << 16) | ((g as u32) << 8) | r as u32,
124 }
125 } 127 }
126} 128}
127 129
@@ -340,7 +342,7 @@ fn unicode_glyph_bits(ch: u16) -> Option<[u8; 16]> {
340} 342}
341 343
342pub(crate) fn blit_glyph(col: usize, row: usize, ch: u16, fg: (u8, u8, u8), bg: (u8, u8, u8)) { 344pub(crate) fn blit_glyph(col: usize, row: usize, ch: u16, fg: (u8, u8, u8), bg: (u8, u8, u8)) {
343 if let Some(fb) = unsafe { FB.as_ref() } { 345 if let Some(fb) = fb().as_ref() {
344 let glyph = font::GLYPH_8X16; 346 let glyph = font::GLYPH_8X16;
345 let data = if ch < 256 { 347 let data = if ch < 256 {
346 match glyph.get(ch as usize) { 348 match glyph.get(ch as usize) {
@@ -381,7 +383,7 @@ pub(crate) fn blit_glyph(col: usize, row: usize, ch: u16, fg: (u8, u8, u8), bg:
381/// Shift the framebuffer content up `n` text rows and clear the exposed 383/// Shift the framebuffer content up `n` text rows and clear the exposed
382/// bottom rows. `n` batches deferred scrolls into one push. 384/// bottom rows. `n` batches deferred scrolls into one push.
383pub(crate) fn shift_up_n(n: usize) { 385pub(crate) fn shift_up_n(n: usize) {
384 if let Some(fb) = unsafe { FB.as_ref() } { 386 if let Some(fb) = fb().as_ref() {
385 fb.shift_up_n(n); 387 fb.shift_up_n(n);
386 } 388 }
387} 389}