diff --git a/kernel/kernel/Device/FramebufferDevice.cpp b/kernel/kernel/Device/FramebufferDevice.cpp index b562dbba..1d40f8d0 100644 --- a/kernel/kernel/Device/FramebufferDevice.cpp +++ b/kernel/kernel/Device/FramebufferDevice.cpp @@ -82,8 +82,20 @@ namespace Kernel BAN::ErrorOr FramebufferDevice::read_impl(off_t offset, BAN::ByteSpan buffer) { + // Reading from negative offset will fill buffer with framebuffer info if (offset < 0) - return BAN::Error::from_errno(EINVAL); + { + if (buffer.size() < sizeof(framebuffer_info_t)) + return BAN::Error::from_errno(ENOBUFS); + + auto& fb_info = buffer.as(); + fb_info.width = m_width; + fb_info.height = m_height; + fb_info.bpp = m_bpp; + + return sizeof(framebuffer_info_t); + } + if ((size_t)offset >= m_width * m_height * bytes_per_pixel_internal) return 0; diff --git a/libc/include/sys/framebuffer.h b/libc/include/sys/framebuffer.h new file mode 100644 index 00000000..ab92ad0d --- /dev/null +++ b/libc/include/sys/framebuffer.h @@ -0,0 +1,19 @@ +#ifndef _FRAMEBUFFER_H +#define _FRAMEBUFFER_H 1 + +#include + +__BEGIN_DECLS + +#include + +struct framebuffer_info_t +{ + uint32_t width; + uint32_t height; + uint8_t bpp; +}; + +__END_DECLS + +#endif