1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:27:45 +00:00

Kernel: Support userspace TTY graphics modesetting

This is a copy of linux's KDSETMODE/KDGETMODE console ioctl(2)
interface.
This commit is contained in:
Peter Elliott 2022-04-28 01:17:32 -06:00 committed by Andreas Kling
parent bc4a0baa8f
commit 4b0be17c71
4 changed files with 28 additions and 2 deletions

View file

@ -562,6 +562,19 @@ ErrorOr<void> TTY::ioctl(OpenFileDescription&, unsigned request, Userspace<void*
case TIOCNOTTY: case TIOCNOTTY:
current_process.set_tty(nullptr); current_process.set_tty(nullptr);
return {}; 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; return EINVAL;
} }

View file

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

View file

@ -78,8 +78,9 @@ public:
void refresh_after_resolution_change(); void refresh_after_resolution_change();
bool is_graphical() { return m_graphical; } // ^TTY
void set_graphical(bool graphical); virtual bool is_graphical() const override { return m_graphical; }
virtual void set_graphical(bool graphical) override;
void emit_char(char); void emit_char(char);

View file

@ -74,6 +74,11 @@ struct FBFlushRects {
struct FBRect const* rects; struct FBRect const* rects;
}; };
enum ConsoleModes {
KD_TEXT = 0x00,
KD_GRAPHICS = 0x01,
};
__END_DECLS __END_DECLS
enum IOCtlNumber { enum IOCtlNumber {
@ -132,6 +137,8 @@ enum IOCtlNumber {
VIRGL_IOCTL_CREATE_RESOURCE, VIRGL_IOCTL_CREATE_RESOURCE,
VIRGL_IOCTL_SUBMIT_CMD, VIRGL_IOCTL_SUBMIT_CMD,
VIRGL_IOCTL_TRANSFER_DATA, VIRGL_IOCTL_TRANSFER_DATA,
KDSETMODE,
KDGETMODE,
}; };
#define TIOCGPGRP TIOCGPGRP #define TIOCGPGRP TIOCGPGRP
@ -184,3 +191,5 @@ enum IOCtlNumber {
#define VIRGL_IOCTL_CREATE_RESOURCE VIRGL_IOCTL_CREATE_RESOURCE #define VIRGL_IOCTL_CREATE_RESOURCE VIRGL_IOCTL_CREATE_RESOURCE
#define VIRGL_IOCTL_SUBMIT_CMD VIRGL_IOCTL_SUBMIT_CMD #define VIRGL_IOCTL_SUBMIT_CMD VIRGL_IOCTL_SUBMIT_CMD
#define VIRGL_IOCTL_TRANSFER_DATA VIRGL_IOCTL_TRANSFER_DATA #define VIRGL_IOCTL_TRANSFER_DATA VIRGL_IOCTL_TRANSFER_DATA
#define KDSETMODE KDSETMODE
#define KDGETMODE KDGETMODE