heading towards merging the 32/64 paging code
This commit is contained in:
parent
e2c8222f86
commit
4f5e2ce13b
4 changed files with 35 additions and 7 deletions
|
@ -85,7 +85,7 @@
|
||||||
#define PAGE_CEIL(addr) ( (addr) & PAGE_MASK)
|
#define PAGE_CEIL(addr) ( (addr) & PAGE_MASK)
|
||||||
|
|
||||||
// Canonical address format
|
// Canonical address format
|
||||||
#ifdef CONFIG_x86_32
|
#ifdef CONFIG_X86_32
|
||||||
#define CANONICAL(addr) (addr)
|
#define CANONICAL(addr) (addr)
|
||||||
#elif defined(CONFIG_X86_64)
|
#elif defined(CONFIG_X86_64)
|
||||||
#define CANONICAL(addr) sign_extend(addr, VIRT_BITS)
|
#define CANONICAL(addr) sign_extend(addr, VIRT_BITS)
|
||||||
|
|
|
@ -401,7 +401,7 @@ void smp_start(uint32_t id)
|
||||||
// On 64bit system, paging is already enabled
|
// On 64bit system, paging is already enabled
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
/* enable paging */
|
/* enable paging */
|
||||||
write_cr3((size_t)get_boot_pgd());
|
write_cr3((size_t) get_boot_page_map());
|
||||||
i = read_cr0();
|
i = read_cr0();
|
||||||
i = i | (1 << 31);
|
i = i | (1 << 31);
|
||||||
write_cr0(i);
|
write_cr0(i);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
C_source := page$(BIT).c svm.c
|
C_source := page.c svm.c
|
||||||
MODULE := arch_x86_mm
|
MODULE := arch_x86_mm
|
||||||
|
|
||||||
include $(TOPDIR)/Makefile.inc
|
include $(TOPDIR)/Makefile.inc
|
||||||
|
|
|
@ -59,13 +59,28 @@ extern page_entry_t boot_pml4[PAGE_MAP_ENTRIES];
|
||||||
static spinlock_t kslock = SPINLOCK_INIT;
|
static spinlock_t kslock = SPINLOCK_INIT;
|
||||||
|
|
||||||
/// Mapping of self referenced page map (at the end of the VAS)
|
/// 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 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 src_map = (page_entry_t*) (2 * PAGE_MAP_PML4);
|
||||||
static page_entry_t* const dest_map = (page_entry_t*) (3 * 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)
|
page_entry_t* get_boot_page_map(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
|
return boot_pgd;
|
||||||
|
#elif defined(CONFIG_X86_64)
|
||||||
return boot_pml4;
|
return boot_pml4;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void page_dump(size_t mask)
|
void page_dump(size_t mask)
|
||||||
|
@ -606,15 +621,28 @@ static void pagefault_handler(struct state *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
default_handler:
|
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"
|
kprintf("Page Fault Exception (%d) at cs:ip = %#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->int_no, s->cs, s->rip, CORE_ID, task->id, viraddr, s->error,
|
#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 & 0x4) ? "user" : "supervisor",
|
||||||
(s->error & 0x10) ? "instruction" : "data",
|
(s->error & 0x10) ? "instruction" : "data",
|
||||||
(s->error & 0x2) ? "write" : ((s->error & 0x10) ? "fetch" : "read"),
|
(s->error & 0x2) ? "write" : ((s->error & 0x10) ? "fetch" : "read"),
|
||||||
(s->error & 0x1) ? "protection" : "not present",
|
(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);
|
s->rflags, s->rax, s->rbx, s->rcx, s->rdx, s->rdi, s->rsi, s->rbp, s->rsp);
|
||||||
|
#endif
|
||||||
|
|
||||||
irq_enable();
|
irq_enable();
|
||||||
abort();
|
abort();
|
Loading…
Add table
Reference in a new issue