diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-12-08 21:59:14 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-12-08 21:59:14 +0100 |
| commit | e285e7cab2fe62e91cb726c429f872b2475fdf0a (patch) | |
| tree | dfc0e78b81dc2ca9dd77641cca9be5527b2bc5de /kernel/vmem.c | |
| parent | ddba680892e4dc8973d6c1d59f92affb987ca13b (diff) | |
fixed vesa fb mode!
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 50 |
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 |
