limine: Add EFI system table request
diff --git a/common/limine.h b/common/limine.h
index deab0a66..d24e929b 100644
--- a/common/limine.h
+++ b/common/limine.h
@@ -237,4 +237,20 @@ struct limine_smbios_request {
LIMINE_PTR(struct limine_smbios_response *) response;
};
+// EFI system table
+
+#define LIMINE_EFI_SYSTEM_TABLE_REQUEST { LIMINE_COMMON_MAGIC, 0x5ceba5163eaaf6d6, 0x0a6981610cf65fcc }
+
+struct limine_efi_system_table_response {
+ uint64_t revision;
+
+ LIMINE_PTR(void *) address;
+};
+
+struct limine_efi_system_table_request {
+ uint64_t id[4];
+ uint64_t revision;
+ LIMINE_PTR(struct limine_efi_system_table_response *) response;
+};
+
#endif
diff --git a/common/protos/limine.c b/common/protos/limine.c
index dc2ff071..fc8c2311 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -103,8 +103,6 @@ static void *_get_request(uint64_t id[4]) {
#define FEAT_END } while (0);
bool limine_load(char *config, char *cmdline) {
- (void)cmdline;
-
uint32_t eax, ebx, ecx, edx;
char *kernel_path = config_get_value(config, 0, "KERNEL_PATH");
@@ -304,6 +302,24 @@ FEAT_START
smbios_request->response = reported_addr(smbios_response);
FEAT_END
+
+#if uefi == 1
+ // EFI system table feature
+FEAT_START
+ struct limine_efi_system_table_request *est_request = get_request(LIMINE_EFI_SYSTEM_TABLE_REQUEST);
+ if (est_request == NULL) {
+ break; // next feature
+ }
+
+ struct limine_efi_system_table_response *est_response =
+ ext_mem_alloc(sizeof(struct limine_efi_system_table_response));
+
+ est_response->address = reported_addr(gST);
+
+ est_request->response = reported_addr(est_response);
+FEAT_END
+#endif
+
// Modules
FEAT_START
struct limine_module_request *module_request = get_request(LIMINE_MODULE_REQUEST);
diff --git a/test/limine.c b/test/limine.c
index 859e0a02..ed9def87 100644
--- a/test/limine.c
+++ b/test/limine.c
@@ -47,6 +47,11 @@ struct limine_smbios_request smbios_request = {
.revision = 0, .response = NULL
};
+struct limine_efi_system_table_request est_request = {
+ .id = LIMINE_EFI_SYSTEM_TABLE_REQUEST,
+ .revision = 0, .response = NULL
+};
+
struct limine_smp_request _smp_request = {
.id = LIMINE_SMP_REQUEST,
.revision = 0, .response = NULL
@@ -114,32 +119,32 @@ static void limine_main(void) {
e9_printf("Kernel slide: %x", kernel_slide);
FEAT_START
+ e9_printf("");
if (bootloader_info_request.response == NULL) {
e9_printf("Bootloader info not passed");
break;
}
- e9_printf("");
struct limine_bootloader_info_response *bootloader_info_response = bootloader_info_request.response;
e9_printf("Bootloader name: %s", bootloader_info_response->name);
e9_printf("Bootloader version: %s", bootloader_info_response->version);
FEAT_END
FEAT_START
+ e9_printf("");
if (hhdm_request.response == NULL) {
e9_printf("HHDM not passed");
break;
}
- e9_printf("");
struct limine_hhdm_response *hhdm_response = hhdm_request.response;
e9_printf("Higher half direct map at: %x", hhdm_response->address);
FEAT_END
FEAT_START
+ e9_printf("");
if (memmap_request.response == NULL) {
e9_printf("Memory map not passed");
break;
}
- e9_printf("");
struct limine_memmap_response *memmap_response = memmap_request.response;
e9_printf("%d memory map entries", memmap_response->entry_count);
for (size_t i = 0; i < memmap_response->entry_count; i++) {
@@ -150,11 +155,11 @@ FEAT_START
FEAT_END
FEAT_START
+ e9_printf("");
if (framebuffer_request.response == NULL) {
e9_printf("Framebuffer not passed");
break;
}
- e9_printf("");
struct limine_framebuffer_response *fb_response = framebuffer_request.response;
e9_printf("%d framebuffer(s)", fb_response->fb_count);
for (size_t i = 0; i < fb_response->fb_count; i++) {
@@ -176,11 +181,11 @@ FEAT_START
FEAT_END
FEAT_START
+ e9_printf("");
if (module_request.response == NULL) {
e9_printf("Modules not passed");
break;
}
- e9_printf("");
struct limine_module_response *module_response = module_request.response;
e9_printf("%d module(s)", module_response->module_count);
for (size_t i = 0; i < module_response->module_count; i++) {
@@ -194,32 +199,42 @@ FEAT_START
FEAT_END
FEAT_START
+ e9_printf("");
if (rsdp_request.response == NULL) {
e9_printf("RSDP not passed");
break;
}
- e9_printf("");
struct limine_rsdp_response *rsdp_response = rsdp_request.response;
e9_printf("RSDP at: %x", rsdp_response->address);
FEAT_END
FEAT_START
+ e9_printf("");
if (smbios_request.response == NULL) {
e9_printf("SMBIOS not passed");
break;
}
- e9_printf("");
struct limine_smbios_response *smbios_response = smbios_request.response;
e9_printf("SMBIOS 32-bit entry at: %x", smbios_response->entry_32);
e9_printf("SMBIOS 64-bit entry at: %x", smbios_response->entry_64);
FEAT_END
FEAT_START
+ e9_printf("");
+ if (est_request.response == NULL) {
+ e9_printf("EFI system table not passed");
+ break;
+ }
+ struct limine_efi_system_table_response *est_response = est_request.response;
+ e9_printf("EFI system table at: %x", est_response->address);
+FEAT_END
+
+FEAT_START
+ e9_printf("");
if (_smp_request.response == NULL) {
e9_printf("SMP info not passed");
break;
}
- e9_printf("");
struct limine_smp_response *smp_response = _smp_request.response;
e9_printf("Flags: %x", smp_response->flags);
e9_printf("BSP LAPIC ID: %x", smp_response->bsp_lapic_id);
