summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-12-08 21:59:14 +0100
committerMichal Idziorek <m.i@gmx.at>2014-12-08 21:59:14 +0100
commite285e7cab2fe62e91cb726c429f872b2475fdf0a (patch)
treedfc0e78b81dc2ca9dd77641cca9be5527b2bc5de /kernel/vmem.c
parentddba680892e4dc8973d6c1d59f92affb987ca13b (diff)
fixed vesa fb mode!
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index a909b1a..24a2f92 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -248,7 +248,55 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
uint32_t virt_addr=0;
// first pages are identity mapped
- for(int j=0;j<3;j++)
+ for(int j=0;j<5;j++)
+ {
+
+ // this is the table for our page directory. It maps 1024*4096 bytes
+ ptable* table;
+
+ // create new tables on init
+ if(copy_dir==NULL)
+ {
+ // alloc space for our new table
+ table = (ptable*) pmmngr_alloc_block ();
+ if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
+
+ //! 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);
+
+ }
+ // otherwise simply take existing stuff from pdir 0
+ else
+ {
+ dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
+ copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
+
+ }
+
+ phys_addr+=1024*4096;
+ virt_addr+=1024*4096;
+ }
+
+ phys_addr=0xFc000000;
+ virt_addr=0xFc000000;
+ // vesa
+ for(int j=0;j<5;j++)
{
// this is the table for our page directory. It maps 1024*4096 bytes