hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/boot/limine.zig
diff options
context:
space:
mode:
Diffstat (limited to 'boot/limine.zig')
-rw-r--r--boot/limine.zig41
1 files changed, 41 insertions, 0 deletions
diff --git a/boot/limine.zig b/boot/limine.zig
index e9aac9c..ef08867 100644
--- a/boot/limine.zig
+++ b/boot/limine.zig
@@ -25,3 +25,44 @@ pub const RequestsEndMarker = extern struct {
m0: u64 = 0xadc0e0531bb10d03,
m1: u64 = 0x9572709f31764c62,
};
+
+// Every request id starts with this common magic, then two request-specific
+// words. Limine scans .limine_requests for these and fills in `response`.
+fn requestId(a: u64, b: u64) [4]u64 {
+ return .{ 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b, a, b };
+}
+
+// --- Framebuffer feature: ask Limine for a linear framebuffer ---
+
+pub const Framebuffer = extern struct {
+ address: [*]u8,
+ width: u64,
+ height: u64,
+ pitch: u64, // bytes per row (not always width*bpp/8)
+ bpp: u16, // bits per pixel
+ memory_model: u8, // 1 = RGB
+ red_mask_size: u8,
+ red_mask_shift: u8,
+ green_mask_size: u8,
+ green_mask_shift: u8,
+ blue_mask_size: u8,
+ blue_mask_shift: u8,
+ // 7 bytes of padding land here (extern-struct alignment before edid_size)
+ edid_size: u64,
+ edid: ?*anyopaque,
+ // response revision 1 and up — unused for now:
+ mode_count: u64,
+ modes: ?*anyopaque,
+};
+
+pub const FramebufferResponse = extern struct {
+ revision: u64,
+ framebuffer_count: u64,
+ framebuffers: ?[*]*Framebuffer,
+};
+
+pub const FramebufferRequest = extern struct {
+ id: [4]u64 = requestId(0x9d5827dcd881dd75, 0xa3148604f6fab11b),
+ revision: u64 = 0,
+ response: ?*FramebufferResponse = null,
+};