summaryrefslogtreecommitdiffstats
path: root/rsnix/src/uefi.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-08-01 21:30:48 +0200
committersalmonik <salmonik@tuta.io>2026-08-01 21:30:48 +0200
commitd9c47d52039be7a61d3e9d3652f73322fb6f47ba (patch)
tree6e195f0819c97378ec5e0a3a049365d5e1f59ea5 /rsnix/src/uefi.rs
parentrsnix v0.5.0: graphics layer + cursor compositor (diff)
downloadrs-dos-d9c47d52039be7a61d3e9d3652f73322fb6f47ba.tar.gz
rs-dos-d9c47d52039be7a61d3e9d3652f73322fb6f47ba.zip
rsnix v0.5.1: force the GUI canvas to 800x600 via GOP SetMode
The kernel used to inherit whatever GOP mode the firmware picked (QEMU/OVMF gave 1280x800). Now every surface derives from a fixed 800x600 canvas: - uefi: typed EfiGopQueryMode/SetMode/GetMode fn pointers in GraphicsOutputProtocol (were raw *mut c_void, never called). - gop::select_gop_mode: scan the mode list for an exact 800x600 (32-bit BGR/RGB only, the driver assumes 4 Bpp), SetMode it; fall back to the smallest mode that fits the canvas, then to the firmware's choice. SetMode may move both the mode info pointer and the framebuffer base, so both are re-read after the switch. Boot log: 'gop: mode 3 selected — 800x600 (was 1280x800)'. - tests: relative assertions are resolution-agnostic; test-gfx and test-mouse had a boot-log race (shell line prints before the cursor task line) — now wait for the cursor line instead of grepping once. All four suites pass at 800x600. 0 build warnings.
Diffstat (limited to 'rsnix/src/uefi.rs')
-rw-r--r--rsnix/src/uefi.rs22
1 files changed, 19 insertions, 3 deletions
diff --git a/rsnix/src/uefi.rs b/rsnix/src/uefi.rs
index f947c90..c311ad9 100644
--- a/rsnix/src/uefi.rs
+++ b/rsnix/src/uefi.rs
@@ -321,12 +321,28 @@ pub struct GopMode {
321 321
322#[repr(C)] 322#[repr(C)]
323pub struct GraphicsOutputProtocol { 323pub struct GraphicsOutputProtocol {
324 pub query_mode: *mut c_void, 324 pub query_mode: EfiGopQueryMode,
325 pub set_mode: *mut c_void, 325 pub set_mode: EfiGopSetMode,
326 pub get_current_mode: *mut c_void, 326 pub get_current_mode: EfiGopGetMode,
327 pub mode: *mut GopMode, 327 pub mode: *mut GopMode,
328} 328}
329 329
330pub type EfiGopQueryMode = unsafe extern "efiapi" fn(
331 *mut GraphicsOutputProtocol,
332 u32, // mode number
333 *mut usize, // out: size of info
334 *mut *mut GopModeInfo, // out: info pointer (firmware-owned)
335) -> Status;
336
337pub type EfiGopSetMode = unsafe extern "efiapi" fn(*mut GraphicsOutputProtocol, u32) -> Status;
338
339pub type EfiGopGetMode = unsafe extern "efiapi" fn(
340 *mut GraphicsOutputProtocol,
341 *mut u32, // out: current mode
342 *mut u32, // out: size of info
343 *mut *mut GopModeInfo, // out: info pointer
344) -> Status;
345
330// --------------------------------------------------------------------------- 346// ---------------------------------------------------------------------------
331// System table 347// System table
332// --------------------------------------------------------------------------- 348// ---------------------------------------------------------------------------