fix: remove broken QEMU GPU swap hack, add graceful fallback
VirtIO GPU: - Removed QEMU 11.x command type swap hack (0x0104↔0x0106). The hack was wrong — swapping types without swapping data formats meant handlers read wrong struct layouts. Commands returned OK but did nothing. - Restored correct VirtIO spec command types. - Removed broken test pattern (fill + flush that never displayed). - GPU setup now reports success/failure without crashing. Display server resilience: - VirtioFramebuffer::new() → try_new() -> Option<Self>. Returns None if phys-info page is unmapped or has zero dimensions. - bins/display-qemu: tries VirtioFramebuffer, falls back to MockFramebuffer. Display server runs headless instead of crashing. - No more page faults when GPU is absent. The GPU driver code is architecturally correct (proper VirtIO commands, proper data formats) but doesn't produce visible output on QEMU 11.x due to a suspected QEMU legacy MMIO bug where transfer_to_host_2d succeeds but doesn't transfer data. The driver is ready for when this is fixed or a different QEMU version is used.
This commit is contained in:
@@ -15,4 +15,5 @@ userspace = { workspace = true }
|
||||
server-framework = { workspace = true }
|
||||
display-server = { workspace = true }
|
||||
driver-framebuffer-virtio = { workspace = true }
|
||||
driver-framebuffer-mock = { workspace = true }
|
||||
port-framebuffer = { workspace = true }
|
||||
|
||||
@@ -3,14 +3,23 @@
|
||||
|
||||
extern crate userspace_rt;
|
||||
|
||||
use driver_framebuffer_virtio::VirtioFramebuffer;
|
||||
use types::bounded::CapSlot;
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
extern "C" fn main() {
|
||||
let fb = VirtioFramebuffer::new();
|
||||
let mut srv = display_server::server::DisplayServer::new(fb);
|
||||
let ep = CapSlot::new(0).unwrap();
|
||||
server_framework::serve(&mut srv, ep);
|
||||
let ep = CapSlot::const_new(0);
|
||||
|
||||
if let Some(fb) = driver_framebuffer_virtio::VirtioFramebuffer::try_new() {
|
||||
let mut srv = display_server::server::DisplayServer::new(fb);
|
||||
server_framework::serve(&mut srv, ep);
|
||||
} else {
|
||||
let fb = driver_framebuffer_mock::MockFramebuffer::new(
|
||||
types::display::Dimension::new(640),
|
||||
types::display::Dimension::new(480),
|
||||
);
|
||||
let mut srv = display_server::server::DisplayServer::new(fb);
|
||||
server_framework::serve(&mut srv, ep);
|
||||
}
|
||||
|
||||
loop { userspace::syscall::yield_now(); }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user