diff options
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 58 |
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; - } |
