Don't put multiboot data in page stack

This commit is contained in:
Thomas Lovén 2018-02-22 13:08:39 +01:00
parent 36c517dd82
commit df0df93da7
4 changed files with 22 additions and 4 deletions

View File

@ -50,7 +50,8 @@ int parse_multiboot2(struct taglist *tags)
break;
case MBOOT2_MMAP:
mmap = kernel_boot_data.mmap = (void *)tag->data;
kernel_boot_data.mmap_size = (tag->size - 8)/mmap->entry_size;
kernel_boot_data.mmap_len = (tag->size - 8)/mmap->entry_size;
kernel_boot_data.mmap_size = (tag->size - 8);
break;
default:
debug_warning("Unknown multiboot tag type:%d \n", tag->type);
@ -76,7 +77,7 @@ int multiboot_init(uint64_t magic, void *mboot_info)
int multiboot_get_memory_area(size_t count, uintptr_t *start, uintptr_t *end, uint32_t *type)
{
if(count >= kernel_boot_data.mmap_size) return 1;
if(count >= kernel_boot_data.mmap_len) return 1;
struct mmap *mmap = kernel_boot_data.mmap;
struct mmap_entry *entry = mmap->entries;
@ -87,3 +88,16 @@ int multiboot_get_memory_area(size_t count, uintptr_t *start, uintptr_t *end, ui
*type = entry->type;
return 0;
}
int multiboot_page_used(uintptr_t start)
{
#define overlap(st, len) ((uintptr_t)st < (start + PAGE_SIZE) && start <= ((uintptr_t)st + len))
if(
overlap(kernel_boot_data.bootloader, strlen(kernel_boot_data.bootloader)) ||
overlap(kernel_boot_data.commandline, strlen(kernel_boot_data.commandline)) ||
overlap(kernel_boot_data.mmap, kernel_boot_data.mmap_size) ||
0)
return 1;
return 0;
}

View File

@ -161,7 +161,7 @@ TEST(reads_mmap_tag)
);
multiboot_init(MAGIC, tags);
ASSERT_EQ_INT(kernel_boot_data.mmap_size, 1);
ASSERT_EQ_INT(kernel_boot_data.mmap_len, 1);
free(tags);
}
void setup_memory_areas()
@ -179,7 +179,7 @@ void setup_memory_areas()
TEST(reads_multiple_mmap_tags)
{
setup_memory_areas();
ASSERT_EQ_INT(kernel_boot_data.mmap_size, 2);
ASSERT_EQ_INT(kernel_boot_data.mmap_len, 2);
}
TEST(returns_memory_area_start)
{

View File

@ -7,6 +7,7 @@ struct kernel_boot_data_st
char *bootloader;
char *commandline;
size_t mmap_size;
unsigned int mmap_len;
void *mmap;
};
@ -16,3 +17,4 @@ extern struct kernel_boot_data_st kernel_boot_data;
int multiboot_init(uint64_t magic, void *mboot_info);
int multiboot_get_memory_area(size_t count, uintptr_t *start, uintptr_t *end, uint32_t *type);
int multiboot_page_used(uintptr_t start);

View File

@ -17,6 +17,8 @@ void memory_init()
{
if(p >= V2P(&kernel_start) && p < V2P(&kernel_end))
continue;
if(multiboot_page_used(p))
continue;
uint64_t addr = (uint64_t)P2V(p);
uint64_t page = vmm_get_page(kernel_P4, addr);