97 lines
2.6 KiB
C
97 lines
2.6 KiB
C
|
#include <multiboot2.h>
|
||
|
#include <pmm.h>
|
||
|
#include <cdef.h>
|
||
|
#include <print.h>
|
||
|
#include <memory_layout.h>
|
||
|
|
||
|
|
||
|
// Putting multiboot device info here
|
||
|
static char *loader_name = 0x0;
|
||
|
static void *file_mod = 0x0;
|
||
|
|
||
|
// OH BOY DON"T I FUCKING LOVE THIS SHIT
|
||
|
static uint64 _low = 0;
|
||
|
static uint64 _high = 0;
|
||
|
|
||
|
|
||
|
void
|
||
|
process_mmap(struct multiboot_tag_mmap *mmap)
|
||
|
{
|
||
|
struct multiboot_mmap_entry entry;
|
||
|
|
||
|
uint16 num_entries = (mmap->size - sizeof(*mmap)) / mmap->entry_size;
|
||
|
for (uint16 i = 0; i < num_entries; i++)
|
||
|
{
|
||
|
entry = mmap->entries[i];
|
||
|
if ((entry.type == 1) && (entry.len > _high - _low))
|
||
|
{
|
||
|
#ifdef KDBG
|
||
|
kprintf("Update low: 0x%x high: 0x%x\n", (uint64) entry.addr, (uint64) (entry.addr + entry.len));
|
||
|
#endif
|
||
|
_high = entry.addr + entry.len;
|
||
|
_low = entry.addr;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
process_tag(htag *tag)
|
||
|
{
|
||
|
struct multiboot_tag_mmap *mmap_tag;
|
||
|
struct multiboot_tag_string *strtag;
|
||
|
struct multiboot_tag_module *modtag;
|
||
|
while(1)
|
||
|
{
|
||
|
if(tag->type == MULTIBOOT_HEADER_TAG_END)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
switch (tag->type)
|
||
|
{
|
||
|
case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME:
|
||
|
strtag = (struct multiboot_tag_string *) tag;
|
||
|
loader_name = &strtag->string[0];
|
||
|
tag = (void*)ALIGN(uintptr, (uintptr)tag + tag->size, MULTIBOOT_TAG_ALIGN);
|
||
|
break;
|
||
|
case MULTIBOOT_TAG_TYPE_MMAP:
|
||
|
mmap_tag = (struct multiboot_tag_mmap *) tag;
|
||
|
process_mmap(mmap_tag);
|
||
|
tag = (void*)ALIGN(uintptr, (uintptr)tag + tag->size, MULTIBOOT_TAG_ALIGN);
|
||
|
break;
|
||
|
case MULTIBOOT_TAG_TYPE_MODULE:
|
||
|
modtag = (struct multiboot_tag_module *)tag;
|
||
|
file_mod = modtag;
|
||
|
tag = (void*)ALIGN(uintptr, (uintptr)tag + tag->size, MULTIBOOT_TAG_ALIGN);
|
||
|
break;
|
||
|
default:
|
||
|
tag = (void*)ALIGN(uintptr, (uintptr)tag + tag->size, MULTIBOOT_TAG_ALIGN);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void parse_mb2(mbentry *mb, void **module, char **ld_name, uint64 *low, uint64 *high)
|
||
|
{
|
||
|
uint64 tag_base0 = (uint64) mb;
|
||
|
uint64 next_entry;
|
||
|
uint64 last_entry;
|
||
|
|
||
|
next_entry = tag_base0 + 8;
|
||
|
last_entry = tag_base0 + mb->total_size - 8;
|
||
|
|
||
|
htag *last_tag = (htag *) last_entry;
|
||
|
if (!(last_tag->type == 0 && last_tag->size == 8))
|
||
|
{ return; }
|
||
|
|
||
|
htag *tag = (htag *) next_entry;
|
||
|
process_tag(tag);
|
||
|
|
||
|
*module = file_mod;
|
||
|
*ld_name = loader_name;
|
||
|
*low = _low;
|
||
|
*high = _high;
|
||
|
}
|
||
|
|