diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index 6611297..437d838 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -16,28 +16,11 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) debug_info("Kernel was loaded with command line \"%s\", by <%s>\n", kernel_boot_data.commandline, kernel_boot_data.bootloader); + memory_init(); + cpu_init(); - uintptr_t start, end; - uint32_t type, i=0; - while(!multiboot_get_memory_area(i++, &start, &end, &type)) - { - debug("Mem %d 0x%x-0x%x\n", type, start, end); - for(uintptr_t p = start; p < end; p += PAGE_SIZE) - { - if(p >= V2P(&kernel_start) && p < V2P(&kernel_end)) - continue; - if(vmm_get_page(&BootP4, (uintptr_t)P2V(p)) == (uintptr_t)-1) - { - touch_page(&BootP4, (uintptr_t)P2V(p), PAGE_GLOBAL | PAGE_WRITE | PAGE_HUGE); - vmm_set_page(&BootP4, (uintptr_t)P2V(p), p, PAGE_GLOBAL | PAGE_HUGE | PAGE_WRITE | PAGE_PRESENT); - } - if(type == 1) - pmm_free(p); - } - } - debug_ok("Boot \"Complete\"\n"); PANIC("Reached end of kernel main function\n"); diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 378048e..b9de088 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -43,4 +43,6 @@ void free_page(void *P4, uintptr_t addr, int free); extern union PTE BootP4; extern int kernel_start, kernel_end; + +void memory_init(); #endif diff --git a/src/kernel/include/multiboot.h b/src/kernel/include/multiboot.h index 03ff3dd..8423415 100644 --- a/src/kernel/include/multiboot.h +++ b/src/kernel/include/multiboot.h @@ -10,6 +10,8 @@ struct kernel_boot_data_st void *mmap; }; +#define MMAP_FREE 1 + extern struct kernel_boot_data_st kernel_boot_data; int multiboot_init(uint64_t magic, void *mboot_info); diff --git a/src/kernel/memory/memory.c b/src/kernel/memory/memory.c new file mode 100644 index 0000000..4e6fd54 --- /dev/null +++ b/src/kernel/memory/memory.c @@ -0,0 +1,30 @@ +#include +#include +#include + +void memory_init() +{ + uintptr_t start, end; + uint32_t type, i = 0; + debug_info("Parsing memory map\n"); + while(!multiboot_get_memory_area(i++, &start, &end, &type)) + { + debug("0x%016x-0x%016x (%d)\n", start, end, type); + for(uintptr_t p = start; p < end; p += PAGE_SIZE) + { + if(p >= V2P(&kernel_start) && p < V2P(&kernel_end)) + continue; + + uintptr_t page = vmm_get_page(&BootP4, (uintptr_t)P2V(p)); + if(page == (uintptr_t)-1 || !(page & PAGE_PRESENT)) + { + uint16_t flags = PAGE_GLOBAL | PAGE_HUGE | PAGE_WRITE; + touch_page(&BootP4, (uintptr_t)P2V(p), flags); + vmm_set_page(&BootP4, (uintptr_t)P2V(p), p, flags | PAGE_PRESENT); + } + + if(type == MMAP_FREE) + pmm_free(p); + } + } +}