diff --git a/kernel/init.asm b/kernel/init.asm index a7da8b8..1d7a3d0 100644 --- a/kernel/init.asm +++ b/kernel/init.asm @@ -80,18 +80,6 @@ flush_tss: ltr [esp+4] ret -global enable_paging -enable_paging: - push eax - mov eax, [esp+4] - mov cr3, eax - - mov eax, cr0 - or eax, 0x80000000 - mov cr0, eax - pop eax - ret - extern exception_handler %macro isr_err_stub 1 isr_stub_%+%1: diff --git a/kernel/kernel.c b/kernel/kernel.c index 7a45e72..63b51dc 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -17,7 +17,6 @@ extern void pit_isr(void); extern void jmp_user_mode(uint32_t esp, uint32_t eip); extern void flush_tss(uint32_t segment_selector); extern gdt_t gdt[6]; -extern void enable_paging(uint32_t *page_directory); void exception_handler(int_stack_frame_t r) { LOG("Exception 0x%X (0x%X) has occurred\nEAX: 0x%08X\nECX: 0x%08X\nEDX: 0x%08X\nEBX: 0x%08X\nESI: 0x%08X\nEDI: 0x%08X\nEBP: 0x%08X\nESP: 0x%08X\n", @@ -94,17 +93,25 @@ void kernel(multiboot_info_t *info) { #define PAGE_TAB_INDEX(x) (((x) >> 12) & 0x3FF) #define PAGE_OFFSET(x) ((x) & 0xFFF) - LOG("Page directory: %08X -- Page table: %08X\n", page_dir, page_tab); - for (int i = 0; i < 1024; i++) { - page_tab[i] = (i * 0x1000) | PAGE_PRESENT | PAGE_RW | PAGE_USER; + page_tab[i] = (i * 0x1000) | PAGE_PRESENT | PAGE_RW | PAGE_USER; } for (int i = 0; i < 1024; i++) { - page_dir[i] = ((uint32_t)page_tab) | PAGE_PRESENT | PAGE_RW | PAGE_USER; + page_dir[i] = ((uint32_t)page_tab) | PAGE_PRESENT | PAGE_RW | PAGE_USER; } - enable_paging(page_dir); + //enable_paging(page_dir); + asm volatile("mov %0, %%cr3" :: "r" (page_dir)); + + asm volatile( + "mov %%cr0, %%eax;" + "or $0x80000000, %%eax;" + "mov %%eax, %%cr0;" + : + : + : "%eax" + ); uint32_t stack = (uint32_t)mmap_find_first_free_block(); multi_mod_t *init = (multi_mod_t *)info->moduleaddress;