summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c55
1 files changed, 34 insertions, 21 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 0c751b8..4af596d 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -299,7 +299,8 @@ pdirectory* vmem_kernel_dir()
vmem_add_identity(dir,0,1024*8,false);//identity map first 32 megs...
vmem_add_identity(dir,e1000_addr,32,false);//identity map 32 pages for e1000
- vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,1024*8,false);//32megs should be enough for 4k (think about pitch)
+ vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,true);//32megs should be enough for 4k (think about pitch)
+
vmem_add_remap(dir,local_apic_addr,VMEM_LAPIC,1,false); //apic addr should be at pagestart, right? TODO: check.
vmem_add_remap(dir,io_apic_addr,VMEM_IOAPIC,1,false);
vmem_add_remap(dir,mod_start,VMEM_EXT2_RAMIMAGE,1024*8,false);//32megs for ramimage: TODO: check if enough?
@@ -321,6 +322,8 @@ void vmem_free_space_dir(pdirectory *dir,bool stack_only)
fixme("stack_only version too!");
klog("free page directory at: 0x%X",dir);
+ if(stack_only)kpanic("not implemented yet!");
+
//free user pages
uint32_t virt=0;
for(int i=0;i<1024;i++)
@@ -333,6 +336,7 @@ void vmem_free_space_dir(pdirectory *dir,bool stack_only)
for(int j=0;j<1024;j++)
{
+ if(virt>=VMEM_FRAMEBUFFER&&virt<VMEM_FRAMEBUFFER+VMEM_FRAMEBUFFER_PAGES*4096)continue; // skip framebuffer pls
uint32_t src_pd=src_table->m_entries[j];
uint32_t src_phys=pd_entry_get_frame(&src_pd);
@@ -340,6 +344,7 @@ void vmem_free_space_dir(pdirectory *dir,bool stack_only)
{
mem_free_block(src_phys);
}
+
virt+=4096;
}
}
@@ -360,13 +365,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
if(!pt_entry_is_user(src_pt))dir->m_entries [i]=src_pt;
}
- // threads share this //
- if(stack_only)
- {
- // TODO
- kpanic("not impl!");
- }
- else
+ if(!stack_only)
{
vmem_add_alloc(dir,VMEM_USER_PROG,VMEM_USER_PROG_PAGES,true);
vmem_add_alloc(dir,VMEM_USER_ENV,1,true);
@@ -392,6 +391,8 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
for(int j=0;j<1024;j++)
{
+ if(virt>=VMEM_FRAMEBUFFER&&virt<VMEM_FRAMEBUFFER+VMEM_FRAMEBUFFER_PAGES*4096)continue; // skip framebuffer pls
+
uint32_t src_pd=src_table->m_entries[j];
uint32_t dst_pd=dst_table->m_entries[j];
@@ -400,24 +401,36 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
if(src_pd)
{
- //klog("copy virt: %x / phys: %x -> %x",virt,src_phys,dst_phys);
-
- vmem_clear_one(mydir,VMEM_COPY_PAGE);
- vmem_clear_one(mydir,VMEM_COPY_PAGE+4096);
-
- vmem_add_remap(mydir,src_phys,VMEM_COPY_PAGE,1,false);
- vmem_add_remap(mydir,dst_phys,VMEM_COPY_PAGE+4096,1,false);
-
- x86_invlpg(VMEM_COPY_PAGE); // refresh TLB
- x86_invlpg(VMEM_COPY_PAGE+4096); // refresh TLB
-
- memcpy(VMEM_COPY_PAGE+4096,VMEM_COPY_PAGE,4096);
- }
+ if(stack_only&&(virt==VMEM_USER_ENV||(virt>=VMEM_USER_PROG&&virt<VMEM_USER_PROG+VMEM_USER_PROG_PAGES*4096)))
+ {
+ // threads share this //
+ vmem_add_remap(dir,src_phys,virt,1,true);
+ }
+ else
+ {
+
+ //klog("copy virt: %x / phys: %x -> %x",virt,src_phys,dst_phys);
+
+ vmem_clear_one(mydir,VMEM_COPY_PAGE);
+ vmem_clear_one(mydir,VMEM_COPY_PAGE+4096);
+
+ vmem_add_remap(mydir,src_phys,VMEM_COPY_PAGE,1,false);
+ vmem_add_remap(mydir,dst_phys,VMEM_COPY_PAGE+4096,1,false);
+
+ x86_invlpg(VMEM_COPY_PAGE); // refresh TLB
+ x86_invlpg(VMEM_COPY_PAGE+4096); // refresh TLB
+
+ memcpy(VMEM_COPY_PAGE+4096,VMEM_COPY_PAGE,4096);
+ }
+ }
virt+=4096;
}
}
else virt+=4096*1024;
}
+
+ vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,VMEM_FRAMEBUFFER_PAGES,true);//32megs should be enough for 4k (think about pitch)
+
return dir;
}