From 4b0be17c719bb867c18da6055c2daa4371f632c0 Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Thu, 28 Apr 2022 01:17:32 -0600 Subject: [PATCH] Kernel: Support userspace TTY graphics modesetting This is a copy of linux's KDSETMODE/KDGETMODE console ioctl(2) interface. --- Kernel/TTY/TTY.cpp | 13 +++++++++++++ Kernel/TTY/TTY.h | 3 +++ Kernel/TTY/VirtualConsole.h | 5 +++-- Userland/Libraries/LibC/sys/ioctl_numbers.h | 9 +++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Kernel/TTY/TTY.cpp b/Kernel/TTY/TTY.cpp index 841e73720ff..77bb9ed645d 100644 --- a/Kernel/TTY/TTY.cpp +++ b/Kernel/TTY/TTY.cpp @@ -562,6 +562,19 @@ ErrorOr TTY::ioctl(OpenFileDescription&, unsigned request, Userspace(arg.ptr()); + if (mode != KD_TEXT && mode != KD_GRAPHICS) + return EINVAL; + + set_graphical(mode == KD_GRAPHICS); + return {}; + } + case KDGETMODE: { + auto mode_ptr = static_ptr_cast(arg); + int mode = (is_graphical()) ? KD_GRAPHICS : KD_TEXT; + return copy_to_user(mode_ptr, &mode); + } } return EINVAL; } diff --git a/Kernel/TTY/TTY.h b/Kernel/TTY/TTY.h index 881fe905239..76a811373ac 100644 --- a/Kernel/TTY/TTY.h +++ b/Kernel/TTY/TTY.h @@ -48,6 +48,9 @@ public: virtual ErrorOr> pseudo_name() const = 0; + virtual bool is_graphical() const { return false; } + virtual void set_graphical(bool) { } + protected: virtual ErrorOr on_tty_write(UserOrKernelBuffer const&, size_t) = 0; void set_size(unsigned short columns, unsigned short rows); diff --git a/Kernel/TTY/VirtualConsole.h b/Kernel/TTY/VirtualConsole.h index 615ad4cf168..13a8add281a 100644 --- a/Kernel/TTY/VirtualConsole.h +++ b/Kernel/TTY/VirtualConsole.h @@ -78,8 +78,9 @@ public: void refresh_after_resolution_change(); - bool is_graphical() { return m_graphical; } - void set_graphical(bool graphical); + // ^TTY + virtual bool is_graphical() const override { return m_graphical; } + virtual void set_graphical(bool graphical) override; void emit_char(char); diff --git a/Userland/Libraries/LibC/sys/ioctl_numbers.h b/Userland/Libraries/LibC/sys/ioctl_numbers.h index 2a97ea41ab3..a1a314e3783 100644 --- a/Userland/Libraries/LibC/sys/ioctl_numbers.h +++ b/Userland/Libraries/LibC/sys/ioctl_numbers.h @@ -74,6 +74,11 @@ struct FBFlushRects { struct FBRect const* rects; }; +enum ConsoleModes { + KD_TEXT = 0x00, + KD_GRAPHICS = 0x01, +}; + __END_DECLS enum IOCtlNumber { @@ -132,6 +137,8 @@ enum IOCtlNumber { VIRGL_IOCTL_CREATE_RESOURCE, VIRGL_IOCTL_SUBMIT_CMD, VIRGL_IOCTL_TRANSFER_DATA, + KDSETMODE, + KDGETMODE, }; #define TIOCGPGRP TIOCGPGRP @@ -184,3 +191,5 @@ enum IOCtlNumber { #define VIRGL_IOCTL_CREATE_RESOURCE VIRGL_IOCTL_CREATE_RESOURCE #define VIRGL_IOCTL_SUBMIT_CMD VIRGL_IOCTL_SUBMIT_CMD #define VIRGL_IOCTL_TRANSFER_DATA VIRGL_IOCTL_TRANSFER_DATA +#define KDSETMODE KDSETMODE +#define KDGETMODE KDGETMODE