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; break;
case MBOOT2_MMAP: case MBOOT2_MMAP:
mmap = kernel_boot_data.mmap = (void *)tag->data; 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; break;
default: default:
debug_warning("Unknown multiboot tag type:%d \n", tag->type); 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) 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 *mmap = kernel_boot_data.mmap;
struct mmap_entry *entry = mmap->entries; 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; *type = entry->type;
return 0; 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); multiboot_init(MAGIC, tags);
ASSERT_EQ_INT(kernel_boot_data.mmap_size, 1); ASSERT_EQ_INT(kernel_boot_data.mmap_len, 1);
free(tags); free(tags);
} }
void setup_memory_areas() void setup_memory_areas()
@ -179,7 +179,7 @@ void setup_memory_areas()
TEST(reads_multiple_mmap_tags) TEST(reads_multiple_mmap_tags)
{ {
setup_memory_areas(); 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) TEST(returns_memory_area_start)
{ {

View File

@ -7,6 +7,7 @@ struct kernel_boot_data_st
char *bootloader; char *bootloader;
char *commandline; char *commandline;
size_t mmap_size; size_t mmap_size;
unsigned int mmap_len;
void *mmap; 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_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_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)) if(p >= V2P(&kernel_start) && p < V2P(&kernel_end))
continue; continue;
if(multiboot_page_used(p))
continue;
uint64_t addr = (uint64_t)P2V(p); uint64_t addr = (uint64_t)P2V(p);
uint64_t page = vmm_get_page(kernel_P4, addr); uint64_t page = vmm_get_page(kernel_P4, addr);