diff options
| author | Miguel <m.i@gmx.at> | 2018-10-01 23:22:03 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-10-01 23:22:03 +0200 |
| commit | a455cd5af26bf8731e7c981a9421b16ab34dae6f (patch) | |
| tree | 140b184bf306cef258ba6e7965a78b3eecb598b9 /kernel/vmem.c | |
| parent | b518f39803eaaf0b25b95baf951b12ef4d5a727e (diff) | |
fukkin scheduler
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index a1ee0e2..d99f6fd 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -212,6 +212,53 @@ static void vmem_clear_one(pdirectory* dir,uint32_t virt) } } + +// addresses need to be page aligned. (or will be forced down) +static void vmem_del_generic(pdirectory* dir, uint32_t virt,uint32_t pages, bool dealloc, bool user) +{ + //fixme("make sure the pages are marked as used in the physical mem manager, really?"); + + //force align + virt/=4096; + virt*=4096; + + while(pages>0) + { + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt) ]; + ptable* table; + + if(*entry==0){ + // no pagetable here yet. + kpanic("no pagetable found for vmem entry to delete!"); + } + else{ + // we use the existing one. + table= pd_entry_get_frame (entry); + } + + if(dealloc) + { + uint32_t page=table->m_entries [PAGE_TABLE_INDEX (virt) ]; + uint32_t phys=pt_entry_get_frame(page); + mem_free_block(phys); // free the space + } + + //zero page + pt_entry page=0; + + //set the page table + uint32_t old=table->m_entries [PAGE_TABLE_INDEX (virt) ]; + + if(old==0)kpanic("nothing to delete in vmem at 0x%08x",virt); + + table->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + + virt+=4096; + + pages--; + } +} + // addresses need to be page aligned. (or will be forced down) static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages, bool alloc, bool user) { @@ -317,6 +364,12 @@ pdirectory* vmem_kernel_dir() return dir; } +void vmem_add_framebuffer(pdirectory *dir) +{ + vmem_del_generic(dir,VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,false, true); + vmem_add_alloc(dir, VMEM_USER_FRAMEBUFFER,VMEM_USER_FRAMEBUFFER_PAGES,true); /// each new process gets a 640x480x32 area +} + void vmem_free_space_dir(pdirectory *dir,bool stack_only) { |
