diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-09-02 14:53:09 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-09-02 14:53:09 +0200 |
| commit | 5348a94a6e7a16a070c502c29db30a08253a99a3 (patch) | |
| tree | a60838ee9c4b7ac854084fe0eeb0e579a5afc33d /kernel/vmem.c | |
| parent | 347ee926fd09d7fb45025f2c4e4a4eeab83459c9 (diff) | |
Debugging paging problem on VirtualBox (VT-x)
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index 8590579..741a1e8 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -7,7 +7,8 @@ // TODO : why is the frame not 0xfffff?? -enum PAGE_PTE_FLAGS { +enum PAGE_PTE_FLAGS +{ I86_PTE_PRESENT = 1, //0000000000000000000000000000001 I86_PTE_WRITABLE = 2, //0000000000000000000000000000010 @@ -22,7 +23,8 @@ enum PAGE_PTE_FLAGS { I86_PTE_FRAME = 0xFFFFF000 //1111111111111111111000000000000 }; -enum PAGE_PDE_FLAGS { +enum PAGE_PDE_FLAGS +{ I86_PDE_PRESENT = 1, //0000000000000000000000000000001 I86_PDE_WRITABLE = 2, //0000000000000000000000000000010 @@ -194,6 +196,17 @@ void vmmngr_map_page (void* phys, void* virt) } +void show_cr() +{ + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cr0: 0x%08x",x86_get_cr0()); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cr1: 0x%08x",x86_get_cr1()); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cr2: 0x%08x",x86_get_cr2()); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cr3: 0x%08x",x86_get_cr3()); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cr4: 0x%08x",x86_get_cr4()); + +} + void vmem_init(uint32_t vesa_physbase) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); @@ -213,33 +226,38 @@ void vmem_init(uint32_t vesa_physbase) if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory"); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir); - //! map 1mb to 3gb (where we are at) - for (int i=0, frame=vesa_physbase, virt=vesa_physbase; i<1024; i++, frame+=4096, virt+=4096) { - + //! 1st 4mb are idenitity mapped + for (int i=0, frame=0x0, virt=0x00000000; i<1024; i++, frame+=4096, virt+=4096) + { //! create a new page pt_entry page=0; pt_entry_add_attrib (&page, I86_PTE_PRESENT); pt_entry_set_frame (&page, frame); //! ...and add it to the page table - table1->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + table2->m_entries [PAGE_TABLE_INDEX (virt) ] = page; } - //! 1st 4mb are idenitity mapped - for (int i=0, frame=0x0, virt=0x00000000; i<1024; i++, frame+=4096, virt+=4096) + //! map 1mb to 3gb (where we are at) + + uint32_t vesa_mapped=0x1000*1024; + + for (int i=0, frame=vesa_physbase, virt=vesa_mapped; i<1024; i++, frame+=4096, virt+=4096) { //! create a new page pt_entry page=0; pt_entry_add_attrib (&page, I86_PTE_PRESENT); +// pt_entry_add_attrib (&page, I86_PTE_WRITABLE); pt_entry_set_frame (&page, frame); //! ...and add it to the page table - table2->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + table1->m_entries [PAGE_TABLE_INDEX (virt) ] = page; } + for(int i=0;i<1024;i++)dir->m_entries [i]=0; - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (vesa_physbase) ]; + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (vesa_mapped) ]; *entry=0; pd_entry_add_attrib (entry, I86_PDE_PRESENT); pd_entry_add_attrib (entry, I86_PDE_WRITABLE); @@ -252,16 +270,23 @@ void vmem_init(uint32_t vesa_physbase) pd_entry_add_attrib (entry2, I86_PDE_WRITABLE); pd_entry_set_frame (entry2, (physical_addr)table2); - - - x86_set_pdbr(dir); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging..."); + + show_cr(); + + // while(1); + + x86_paging_enable(); + x86_paging_disable(); x86_paging_enable(); + vesa_set_physbase(vesa_mapped); + + // x86_flush_tlb(0); + // x86_flush_tlb(vesa_physbase); - x86_flush_tlb(0); - x86_flush_tlb(vesa_physbase); + show_cr(); } |
