From 436a16b06983ea4fd58e75c21ce4203ec7df6fb6 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 21 Dec 2024 20:37:21 +0100 Subject: [PATCH] virtio-gpud: Migrate to redox-scheme --- Cargo.lock | 1 + graphics/virtio-gpud/Cargo.toml | 1 + graphics/virtio-gpud/src/main.rs | 29 +++++++++++++++++------------ graphics/virtio-gpud/src/scheme.rs | 23 ++++++++++++++++------- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 92d3f8964b..639bf4af21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1736,6 +1736,7 @@ dependencies = [ "paste", "pcid", "redox-daemon", + "redox-scheme", "redox_syscall", "spin", "static_assertions", diff --git a/graphics/virtio-gpud/Cargo.toml b/graphics/virtio-gpud/Cargo.toml index 75901d433e..4068fc438a 100644 --- a/graphics/virtio-gpud/Cargo.toml +++ b/graphics/virtio-gpud/Cargo.toml @@ -21,3 +21,4 @@ redox_syscall = "0.5" orbclient = "0.3.27" spin = "0.9.8" libredox = "0.1.3" +redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } diff --git a/graphics/virtio-gpud/src/main.rs b/graphics/virtio-gpud/src/main.rs index 7ad1e13e08..7ba38cb8cf 100644 --- a/graphics/virtio-gpud/src/main.rs +++ b/graphics/virtio-gpud/src/main.rs @@ -23,13 +23,11 @@ #![feature(int_roundings)] use std::cell::UnsafeCell; -use std::fs::File; -use std::io::{Read, Write}; use std::sync::Arc; use pcid_interface::PciFunctionHandle; -use syscall::{Packet, SchemeMut}; +use redox_scheme::{RequestKind, SignalBehavior, Socket, V2}; use virtio_core::transport::{self, Queue}; use virtio_core::utils::VolatileCell; use virtio_core::MSIX_PRIMARY_VECTOR; @@ -438,7 +436,7 @@ fn deamon(deamon: redox_daemon::Daemon) -> anyhow::Result<()> { device.transport.run_device(); deamon.ready().unwrap(); - let mut socket_file = File::create(":display.virtio-gpu")?; + let socket_file: Socket = Socket::create("display.virtio-gpu")?; let mut scheme = futures::executor::block_on(scheme::Scheme::new( config, control_queue.clone(), @@ -449,14 +447,21 @@ fn deamon(deamon: redox_daemon::Daemon) -> anyhow::Result<()> { // scheme.inputd_handle.activate(scheme.main_vt)?; loop { - let mut packet = Packet::default(); - socket_file - .read(&mut packet) - .expect("virtio-gpud: failed to read disk scheme"); - scheme.handle(&mut packet); - socket_file - .write(&packet) - .expect("virtio-gpud: failed to read disk scheme"); + let Some(request) = socket_file.next_request(SignalBehavior::Restart)? else { + // Scheme likely got unmounted + return Ok(()); + }; + + match request.kind() { + RequestKind::Call(call_request) => { + socket_file.write_response( + call_request.handle_scheme_mut(&mut scheme), + SignalBehavior::Restart, + )?; + } + RequestKind::Cancellation(_cancellation_request) => {} + RequestKind::MsyncMsg | RequestKind::MunmapMsg | RequestKind::MmapMsg => unreachable!(), + } } } diff --git a/graphics/virtio-gpud/src/scheme.rs b/graphics/virtio-gpud/src/scheme.rs index 73bb2aab5f..462a29070c 100644 --- a/graphics/virtio-gpud/src/scheme.rs +++ b/graphics/virtio-gpud/src/scheme.rs @@ -7,7 +7,8 @@ use std::sync::Arc; use common::{dma::Dma, sgl}; use inputd::Damage; -use syscall::{Error as SysError, MapFlags, SchemeMut, EAGAIN, EINVAL, PAGE_SIZE}; +use redox_scheme::SchemeMut; +use syscall::{Error as SysError, MapFlags, EAGAIN, EINVAL, PAGE_SIZE}; use virtio_core::spec::{Buffer, ChainBuilder, DescriptorFlags}; use virtio_core::transport::{Error, Queue, Transport}; @@ -384,13 +385,25 @@ impl<'a> SchemeMut for Scheme<'a> { } } - fn read(&mut self, _id: usize, _buf: &mut [u8]) -> syscall::Result { + fn read( + &mut self, + _id: usize, + _buf: &mut [u8], + _offset: u64, + _fcntl_flags: u32, + ) -> syscall::Result { // TODO: figure out how to get input lol log::warn!("virtio_gpu::read is a stub!"); Ok(0) } - fn write(&mut self, id: usize, buf: &[u8]) -> syscall::Result { + fn write( + &mut self, + id: usize, + buf: &[u8], + _offset: u64, + _fcntl_flags: u32, + ) -> syscall::Result { match self.handles.get(&id).ok_or(SysError::new(EINVAL))? { Handle::Vt { display, .. } => { // The VT is not active and the device is reseted. Ask them to try @@ -460,10 +473,6 @@ impl<'a> SchemeMut for Scheme<'a> { } } - fn seek(&mut self, _id: usize, _pos: isize, _whence: usize) -> syscall::Result { - todo!() - } - fn close(&mut self, _id: usize) -> syscall::Result { Ok(0) }