summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c58
1 files changed, 50 insertions, 8 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 4faf93e..129ddb5 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -305,14 +305,46 @@ pdirectory* vmem_kernel_dir()
vmem_add_alloc(dir,VMEM_CPU_PRIVATE,4,false);
vmem_add_alloc(dir,VMEM_CPU_STACK_TOP-4096*VMEM_CPU_STACK_PAGES,VMEM_CPU_STACK_PAGES,false);
- vmem_add_alloc(dir,VMEM_USER_PROG,1024*2,true);
- vmem_add_alloc(dir,VMEM_USER_ENV,2,true);
- vmem_add_alloc(dir,VMEM_USER_NEWLIB,2,true);
+ vmem_add_alloc(dir,VMEM_USER_PROG,VMEM_USER_PROG_PAGES,true);
+ vmem_add_alloc(dir,VMEM_USER_ENV,1,true);
+ vmem_add_alloc(dir,VMEM_USER_NEWLIB,1,true);
vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*VMEM_USER_STACK_PAGES,VMEM_USER_STACK_PAGES,true);
return dir;
}
+void vmem_free_space_dir(pdirectory *dir,bool stack_only)
+{
+ fixme("free kmalloc too!");
+ fixme("stack_only version too!");
+
+ //free user pages
+ uint32_t virt=0;
+ for(int i=0;i<1024;i++)
+ {
+ uint32_t src_pt=dir->m_entries [i];
+
+ if(pt_entry_is_user(src_pt))
+ {
+ ptable *src_table=pt_entry_get_frame(&src_pt);
+
+ for(int j=0;j<1024;j++)
+ {
+ uint32_t src_pd=src_table->m_entries[j];
+ uint32_t src_phys=pd_entry_get_frame(&src_pd);
+
+ if(src_pd)
+ {
+ mem_free_block(src_phys);
+ }
+ virt+=4096;
+ }
+ }
+ else virt+=4096*1024;
+ }
+
+}
+
pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
{
pdirectory* dir = vmem_clean_dir(); //let's start with a fresh page directory
@@ -324,14 +356,25 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
if(!pt_entry_is_user(src_pt))dir->m_entries [i]=src_pt;
}
- vmem_add_alloc(dir,VMEM_USER_PROG,1024*4,true);
- vmem_add_alloc(dir,VMEM_USER_ENV,2,true);
- vmem_add_alloc(dir,VMEM_USER_NEWLIB,2,true);
+ // threads share this //
+ if(stack_only)
+ {
+ // TODO
+ kpanic("not impl!");
+ }
+ else
+ {
+ vmem_add_alloc(dir,VMEM_USER_PROG,VMEM_USER_PROG_PAGES,true);
+ vmem_add_alloc(dir,VMEM_USER_ENV,1,true);
+ }
+
+ // threads need own //
+ vmem_add_alloc(dir,VMEM_USER_NEWLIB,1,true);
vmem_add_alloc(dir,VMEM_USER_STACK_TOP-4096*VMEM_USER_STACK_PAGES,VMEM_USER_STACK_PAGES,true);
pdirectory* mydir=x86_get_page_directory();
- //copy user pages (TODO: stack only version for cloning!)
+ //copy user pages
uint32_t virt=0;
for(int i=0;i<1024;i++)
{
@@ -383,6 +426,5 @@ void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi)
multiboot_mod *mod=(multiboot_mod *)cfg_multiboot->mods_addr;
mod_start=mod->mod_start;
mod_end=mod->mod_end;
-
}