From bb6e4d98d1cbe5744cf517a93379da21b3abd744 Mon Sep 17 00:00:00 2001 From: "Chloe M." Date: Mon, 22 Jun 2026 02:25:27 +0000 Subject: [PATCH] stos: bpal: Initialize BPAL handle Signed-off-by: Chloe M. --- paw/stos/head/ke/bpal.h | 9 ++++++++- paw/stos/ke/bpal/bpal.c | 14 +++++++++++++- paw/stos/ke/bpal/proto/limine.c | 12 +++++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/paw/stos/head/ke/bpal.h b/paw/stos/head/ke/bpal.h index 5a4fbb3..d3ac26d 100644 --- a/paw/stos/head/ke/bpal.h +++ b/paw/stos/head/ke/bpal.h @@ -25,7 +25,14 @@ typedef struct { */ VOID KeBpalInit(VOID); +/* + * Obtain the boot protocol handle + * + * @Result: Result is written here + */ +VOID KeBpalGetHandle(BPAL_HANDLE *Result); + /* Backend init functions */ -VOID KeBpalLimineInit(VOID); +VOID KeBpalLimineInit(BPAL_HANDLE *Handle); #endif /* !_KE_BPAL_H_ */ diff --git a/paw/stos/ke/bpal/bpal.c b/paw/stos/ke/bpal/bpal.c index d5e987d..d64b4e5 100644 --- a/paw/stos/ke/bpal/bpal.c +++ b/paw/stos/ke/bpal/bpal.c @@ -16,6 +16,18 @@ #define BOOT_PROTO _BOOT_PROTO #endif /* !_BOOT_PROTO */ +static BPAL_HANDLE BpalHandle; + +VOID +KeBpalGetHandle(BPAL_HANDLE *Result) +{ + if (Result == NULL) { + return; + } + + *Result = BpalHandle; +} + VOID KeBpalInit(VOID) { @@ -24,7 +36,7 @@ KeBpalInit(VOID) switch (*BootProto) { case 'l': if (RtlMemCmp(BootProto, "limine", 6) == 0) { - KeBpalLimineInit(); + KeBpalLimineInit(&BpalHandle); return; } } diff --git a/paw/stos/ke/bpal/proto/limine.c b/paw/stos/ke/bpal/proto/limine.c index 7f6a383..e9c6e62 100644 --- a/paw/stos/ke/bpal/proto/limine.c +++ b/paw/stos/ke/bpal/proto/limine.c @@ -13,6 +13,13 @@ #define DTRACE(Fmt, ...) \ TRACE("[ BPAL ]: " Fmt, ##__VA_ARGS__) +/* HHDM request */ +static struct limine_hhdm_response *HHDMResp = NULL; +static volatile struct limine_hhdm_request HHDMReq = { + .id = LIMINE_HHDM_REQUEST_ID, + .revision = 0 +}; + /* Bootloader information */ static struct limine_bootloader_info_response *LoaderInfoResp = NULL; static volatile struct limine_bootloader_info_request LoaderInfoReq = { @@ -28,10 +35,11 @@ static struct limine_bootloader_performance_request LoaderPerReq = { }; VOID -KeBpalLimineInit(VOID) +KeBpalLimineInit(BPAL_HANDLE *Handle) { LoaderInfoResp = LoaderInfoReq.response; LoaderPerfResp = LoaderPerReq.response; + HHDMResp = HHDMReq.response; DTRACE( "slut handed control by %s %s\n", @@ -48,4 +56,6 @@ KeBpalLimineInit(VOID) "handoff took %d usec\n", LoaderPerfResp->exec_usec ); + + Handle->KernelBase = HHDMResp->offset; }