Selaa lähdekoodia

Kernel: Support userspace TTY graphics modesetting

This is a copy of linux's KDSETMODE/KDGETMODE console ioctl(2)
interface.
Peter Elliott 3 vuotta sitten
vanhempi
commit
4b0be17c71

+ 13 - 0
Kernel/TTY/TTY.cpp

@@ -562,6 +562,19 @@ ErrorOr<void> TTY::ioctl(OpenFileDescription&, unsigned request, Userspace<void*
     case TIOCNOTTY:
         current_process.set_tty(nullptr);
         return {};
+    case KDSETMODE: {
+        auto mode = static_cast<unsigned int>(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<int*>(arg);
+        int mode = (is_graphical()) ? KD_GRAPHICS : KD_TEXT;
+        return copy_to_user(mode_ptr, &mode);
+    }
     }
     return EINVAL;
 }

+ 3 - 0
Kernel/TTY/TTY.h

@@ -48,6 +48,9 @@ public:
 
     virtual ErrorOr<NonnullOwnPtr<KString>> pseudo_name() const = 0;
 
+    virtual bool is_graphical() const { return false; }
+    virtual void set_graphical(bool) { }
+
 protected:
     virtual ErrorOr<size_t> on_tty_write(UserOrKernelBuffer const&, size_t) = 0;
     void set_size(unsigned short columns, unsigned short rows);

+ 3 - 2
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);
 

+ 9 - 0
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