diff options
author | Freya Murphy <freya@freyacat.org> | 2025-04-19 16:36:51 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-19 16:37:54 -0400 |
commit | 472ec944d2ed81d0304cc6cac80946a6a44776be (patch) | |
tree | f6cae641c143a0b45bb289d9d9fc6145706025b0 /kernel/mboot | |
parent | set mmap limit (diff) | |
download | comus-472ec944d2ed81d0304cc6cac80946a6a44776be.tar.gz comus-472ec944d2ed81d0304cc6cac80946a6a44776be.tar.bz2 comus-472ec944d2ed81d0304cc6cac80946a6a44776be.zip |
UEFI and republicans
Diffstat (limited to 'kernel/mboot')
-rw-r--r-- | kernel/mboot/efi.c | 38 | ||||
-rw-r--r-- | kernel/mboot/mboot.c | 2 | ||||
-rw-r--r-- | kernel/mboot/mmap.c | 30 |
3 files changed, 66 insertions, 4 deletions
diff --git a/kernel/mboot/efi.c b/kernel/mboot/efi.c new file mode 100644 index 0000000..75b869a --- /dev/null +++ b/kernel/mboot/efi.c @@ -0,0 +1,38 @@ +#include <comus/mboot.h> + +#include "mboot.h" + +#define MULTIBOOT_TAG_TYPE_EFI64 12 +#define MULTIBOOT_TAG_TYPE_EFI64_IH 20 + +struct multiboot_tag_efi64 { + uint32_t type; + uint32_t size; + uint64_t pointer; +}; + +struct multiboot_tag_efi64_ih { + uint32_t type; + uint32_t size; + uint64_t pointer; +}; + +EFI_SYSTEM_TABLE *mboot_get_efi_st(void) +{ + void *tag = locate_mboot_table(MULTIBOOT_TAG_TYPE_EFI64); + if (tag == NULL) + return NULL; + + struct multiboot_tag_efi64 *efi = (struct multiboot_tag_efi64 *)tag; + return (void *)efi->pointer; +} + +EFI_HANDLE mboot_get_efi_hdl(void) +{ + void *tag = locate_mboot_table(MULTIBOOT_TAG_TYPE_EFI64_IH); + if (tag == NULL) + return NULL; + + struct multiboot_tag_efi64_ih *ih = (struct multiboot_tag_efi64_ih *)tag; + return (void *)ih->pointer; +} diff --git a/kernel/mboot/mboot.c b/kernel/mboot/mboot.c index 949337d..e4547e7 100644 --- a/kernel/mboot/mboot.c +++ b/kernel/mboot/mboot.c @@ -8,7 +8,7 @@ static volatile void *mboot = NULL; void mboot_init(long magic, volatile void *ptr) { if (magic != MULTIBOOT2_BOOTLOADER_MAGIC) - panic("invalid multiboot magic"); + panic("invalid multiboot magic: %#08lx", magic); mboot = ptr; } diff --git a/kernel/mboot/mmap.c b/kernel/mboot/mmap.c index d1d3d9a..96dc54c 100644 --- a/kernel/mboot/mmap.c +++ b/kernel/mboot/mmap.c @@ -7,6 +7,12 @@ #define MULTIBOOT_TAG_TYPE_MMAP 6 +#define MULTIBOOT_SEG_TYPE_RESV 0 +#define MULTIBOOT_SEG_TYPE_FREE 1 +#define MULTIBOOT_SEG_TYPE_ACPI 3 +#define MULTIBOOT_SEG_TYPE_HIBR 4 +#define MULTIBOOT_SEG_TYPE_DEFC 5 + struct multiboot_mmap_entry { uint64_t addr; uint64_t len; @@ -32,14 +38,32 @@ int mboot_get_mmap(struct memory_map *res) int idx = 0; uintptr_t i = (uintptr_t)mmap->entries; - for (; i < (uintptr_t)mmap->entries + mmap->size; - i += mmap->entry_size, idx++) { + for (; i < (uintptr_t)mmap->entries + mmap->size; i += mmap->entry_size) { if (idx >= N_MMAP_ENTRY) panic("Too many mmap entries: limit is %d", N_MMAP_ENTRY); struct multiboot_mmap_entry *seg = (struct multiboot_mmap_entry *)i; res->entries[idx].addr = seg->addr; res->entries[idx].len = seg->len; - res->entries[idx].type = seg->type; + switch (seg->type) { + case MULTIBOOT_SEG_TYPE_RESV: + res->entries[idx].type = SEG_TYPE_RESERVED; + break; + case MULTIBOOT_SEG_TYPE_FREE: + res->entries[idx].type = SEG_TYPE_FREE; + break; + case MULTIBOOT_SEG_TYPE_ACPI: + res->entries[idx].type = SEG_TYPE_ACPI; + break; + case MULTIBOOT_SEG_TYPE_HIBR: + res->entries[idx].type = SEG_TYPE_HIBERNATION; + break; + case MULTIBOOT_SEG_TYPE_DEFC: + res->entries[idx].type = SEG_TYPE_DEFECTIVE; + break; + default: + continue; + } + idx++; } res->entry_count = idx; |