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