summaryrefslogtreecommitdiff
path: root/kernel/mboot
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mboot')
-rw-r--r--kernel/mboot/efi.c38
-rw-r--r--kernel/mboot/mboot.c2
-rw-r--r--kernel/mboot/mmap.c30
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;