diff options
Diffstat (limited to 'kernel/mboot')
-rw-r--r-- | kernel/mboot/mboot.c | 13 | ||||
-rw-r--r-- | kernel/mboot/mboot.h | 2 | ||||
-rw-r--r-- | kernel/mboot/mmap.c | 9 | ||||
-rw-r--r-- | kernel/mboot/rsdp.c | 25 |
4 files changed, 45 insertions, 4 deletions
diff --git a/kernel/mboot/mboot.c b/kernel/mboot/mboot.c index 9156c3c..ce74cc1 100644 --- a/kernel/mboot/mboot.c +++ b/kernel/mboot/mboot.c @@ -1,7 +1,18 @@ +#include <lib.h> +#include <comus/mboot.h> #include "mboot.h" -void *locate_mboot_table(volatile void *mboot, uint32_t type) +static volatile void *mboot; + +void mboot_init(long magic, volatile void *ptr) +{ + if (magic != MBOOT_HEADER_MAGIC) + panic("invalid multiboot magic"); + mboot = ptr; +} + +void *locate_mboot_table(uint32_t type) { struct mboot_info *info = (struct mboot_info *)mboot; const char *mboot_end = ((char *)info) + info->total_size; diff --git a/kernel/mboot/mboot.h b/kernel/mboot/mboot.h index db85de1..7e8c09a 100644 --- a/kernel/mboot/mboot.h +++ b/kernel/mboot/mboot.h @@ -100,6 +100,6 @@ struct mboot_tag_framebuffer { uint16_t reserved; }; -void *locate_mboot_table(volatile void *mboot, uint32_t type); +void *locate_mboot_table(uint32_t type); #endif /* mboot.h */ diff --git a/kernel/mboot/mmap.c b/kernel/mboot/mmap.c index 8a5f549..1b5f08b 100644 --- a/kernel/mboot/mmap.c +++ b/kernel/mboot/mmap.c @@ -8,9 +8,12 @@ static const char *segment_type[] = { "Reserved", "Free", "Hibernation", "Defective", "Unknown" }; -void mboot_load_mmap(volatile void *mboot, struct memory_map *res) +int mboot_get_mmap(struct memory_map *res) { - void *tag = locate_mboot_table(mboot, MBOOT_MEMORY_MAP); + void *tag = locate_mboot_table(MBOOT_MEMORY_MAP); + if (tag == NULL) + return 1; + struct mboot_tag_mmap *mmap = (struct mboot_tag_mmap *)tag; int idx = 0; @@ -33,4 +36,6 @@ void mboot_load_mmap(volatile void *mboot, struct memory_map *res) res->entries[idx].len = seg->len; } res->entry_count = idx; + + return 0; } diff --git a/kernel/mboot/rsdp.c b/kernel/mboot/rsdp.c new file mode 100644 index 0000000..fb49187 --- /dev/null +++ b/kernel/mboot/rsdp.c @@ -0,0 +1,25 @@ +#include <lib.h> +#include <comus/mboot.h> + +#include "mboot.h" + +void *mboot_get_rsdp(void) +{ + void *tag; + + // acpi 2.0 + tag = locate_mboot_table(MBOOT_NEW_RSDP); + if (tag != NULL) { + struct mboot_tag_new_rsdp *rsdp = (struct mboot_tag_new_rsdp *) tag; + return rsdp->rsdp; + } + + // acpi 1.0 + tag = locate_mboot_table(MBOOT_OLD_RSDP); + if (tag != NULL) { + struct mboot_tag_old_rsdp *rsdp = (struct mboot_tag_old_rsdp *) tag; + return rsdp->rsdp; + } + + return NULL; +} |