diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index 83eea552..7772f310 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h @@ -85,7 +85,7 @@ #define PAGE_CEIL(addr) ( (addr) & PAGE_MASK) // Canonical address format -#ifdef CONFIG_x86_32 +#ifdef CONFIG_X86_32 #define CANONICAL(addr) (addr) #elif defined(CONFIG_X86_64) #define CANONICAL(addr) sign_extend(addr, VIRT_BITS) diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c index 36fdfb97..e7e37ffe 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c @@ -401,7 +401,7 @@ void smp_start(uint32_t id) // On 64bit system, paging is already enabled #ifdef CONFIG_X86_32 /* enable paging */ - write_cr3((size_t)get_boot_pgd()); + write_cr3((size_t) get_boot_page_map()); i = read_cr0(); i = i | (1 << 31); write_cr0(i); diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index c5b4f064..09392539 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile @@ -1,4 +1,4 @@ -C_source := page$(BIT).c svm.c +C_source := page.c svm.c MODULE := arch_x86_mm include $(TOPDIR)/Makefile.inc diff --git a/arch/x86/mm/page64.c b/arch/x86/mm/page.c similarity index 93% rename from arch/x86/mm/page64.c rename to arch/x86/mm/page.c index 44643b03..c5d6c654 100644 --- a/arch/x86/mm/page64.c +++ b/arch/x86/mm/page.c @@ -59,13 +59,28 @@ extern page_entry_t boot_pml4[PAGE_MAP_ENTRIES]; static spinlock_t kslock = SPINLOCK_INIT; /// Mapping of self referenced page map (at the end of the VAS) +// TODO: find a more generic initialization +#ifdef CONFIG_X86_32 +static page_entry_t* const current_map = (page_entry_t*) (1 * PAGE_MAP_PGD); +static page_entry_t* const src_map = (page_entry_t*) (2 * PAGE_MAP_PGD); +static page_entry_t* const dest_map = (page_entry_t*) (3 * PAGE_MAP_PGD); +#elif defined(CONFIG_X86_64) static page_entry_t* const current_map = (page_entry_t*) (1 * PAGE_MAP_PML4); static page_entry_t* const src_map = (page_entry_t*) (2 * PAGE_MAP_PML4); static page_entry_t* const dest_map = (page_entry_t*) (3 * PAGE_MAP_PML4); +#endif + +#ifdef CONFIG_X86_32 +static page_entry_t boot_pgd[PAGE_MAP_ENTRIES]; +#endif page_entry_t* get_boot_page_map(void) { +#ifdef CONFIG_X86_32 + return boot_pgd; +#elif defined(CONFIG_X86_64) return boot_pml4; +#endif } void page_dump(size_t mask) @@ -606,15 +621,28 @@ static void pagefault_handler(struct state *s) } default_handler: - kprintf("Page Fault Exception (%d) at cs:rip = %#x:%#lx, core = %u, task = %u, addr = %#lx, error = %#x [ %s %s %s %s %s ]\n" - "Register state: rflags = %#lx, rax = %#lx, rbx = %#lx, rcx = %#lx, rdx = %#lx, rdi = %#lx, rsi = %#lx, rbp = %#llx, rsp = %#lx\n", - s->int_no, s->cs, s->rip, CORE_ID, task->id, viraddr, s->error, + kprintf("Page Fault Exception (%d) at cs:ip = %#x:%#lx, core = %u, task = %u, addr = %#lx, error = %#x [ %s %s %s %s %s ]\n", + s->int_no, s->cs, +#ifdef CONFIG_X86_32 + s->eip, +#elif defined(CONFIG_X86_64) + s->rip, +#endif + CORE_ID, task->id, viraddr, s->error, (s->error & 0x4) ? "user" : "supervisor", (s->error & 0x10) ? "instruction" : "data", (s->error & 0x2) ? "write" : ((s->error & 0x10) ? "fetch" : "read"), (s->error & 0x1) ? "protection" : "not present", - (s->error & 0x8) ? "reserved bit" : "\b", + (s->error & 0x8) ? "reserved bit" : "\b"); + + // TODO: move this to something like print_registers() +#ifdef CONFIG_X86_32 + kprintf("Register state: eflags = %#lx, eax = %#lx, ebx = %#lx, ecx = %#lx, edx = %#lx, edi = %#lx, esi = %#lx, ebp = %#llx, esp = %#lx\n", + s->eflags, s->eax, s->ebx, s->ecx, s->edx, s->edi, s->esi, s->ebp, s->esp); +#elif defined(CONFIG_X86_64) + kprintf("Register state: rflags = %#lx, rax = %#lx, rbx = %#lx, rcx = %#lx, rdx = %#lx, rdi = %#lx, rsi = %#lx, rbp = %#llx, rsp = %#lx\n", s->rflags, s->rax, s->rbx, s->rcx, s->rdx, s->rdi, s->rsi, s->rbp, s->rsp); +#endif irq_enable(); abort();