linux: Pass additional EFI info to kernel
diff --git a/stage23/lib/blib.c b/stage23/lib/blib.c
index bf9d4f41..ba0e947d 100644
--- a/stage23/lib/blib.c
+++ b/stage23/lib/blib.c
@@ -14,6 +14,8 @@ EFI_SYSTEM_TABLE *gST;
EFI_BOOT_SERVICES *gBS;
EFI_RUNTIME_SERVICES *gRT;
EFI_HANDLE efi_image_handle;
+EFI_MEMORY_DESCRIPTOR *efi_mmap = NULL;
+UINTN efi_mmap_size = 0, efi_desc_size = 0, efi_desc_ver = 0;
#endif
bool parse_resolution(int *width, int *height, int *bpp, const char *buf) {
diff --git a/stage23/lib/blib.h b/stage23/lib/blib.h
index e67c2766..837b38b6 100644
--- a/stage23/lib/blib.h
+++ b/stage23/lib/blib.h
@@ -15,6 +15,8 @@ extern EFI_SYSTEM_TABLE *gST;
extern EFI_BOOT_SERVICES *gBS;
extern EFI_RUNTIME_SERVICES *gRT;
extern EFI_HANDLE efi_image_handle;
+extern EFI_MEMORY_DESCRIPTOR *efi_mmap;
+extern UINTN efi_mmap_size, efi_desc_size, efi_desc_ver;
extern bool efi_boot_services_exited;
bool efi_exit_boot_services(void);
diff --git a/stage23/mm/pmm.s2.c b/stage23/mm/pmm.s2.c
index 98c5d934..f88516f2 100644
--- a/stage23/mm/pmm.s2.c
+++ b/stage23/mm/pmm.s2.c
@@ -228,26 +228,24 @@ void init_memmap(void) {
EFI_STATUS status;
EFI_MEMORY_DESCRIPTOR tmp_mmap[1];
- UINTN mmap_size = sizeof(tmp_mmap);
- UINTN mmap_key = 0, desc_size = 0, desc_ver = 0;
+ efi_mmap_size = sizeof(tmp_mmap);
+ UINTN mmap_key = 0;
status = uefi_call_wrapper(gBS->GetMemoryMap, 5,
- &mmap_size, tmp_mmap, &mmap_key, &desc_size, &desc_ver);
+ &efi_mmap_size, tmp_mmap, &mmap_key, &efi_desc_size, &efi_desc_ver);
- EFI_MEMORY_DESCRIPTOR *efi_mmap;
-
- mmap_size += 4096;
+ efi_mmap_size += 4096;
status = uefi_call_wrapper(gBS->AllocatePool, 3,
- EfiLoaderData, mmap_size, &efi_mmap);
+ EfiLoaderData, efi_mmap_size, &efi_mmap);
status = uefi_call_wrapper(gBS->GetMemoryMap, 5,
- &mmap_size, efi_mmap, &mmap_key, &desc_size, &desc_ver);
+ &efi_mmap_size, efi_mmap, &mmap_key, &efi_desc_size, &efi_desc_ver);
- size_t entry_count = mmap_size / desc_size;
+ size_t entry_count = efi_mmap_size / efi_desc_size;
for (size_t i = 0; i < entry_count; i++) {
- EFI_MEMORY_DESCRIPTOR *entry = (void *)efi_mmap + i * desc_size;
+ EFI_MEMORY_DESCRIPTOR *entry = (void *)efi_mmap + i * efi_desc_size;
uint32_t our_type;
switch (entry->Type) {
diff --git a/stage23/protos/linux.c b/stage23/protos/linux.c
index 852b0f2a..1849dd7f 100644
--- a/stage23/protos/linux.c
+++ b/stage23/protos/linux.c
@@ -530,9 +530,18 @@ void linux_load(char *config, char *cmdline) {
boot_params->acpi_rsdp_addr = (uintptr_t)acpi_get_rsdp();
///////////////////////////////////////
- // Jettison UEFI
+ // UEFI
///////////////////////////////////////
#if defined (uefi)
+ memcpy(&boot_params->efi_info.efi_loader_signature, "EL64", 4);
+ boot_params->efi_info.efi_systab = (uint32_t)(uintptr_t)gST;
+ boot_params->efi_info.efi_systab_hi = (uint32_t)((uintptr_t)gST >> 32);
+ boot_params->efi_info.efi_memmap = (uint32_t)(uintptr_t)efi_mmap;
+ boot_params->efi_info.efi_memmap_hi = (uint32_t)((uintptr_t)efi_mmap >> 32);
+ boot_params->efi_info.efi_memmap_size = efi_mmap_size;
+ boot_params->efi_info.efi_memdesc_size = efi_desc_size;
+ boot_params->efi_info.efi_memdesc_version = efi_desc_ver;
+
efi_exit_boot_services();
#endif
