summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c55
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();
}