diff --git a/Cargo.lock b/Cargo.lock index 8736b257e6..fa19866677 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -935,6 +935,7 @@ dependencies = [ "drm", "libredox", "log", + "plain", "redox-ioctl", "redox_syscall 0.7.3", ] diff --git a/drivers/graphics/graphics-ipc/Cargo.toml b/drivers/graphics/graphics-ipc/Cargo.toml index 34aef775fe..2bfaadf9f5 100644 --- a/drivers/graphics/graphics-ipc/Cargo.toml +++ b/drivers/graphics/graphics-ipc/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" drm.workspace = true log.workspace = true libredox.workspace = true +plain = "0.2" redox-ioctl.workspace = true redox_syscall.workspace = true diff --git a/drivers/graphics/graphics-ipc/src/v2.rs b/drivers/graphics/graphics-ipc/src/v2.rs index fc368ccb89..7e132351b3 100644 --- a/drivers/graphics/graphics-ipc/src/v2.rs +++ b/drivers/graphics/graphics-ipc/src/v2.rs @@ -1,41 +1,15 @@ use std::fs::File; +use std::io; use std::os::fd::{AsFd, BorrowedFd}; use std::os::unix::io::AsRawFd; -use std::{io, mem}; use drm::control::connector::{self, State}; use drm::control::Device as _; use drm::{ClientCapability, Device as _, DriverCapability}; +use syscall::CallFlags; pub use crate::common::Damage; -extern "C" { - fn redox_sys_call_v0( - fd: usize, - payload: *mut u8, - payload_len: usize, - flags: usize, - metadata: *const u64, - metadata_len: usize, - ) -> usize; -} - -unsafe fn sys_call( - fd: &impl AsRawFd, - payload: &mut T, - flags: usize, - metadata: &[u64], -) -> libredox::error::Result { - libredox::error::Error::demux(redox_sys_call_v0( - fd.as_raw_fd() as usize, - payload as *mut T as *mut u8, - mem::size_of::(), - flags, - metadata.as_ptr(), - metadata.len(), - )) -} - /// A graphics handle using the v2 graphics API. /// /// The v2 graphics API allows creating framebuffers on the fly, using them for page flipping and @@ -74,14 +48,17 @@ impl V2GraphicsHandle { } pub fn update_plane(&self, display_id: usize, fb_id: u32, damage: Damage) -> io::Result<()> { - let mut cmd = ipc::UpdatePlane { + let cmd = ipc::UpdatePlane { display_id, fb_id, damage, }; - unsafe { - sys_call(&self.file, &mut cmd, 0, &[ipc::UPDATE_PLANE, 0, 0])?; - } + libredox::call::call_wo( + self.file.as_raw_fd() as usize, + unsafe { plain::as_bytes(&cmd) }, + CallFlags::empty(), + &[ipc::UPDATE_PLANE, 0, 0], + )?; Ok(()) } }