From 47d6f879fbb935faa350ddb975cc58da6fef01e1 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 14 Dec 2025 20:16:53 +0100 Subject: [PATCH] drivers/graphics/graphics-ipc: Nicer version handling of version command --- drivers/graphics/driver-graphics/src/lib.rs | 18 ++++++++++++++---- drivers/graphics/graphics-ipc/src/v2.rs | 2 ++ drivers/graphics/vesad/src/scheme.rs | 14 ++++++-------- drivers/graphics/virtio-gpud/src/scheme.rs | 16 ++++++---------- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 32cb4253fd..9077dba432 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -1,5 +1,6 @@ #![feature(slice_as_array)] +use std::cmp; use std::collections::{BTreeMap, HashMap}; use std::fs::File; use std::io::{self, Write}; @@ -18,8 +19,8 @@ pub trait GraphicsAdapter { type Framebuffer: Framebuffer; type Cursor: CursorFramebuffer; - fn name(&self) -> [u8;16]; - fn desc(&self) -> [u8;16]; + fn name(&self) -> &'static [u8]; + fn desc(&self) -> &'static [u8]; fn get_cap(&self, cap: u64) -> Result; fn set_client_cap(&self, cap: u64, value: u64) -> Result<()>; @@ -448,8 +449,17 @@ impl SchemeSync for GraphicsScheme { payload.version_major = 1; payload.version_minor = 4; payload.version_patchlevel = 0; - payload.name = self.adapter.name(); - payload.desc = self.adapter.desc(); + + let name = self.adapter.name(); + let name_len = cmp::min(name.len(), payload.name_len); + payload.name[..name_len].copy_from_slice(&name[..name_len]); + payload.name_len = name.len(); + + let desc = self.adapter.desc(); + let desc_len = cmp::min(desc.len(), payload.name_len); + payload.desc[..desc_len].copy_from_slice(&desc[..desc_len]); + payload.desc_len = desc.len(); + Ok(size_of::()) } diff --git a/drivers/graphics/graphics-ipc/src/v2.rs b/drivers/graphics/graphics-ipc/src/v2.rs index 6cd9a80a71..bad15c7478 100644 --- a/drivers/graphics/graphics-ipc/src/v2.rs +++ b/drivers/graphics/graphics-ipc/src/v2.rs @@ -160,7 +160,9 @@ pub mod ipc { pub version_minor: u32, pub version_patchlevel: u32, // FIXME allow variable sized fields + pub name_len: usize, pub name: [u8; 16], + pub desc_len: usize, pub desc: [u8; 16], } diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index 6d66ec9ade..0c91f82b99 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -19,27 +19,25 @@ impl GraphicsAdapter for FbAdapter { type Framebuffer = GraphicScreen; type Cursor = VesadCursor; - fn name(&self) -> [u8; 16] { - [ - b'v', b'e', b's', b'a', b'd', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ] + fn name(&self) -> &'static [u8] { + b"vesad" } - fn desc(&self) -> [u8; 16] { - [b'V', b'E', b'S', b'A', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + fn desc(&self) -> &'static [u8] { + b"VESA" } fn get_cap(&self, cap: u64) -> syscall::Result { match cap { CAP_DUMB_BUFFER => Ok(1), - _ => Err(syscall::Error::new(EINVAL)) + _ => Err(syscall::Error::new(EINVAL)), } } fn set_client_cap(&self, cap: u64, _value: u64) -> syscall::Result<()> { match cap { CLIENT_CAP_CURSOR_PLANE_HOTSPOT => Ok(()), - _ => Err(syscall::Error::new(EINVAL)) + _ => Err(syscall::Error::new(EINVAL)), } } diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index cc92684546..00a9d5e016 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -201,22 +201,18 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { type Framebuffer = VirtGpuFramebuffer<'a>; type Cursor = VirtGpuCursor; - fn name(&self) -> [u8; 16] { - [ - b'v', b'i', b'r', b't', b'i', b'o', b'-', b'g', b'p', b'u', b'd', 0, 0, 0, 0, 0, - ] + fn name(&self) -> &'static [u8] { + b"virtio-gpud" } - fn desc(&self) -> [u8; 16] { - [ - b'V', b'i', b'r', b't', b'I', b'O', b' ', b'G', b'P', b'U', 0, 0, 0, 0, 0, 0, - ] + fn desc(&self) -> &'static [u8] { + b"VirtIO GPU" } fn get_cap(&self, cap: u64) -> syscall::Result { match cap { CAP_DUMB_BUFFER => Ok(1), - _ => Err(syscall::Error::new(EINVAL)) + _ => Err(syscall::Error::new(EINVAL)), } } @@ -224,7 +220,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { match cap { // FIXME hide cursor plane unless this client cap is set CLIENT_CAP_CURSOR_PLANE_HOTSPOT => Ok(()), - _ => Err(syscall::Error::new(EINVAL)) + _ => Err(syscall::Error::new(EINVAL)), } }