diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 32cb4253fd..69d0b67481 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,11 +449,19 @@ 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(); - Ok(size_of::()) - } + 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::()) + } ipc::GET_CAP => { if payload.len() < size_of::() { return Err(Error::new(EINVAL)); @@ -463,9 +472,21 @@ impl SchemeSync for GraphicsScheme { ) }; payload.value = self.adapter.get_cap(payload.capability)?; - Ok(size_of::()) + Ok(size_of::()) + } + ipc::SET_CLIENT_CAP => { + if payload.len() < size_of::() { + return Err(Error::new(EINVAL)); + } + let payload = unsafe { + transmute::<&mut [u8; size_of::()], &mut ipc::SetClientCap>( + payload.as_mut_array().unwrap(), + ) + }; + self.adapter + .set_client_cap(payload.capability, payload.value)?; + Ok(size_of::()) } - ipc::DISPLAY_COUNT => { if payload.len() < size_of::() { return Err(Error::new(EINVAL)); 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)), } }