summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-17 22:54:48 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-17 22:54:48 +0100
commitc8032c1bf3a951cbd7aaef8b9a03b12aabd1f691 (patch)
treeedddfddc7054775bee81ac9d1e8d6d84f8477ace /kernel/vmem.c
parent9c98882150b903343afb349e74ee850bfa16b5c2 (diff)
identity paging re-enabled
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c84
1 files changed, 35 insertions, 49 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index e700da3..ceef26d 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -208,68 +208,54 @@ void show_cr()
}
-void vmem_init(uint32_t vesa_physbase)
+void vmem_init()
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase);
+ //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging");
- ptable* table1 = (ptable*) pmmngr_alloc_block ();
-
- if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table1");
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table1: 0x%X",table1);
-
- ptable* table2 = (ptable*) pmmngr_alloc_block ();
-
- if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table2");
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table2: 0x%X",table2);
-
- // TODO: 3blocks?
pdirectory* dir = (pdirectory*) pmmngr_alloc_block ();
if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory");
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir);
- //! 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_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;
- }
+ for(int i=0;i<1024;i++)dir->m_entries [i]=0;
- //uint32_t vesa_mapped=0x1000*1024;
- uint32_t vesa_mapped=vesa_physbase;
+ uint32_t phys_addr=0;
+ uint32_t virt_addr=0;
- for (int i=0, frame=vesa_physbase, virt=vesa_mapped; i<1024; i++, frame+=4096, virt+=4096)
+ // first 10 pages are identity mapped
+ for(int i=0;i<16;i++)
{
- //! 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);
+ ptable* table = (ptable*) pmmngr_alloc_block ();
- //! ...and add it to the page table
- 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_mapped) ];
- *entry=0;
- pd_entry_add_attrib (entry, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
- pd_entry_set_frame (entry, (physical_addr)table1);
+ if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table);
- pd_entry* entry2 = &dir->m_entries [PAGE_DIRECTORY_INDEX (0x00000000) ];
- *entry2=0;
- pd_entry_add_attrib (entry2, I86_PDE_PRESENT);
- pd_entry_add_attrib (entry2, I86_PDE_WRITABLE);
- pd_entry_set_frame (entry2, (physical_addr)table2);
+ //! idenitity mapping
+ for (int i=0, frame=phys_addr, virt=virt_addr; 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
+ table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
+ *entry=0;
+ pd_entry_add_attrib (entry, I86_PDE_PRESENT);
+ pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
+ pd_entry_set_frame (entry, (physical_addr)table);
+
+ phys_addr+=1024*4096;
+ virt_addr+=1024*4096;
+
+ }
+
x86_set_pdbr(dir);