diff --git a/service/ptos/head/ke/bpal.h b/service/ptos/head/ke/bpal.h index 3e715f6..c2cca33 100644 --- a/service/ptos/head/ke/bpal.h +++ b/service/ptos/head/ke/bpal.h @@ -12,14 +12,33 @@ #include #include +/* + * Represents a framebuffer + */ +typedef struct { + VOID *Address; + UQUAD Width; + UQUAD Height; + UQUAD Pitch; + SHORT Bpp; + UCHAR RedMaskSize; + UCHAR RedMaskShift; + UCHAR GreenMaskSize; + UCHAR GreenMaskShift; + UCHAR BlueMaskSize; + UCHAR BlueMaskShift; +} BPAL_FRAMEBUFFER; + /* * Represents a handle for the boot protocol abstraction * layer containing data filled in by the bootloader. * - * @KernelBase: Represents the kernel load base + * @KernelBase: Represents the kernel load base + * @Framebuffer: Framebuffer information */ typedef struct { UPTR KernelBase; + BPAL_FRAMEBUFFER Framebuffer; } BPAL_HANDLE; /* diff --git a/service/ptos/ke/bpal/proto/limine.c b/service/ptos/ke/bpal/proto/limine.c index 273d1ee..cab1a21 100644 --- a/service/ptos/ke/bpal/proto/limine.c +++ b/service/ptos/ke/bpal/proto/limine.c @@ -9,6 +9,15 @@ #include #include +#define FRAMEBUFFER FbResp->framebuffers[0] + +/* Framebuffer request */ +static struct limine_framebuffer_response *FbResp = NULL; +static struct limine_framebuffer_request FbReq = { + .id = LIMINE_FRAMEBUFFER_REQUEST_ID, + .revision = 0 +}; + /* HHDM request */ static struct limine_hhdm_response *HHDMResp = NULL; static volatile struct limine_hhdm_request HHDMReq = { @@ -16,6 +25,28 @@ static volatile struct limine_hhdm_request HHDMReq = { .revision = 0 }; +VOID +BpalInitFramebuffer(BPAL_HANDLE *Handle) +{ + BPAL_FRAMEBUFFER *Framebuffer; + + if (Handle == NULL) { + return; + } + + Framebuffer = &Handle->Framebuffer; + Framebuffer->Address = FRAMEBUFFER->address; + Framebuffer->Width = FRAMEBUFFER->width; + Framebuffer->Height = FRAMEBUFFER->height; + Framebuffer->Pitch = FRAMEBUFFER->pitch; + Framebuffer->RedMaskSize = FRAMEBUFFER->red_mask_size; + Framebuffer->RedMaskShift = FRAMEBUFFER->red_mask_shift; + Framebuffer->GreenMaskSize = FRAMEBUFFER->green_mask_size; + Framebuffer->GreenMaskShift = FRAMEBUFFER->green_mask_shift; + Framebuffer->BlueMaskSize = FRAMEBUFFER->blue_mask_size; + Framebuffer->BlueMaskShift = FRAMEBUFFER->blue_mask_shift; +} + VOID KeBpalLimineInit(BPAL_HANDLE *Result) { @@ -24,5 +55,8 @@ KeBpalLimineInit(BPAL_HANDLE *Result) } HHDMResp = HHDMReq.response; + FbResp = FbReq.response; + Result->KernelBase = HHDMResp->offset; + BpalInitFramebuffer(Result); }