123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #include "multiboot2.h"
- #include "assert.h"
- #include "../../common/glib.h"
- #include "../../common/kprint.h"
- uintptr_t multiboot2_boot_info_addr;
- unsigned int multiboot2_magic;
- unsigned int multiboot2_boot_info_size;
- bool multiboot2_init(void)
- {
- uintptr_t *addr = (uintptr_t *)multiboot2_boot_info_addr;
- if (multiboot2_magic != MULTIBOOT2_BOOTLOADER_MAGIC)
- ;
- return false;
-
- multiboot2_boot_info_size = *(unsigned int *)addr;
- return true;
- }
- void multiboot2_iter(bool (*_fun)(const struct iter_data_t *, void *, unsigned int *),
- void *data, unsigned int *count)
- {
- uintptr_t addr = multiboot2_boot_info_addr;
-
- struct iter_data_t *tag = (struct iter_data_t *)((void*)addr + 8);
- for (; tag->type != MULTIBOOT_TAG_TYPE_END;
- tag = (struct iter_data_t *)((uint8_t *)tag + ALIGN(tag->size, 8)))
- {
- if (_fun(tag, data, count) == true)
- {
- return;
- }
- }
- return;
- }
- bool multiboot2_get_memory(const struct iter_data_t *_iter_data, void *data, unsigned int *count)
- {
- if (_iter_data->type != MULTIBOOT_TAG_TYPE_MMAP)
- return false;
- struct multiboot_mmap_entry_t *resource = (struct multiboot_mmap_entry_t *)data;
- struct multiboot_mmap_entry_t *mmap = ((struct multiboot_tag_mmap_t *)_iter_data)->entries;
- *count = 0;
- for (; (uint8_t *)mmap < (uint8_t *)_iter_data + _iter_data->size;
- mmap = (struct multiboot_mmap_entry_t *)((uint8_t *)mmap + ((struct multiboot_tag_mmap_t *)_iter_data)->entry_size))
- {
- *resource = *mmap;
-
- resource = (struct multiboot_mmap_entry_t *)((uint8_t *)resource + ((struct multiboot_tag_mmap_t *)_iter_data)->entry_size);
- ++(*count);
- }
- return true;
- }
- bool multiboot2_get_VBE_info(const struct iter_data_t *_iter_data, void *data, unsigned int *reserved)
- {
- if (_iter_data->type != MULTIBOOT_TAG_TYPE_VBE)
- return false;
- *(struct multiboot_tag_vbe_t *)data = *(struct multiboot_tag_vbe_t *)_iter_data;
- return true;
- }
- bool multiboot2_get_Framebuffer_info(const struct iter_data_t *_iter_data, void *data, unsigned int *reserved)
- {
- if (_iter_data->type != MULTIBOOT_TAG_TYPE_FRAMEBUFFER)
- return false;
- *(struct multiboot_tag_framebuffer_info_t *)data = *(struct multiboot_tag_framebuffer_info_t *)_iter_data;
- return true;
- }
- bool multiboot2_get_acpi_old_RSDP(const struct iter_data_t *_iter_data, void *data, unsigned int *reserved)
- {
- if (_iter_data->type != MULTIBOOT_TAG_TYPE_ACPI_OLD)
- return false;
- *(struct multiboot_tag_old_acpi_t *)data = *(struct multiboot_tag_old_acpi_t *)_iter_data;
- return true;
- }
- bool multiboot2_get_acpi_new_RSDP(const struct iter_data_t *_iter_data, void *data, unsigned int *reserved)
- {
- if (_iter_data->type != MULTIBOOT_TAG_TYPE_ACPI_NEW)
- return false;
- *(struct multiboot_tag_new_acpi_t *)data = *(struct multiboot_tag_new_acpi_t *)_iter_data;
- return true;
- }
|