diff --git a/src/kernel/boot/multiboot.c b/src/kernel/boot/multiboot.c index 8dc2822..44f3076 100644 --- a/src/kernel/boot/multiboot.c +++ b/src/kernel/boot/multiboot.c @@ -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; +} diff --git a/src/kernel/boot/multiboot.tt b/src/kernel/boot/multiboot.tt index 61e8366..f964016 100644 --- a/src/kernel/boot/multiboot.tt +++ b/src/kernel/boot/multiboot.tt @@ -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) { diff --git a/src/kernel/include/multiboot.h b/src/kernel/include/multiboot.h index 8423415..c758987 100644 --- a/src/kernel/include/multiboot.h +++ b/src/kernel/include/multiboot.h @@ -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); diff --git a/src/kernel/memory/memory.c b/src/kernel/memory/memory.c index 9f2f53f..3d8ff36 100644 --- a/src/kernel/memory/memory.c +++ b/src/kernel/memory/memory.c @@ -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);