diff options
| author | salmonik <salmonik@tuta.io> | 2026-08-01 03:44:57 +0200 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-08-01 03:44:57 +0200 |
| commit | 63d01e9d8eb6f3ccb6a96b7c577834276cf51add (patch) | |
| tree | f490b9969a8f781f48c2f168dc3e6c71c41339a9 /rsnix/src/gop.rs | |
| parent | rustfmt: reflow fat.rs/fs.rs formatting (diff) | |
| download | rs-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 'rsnix/src/gop.rs')
| -rw-r--r-- | rsnix/src/gop.rs | 26 |
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). | ||
| 110 | fn 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. |
| 109 | pub fn dims() -> (usize, usize) { | 115 | pub 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. |
| 119 | pub fn rgb(r: u8, g: u8, b: u8) -> u32 { | 123 | pub 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 | ||
| 342 | pub(crate) fn blit_glyph(col: usize, row: usize, ch: u16, fg: (u8, u8, u8), bg: (u8, u8, u8)) { | 344 | pub(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. |
| 383 | pub(crate) fn shift_up_n(n: usize) { | 385 | pub(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 | } |
