From 207be757681c96dd1fb1606d2905708e30e2b67b Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Tue, 16 Dec 2025 20:59:33 +0100 Subject: [PATCH] drivers/graphics/graphics-ipc: Use redox-ioctl --- Cargo.lock | 15 +- Cargo.toml | 4 + drivers/graphics/graphics-ipc/Cargo.toml | 2 +- drivers/graphics/graphics-ipc/src/v2.rs | 335 +---------------------- 4 files changed, 18 insertions(+), 338 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d5ff055f3b..2db6a02f6e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -813,7 +813,7 @@ dependencies = [ [[package]] name = "generic-rt" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#9db10bb0a9651b86012a0d58a3327df95a20a297" +source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#3ebd43b4ceb77bfee2a9c155993ec2fb5843ad6b" [[package]] name = "getrandom" @@ -866,9 +866,9 @@ name = "graphics-ipc" version = "0.1.0" dependencies = [ "common", - "drm-sys", "libredox", "log", + "redox-ioctl", "redox_syscall", ] @@ -1616,6 +1616,15 @@ dependencies = [ "twox-hash", ] +[[package]] +name = "redox-ioctl" +version = "0.1.0" +source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#3ebd43b4ceb77bfee2a9c155993ec2fb5843ad6b" +dependencies = [ + "drm-sys", + "redox_syscall", +] + [[package]] name = "redox-log" version = "0.1.4" @@ -1631,7 +1640,7 @@ dependencies = [ [[package]] name = "redox-rt" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#9db10bb0a9651b86012a0d58a3327df95a20a297" +source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#3ebd43b4ceb77bfee2a9c155993ec2fb5843ad6b" dependencies = [ "bitflags 2.10.0", "generic-rt", diff --git a/Cargo.toml b/Cargo.toml index 99e9c039ea..8abd8b0109 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,3 +75,7 @@ exclude = ["bootstrap"] # Needs libc 0.2 backport of https://github.com/rust-lang/libc/pull/4825 libc = { git = "https://gitlab.redox-os.org/redox-os/liblibc.git", branch = "redox-0.2" } orbclient = { git = "https://gitlab.redox-os.org/redox-os/orbclient.git", version = "0.3.44" } + +[patch."https://gitlab.redox-os.org/redox-os/relibc.git"] +#redox-rt = { path = "../../relibc/source/redox-rt" } +#redox-ioctl = { path = "../../relibc/source/redox-ioctl" } diff --git a/drivers/graphics/graphics-ipc/Cargo.toml b/drivers/graphics/graphics-ipc/Cargo.toml index 47f98f1848..0175a52c72 100644 --- a/drivers/graphics/graphics-ipc/Cargo.toml +++ b/drivers/graphics/graphics-ipc/Cargo.toml @@ -4,9 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -drm-sys = "0.8.0" log = "0.4" libredox = "0.1.3" redox_syscall = "0.5" +redox-ioctl = { git = "https://gitlab.redox-os.org/redox-os/relibc.git" } common = { path = "../../common" } diff --git a/drivers/graphics/graphics-ipc/src/v2.rs b/drivers/graphics/graphics-ipc/src/v2.rs index d95cd49924..b8ca1c9c63 100644 --- a/drivers/graphics/graphics-ipc/src/v2.rs +++ b/drivers/graphics/graphics-ipc/src/v2.rs @@ -153,340 +153,7 @@ impl V2GraphicsHandle { pub mod ipc { use crate::common::Damage; - use core::cmp; - use core::ffi::{c_char, c_int}; - use core::iter; - use core::mem; - use core::slice; - - pub trait IoctlData { - unsafe fn write(&self) -> Vec; - unsafe fn read_from(&mut self, buf: &[u8]); - } - - macro_rules! define_ioctl_data { - (struct $ioctl_ty:ident, $mem_ty:ident { - $($rest:tt)* - }) => { - define_ioctl_data!( - struct $ioctl_ty, $mem_ty { $($rest)* } => (), (), () - ); - }; - (struct $ioctl_ty:ident, $mem_ty:ident { - $field:ident: $ty:ty, - $($rest:tt)* - } => - ($($ioctl_fields:tt)*), - ($($counted_fields:tt)*), - ($($noncounted_fields:tt)*) - ) => { - define_ioctl_data!( - struct $ioctl_ty, $mem_ty { $($rest)* } => - ($($ioctl_fields)* $field: $ty,), - ($($counted_fields)*), - ($($noncounted_fields)* $field: $ty,) - ); - }; - (struct $ioctl_ty:ident, $mem_ty:ident { - $field:ident: $ty:ty [array<$el:ty, $counted_by:ident>], - $($rest:tt)* - } => - ($($ioctl_fields:tt)*), - ($($counted_fields:tt)*), - ($($noncounted_fields:tt)*) - ) => { - define_ioctl_data!( - struct $ioctl_ty, $mem_ty { $($rest)* } => - ($($ioctl_fields)* $field: $ty,), - ($($counted_fields)* $field: $ty [array<$el, $counted_by>],), - ($($noncounted_fields)*) - ); - }; - (struct $ioctl_ty:ident, $mem_ty:ident {} => - ($($ioctl_field:ident: $ioctl_field_ty:ty,)*), - ($($counted_field:ident: $counted_ty:ty [array<$el:ty, $counted_by:ident>],)*), - ($($noncounted_field:ident: $noncounted_ty:ty,)*) - ) => { - pub use drm_sys::$ioctl_ty; - - // FIXME check ioctl_ty doesn't have padding - const _: $ioctl_ty = $ioctl_ty { - $($ioctl_field: unsafe { mem::zeroed::<$ioctl_field_ty>() },)* - }; - - #[repr(C)] - pub struct ${concat(__, $mem_ty, Noncounted)} { - $($noncounted_field: $noncounted_ty,)* - } - - pub struct $mem_ty<'a> { - noncounted_fields: &'a mut ${concat(__, $mem_ty, Noncounted)}, - $($counted_field: &'a mut [$el],)* - } - - impl IoctlData for $ioctl_ty { - unsafe fn write(&self) -> Vec { - let noncounted_fields = ${concat(__, $mem_ty, Noncounted)} { - $($noncounted_field: self.$noncounted_field,)* - }; - // FIXME use Vec::with_capacity - let mut data = Vec::::new(); - data.extend_from_slice(&unsafe { - mem::transmute::< - ${concat(__, $mem_ty, Noncounted)}, - [u8; size_of::<${concat(__, $mem_ty, Noncounted)}>()], - >(noncounted_fields) - }); - $( - let size = self.$counted_by as usize * size_of::<$el>(); - if self.$counted_field as usize != 0 { - let $counted_field = unsafe { - slice::from_raw_parts(self.$counted_field as *const u8, size) - }; - data.extend_from_slice(&$counted_field); - } else { - data.extend(iter::repeat(0u8).take(size)); - }; - - )* - data - } - - unsafe fn read_from(&mut self, mut buf: &[u8]) { - // FIXME be robust against malicious scheme implementations by returning an error - // when the buf is the wrong size - let noncounted_fields = buf.split_off(..size_of::<${concat(__, $mem_ty, Noncounted)}>()).unwrap(); - - $( - let size = self.$counted_by as usize * size_of::<$el>(); - let $counted_field = buf.split_off(..size).unwrap(); - if self.$counted_field as usize != 0 { - unsafe { - slice::from_raw_parts_mut(self.$counted_field as *mut u8, size).copy_from_slice($counted_field); - } - } - )* - - assert!(buf.is_empty()); - - let noncounted_fields = unsafe { &*(noncounted_fields as *const _ as *const ${concat(__, $mem_ty, Noncounted)}) }; - $(self.$noncounted_field = noncounted_fields.$noncounted_field;)* - } - } - - impl<'a> $mem_ty<'a> { - pub fn with( - mut buf: &'a mut [u8], - f: impl FnOnce($mem_ty<'a>) -> syscall::Result, - ) -> syscall::Result { - let noncounted_fields = buf.split_off_mut(..size_of::<${concat(__, $mem_ty, Noncounted)}>()) - .ok_or(syscall::Error::new(syscall::EINVAL))?; - let noncounted_fields = unsafe { &mut *(noncounted_fields as *mut _ as *mut ${concat(__, $mem_ty, Noncounted)}) }; - - $( - let $counted_field = buf.split_off_mut(..noncounted_fields.$counted_by as usize * size_of::<$el>()) - .ok_or(syscall::Error::new(syscall::EINVAL))?; - let $counted_field = unsafe { - slice::from_raw_parts_mut($counted_field as *mut _ as *mut $el, noncounted_fields.$counted_by as usize) - }; - )* - - if !buf.is_empty() { - return Err(syscall::Error::new(syscall::EINVAL)); - } - - - - Ok( f($mem_ty { - noncounted_fields, - $($counted_field,)* - })?) - } - - $( - pub fn $noncounted_field(&self) -> $noncounted_ty { - self.noncounted_fields.$noncounted_field - } - - /// Should not be called for fields used as array length - pub fn ${concat(set_, $noncounted_field)}(&mut self, data: $noncounted_ty) { - self.noncounted_fields.$noncounted_field = data; - } - )* - - $( - pub fn $counted_field(&self) -> &[$el] { - self.$counted_field - } - - pub fn ${concat(set_, $counted_field)}(&mut self, data: &[$el]) { - let copied_count = cmp::min(data.len(), self.$counted_field.len()); - self.$counted_field[..copied_count].copy_from_slice(&data[..copied_count]); - self.noncounted_fields.$counted_by = data.len() as _; - } - )* - } - }; - } - - pub const VERSION: u64 = 0; - define_ioctl_data! { - struct drm_version, DrmVersion { - version_major: c_int, - version_minor: c_int, - version_patchlevel: c_int, - name_len: drm_sys::__kernel_size_t, - name: *mut c_char [array], - date_len: drm_sys::__kernel_size_t, - date: *mut c_char [array], - desc_len: drm_sys::__kernel_size_t, - desc: *mut c_char [array], - } - } - - pub const GET_CAP: u64 = 0x0C; - pub use drm_sys::DRM_CAP_DUMB_BUFFER; - define_ioctl_data! { - struct drm_get_cap, DrmGetCap { - capability: u64, - value: u64, - } - } - - pub const SET_CLIENT_CAP: u64 = 0x0D; - pub use drm_sys::DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT; - define_ioctl_data! { - struct drm_set_client_cap, DrmSetClientCap { - capability: u64, - value: u64, - } - } - - pub const MODE_CARD_RES: u64 = 0xA0; - define_ioctl_data! { - struct drm_mode_card_res, DrmModeCardRes { - fb_id_ptr: u64 [array], - crtc_id_ptr: u64 [array], - connector_id_ptr: u64 [array], - encoder_id_ptr: u64 [array], - count_fbs: u32, - count_crtcs: u32, - count_connectors: u32, - count_encoders: u32, - min_width: u32, - max_width: u32, - min_height: u32, - max_height: u32, - } - } - - pub const MODE_GET_CRTC: u64 = 0xA1; - define_ioctl_data! { - struct drm_mode_crtc, DrmModeCrtc { - set_connectors_ptr: u64, - count_connectors: u32, - crtc_id: u32, - fb_id: u32, - x: u32, - y: u32, - gamma_size: u32, - mode_valid: u32, - mode: drm_sys::drm_mode_modeinfo, - } - } - - pub const MODE_GET_ENCODER: u64 = 0xA6; - define_ioctl_data! { - struct drm_mode_get_encoder, DrmModeGetEncoder { - encoder_id: u32, - encoder_type: u32, - crtc_id: u32, - possible_crtcs: u32, - possible_clones: u32, - } - } - - pub const MODE_GET_CONNECTOR: u64 = 0xA7; - define_ioctl_data! { - struct drm_mode_get_connector, DrmModeGetConnector { - encoders_ptr: u64 [array], - modes_ptr: u64 [array], - props_ptr: u64 [array], - prop_values_ptr: u64 [array], - count_modes: u32, - count_props: u32, - count_encoders: u32, - encoder_id: u32, - connector_id: u32, - connector_type: u32, - connector_type_id: u32, - connection: u32, - mm_width: u32, - mm_height: u32, - subpixel: u32, - pad: u32, - } - } - - pub const MODE_GET_FB: u64 = 0xAD; - define_ioctl_data! { - struct drm_mode_fb_cmd, DrmModeFbCmd { - fb_id: u32, - width: u32, - height: u32, - pitch: u32, - bpp: u32, - depth: u32, - handle: u32, - } - } - - pub const MODE_GET_PLANE_RES: u64 = 0xB5; - define_ioctl_data! { - struct drm_mode_get_plane_res, DrmModeGetPlaneRes { - plane_id_ptr: u64 [array], - count_planes: u32, - } - } - - pub const MODE_GET_PLANE: u64 = 0xB6; - define_ioctl_data! { - struct drm_mode_get_plane, DrmModeGetPlane { - plane_id: u32, - crtc_id: u32, - fb_id: u32, - possible_crtcs: u32, - gamma_size: u32, - count_format_types: u32, - format_type_ptr: u64 [array], - } - } - - pub const MODE_OBJ_GET_PROPERTIES: u64 = 0xB9; - define_ioctl_data! { - struct drm_mode_obj_get_properties, DrmModeObjGetProperties { - props_ptr: u64 [array], - prop_values_ptr: u64 [array], - count_props: u32, - obj_id: u32, - obj_type: u32, - } - } - - pub const MODE_GET_FB2: u64 = 0xCE; - define_ioctl_data! { - struct drm_mode_fb_cmd2, DrmModeFbCmd2 { - fb_id: u32, - width: u32, - height: u32, - pixel_format: u32, - flags: u32, - handles: [u32; 4], - pitches: [u32; 4], - offsets: [u32; 4], - modifier: [u64; 4], - } - } + pub use redox_ioctl::drm::*; // FIXME replace these with proper drm interfaces pub const DISPLAY_COUNT: u64 = 1;