diff options
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 143 |
1 files changed, 78 insertions, 65 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index 3cbda9a..3da35ce 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -45,6 +45,8 @@ static uint32_t kernel_pages; static uint32_t fb_addr; static uint32_t local_apic_addr; static uint32_t io_apic_addr; +static uint32_t mod_start; +static uint32_t mod_end; // TODO : why is the frame not 0xfffff?? enum PAGE_PTE_FLAGS @@ -195,61 +197,6 @@ static pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) return 0; } -/// SHIT BELOW THIs LINE -void vmem_free_dir(pdirectory *dir) -{ - x86_paging_disable(); //TODO : do not disable this! - - uint32_t virt_addr=0; - - // first pages are identity mapped (kernel space) just remove links - for(int j=0;j<3;j++) - { - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; - virt_addr+=1024*4096; - } - - // programm space - virt_addr=0x8000000; - for(int j=0;j<2;j++) - { - - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; - ptable *table=pd_entry_get_frame(entry); - - for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) - { - pt_entry pte=&table->m_entries [PAGE_TABLE_INDEX (virt) ]; - mem_free_block(pt_entry_get_frame(pte)); // get free space from the memory manager - } - - mem_free_block(pd_entry_get_frame (entry)); - virt_addr+=1024*4096; - - } - - // stack - virt_addr=0x8c00000; - for(int j=0;j<1;j++) - { - - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; - ptable *table=pd_entry_get_frame(entry); - - for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) - { - pt_entry pte=&table->m_entries [PAGE_TABLE_INDEX (virt) ]; - mem_free_block(pt_entry_get_frame(pte)); // get free space from the memory manager - } - - mem_free_block(pd_entry_get_frame (entry)); - virt_addr+=1024*4096; - - } - mem_free_block(dir); - - x86_paging_enable(); -} static pdirectory* vmem_clean_dir() { @@ -308,7 +255,7 @@ static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_ //and add it to the page table uint32_t old=table->m_entries [PAGE_TABLE_INDEX (virt) ]; - if(old!=0&&old!=page)kpanic("overwriting existing page data!"); + if(old!=0&&old!=page)kpanic("overwriting existing page data! virt=0x%08X phys=0x%08X",virt,phys); table->m_entries [PAGE_TABLE_INDEX (virt) ] = page; virt+=4096; @@ -337,7 +284,8 @@ pdirectory* vmem_kernel_dir() fixme("do not waste soo many pages/page tables!"); fixme("align properly!! / merge page tables if required!"); fixme("Is ioapic/lapic really on one page?"); - fixme("kernelspace: kernel/lapic/framebuffer/ext2-ramimage"); + fixme("kernelspace: kernel/lapic/ioapic/framebuffer/ext2-ramimage/stack/cpu private"); + fixme("check ext2 and kernel and framebufffer do not exceen the 32megs)"); pdirectory* dir = vmem_clean_dir(); @@ -346,12 +294,84 @@ pdirectory* vmem_kernel_dir() vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,1024*8);//32megs should be enough for 4k (think about pitch) vmem_add_remap(dir,local_apic_addr,VMEM_LAPIC,1); //apic addr should be at pagestart, right? TODO: check. vmem_add_remap(dir,io_apic_addr,VMEM_IOAPIC,1); + vmem_add_remap(dir,mod_start,VMEM_EXT2_RAMIMAGE,1024*8);//32megs for ramimage: TODO: check if enough? + + vmem_add_alloc(dir,VMEM_CPU_PRIVATE,4); - vmem_add_alloc(dir,VMEM_CPU_PRIVATE,2); + vmem_add_alloc(dir,VMEM_CPU_STACK_TOP-4096*4,4); return dir; } +void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi) +{ + fixme("do not share fb_addr with syscalls like that!"); + fb_addr=cfg_multiboot->framebuffer_addr; + local_apic_addr=cfg_acpi->local_apic_address; + io_apic_addr=cfg_acpi->io_apic_address; + multiboot_mod *mod=(multiboot_mod *)cfg_multiboot->mods_addr; + mod_start=mod->mod_start; + mod_end=mod->mod_end; + +} + +/////////////////////////////////////////////////////////////////////// + +/// SHIT BELOW THIs LINE +void vmem_free_dir(pdirectory *dir) +{ + x86_paging_disable(); //TODO : do not disable this! + + uint32_t virt_addr=0; + + // first pages are identity mapped (kernel space) just remove links + for(int j=0;j<3;j++) + { + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; + virt_addr+=1024*4096; + } + + // programm space + virt_addr=0x8000000; + for(int j=0;j<2;j++) + { + + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; + ptable *table=pd_entry_get_frame(entry); + + for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) + { + pt_entry pte=&table->m_entries [PAGE_TABLE_INDEX (virt) ]; + mem_free_block(pt_entry_get_frame(pte)); // get free space from the memory manager + } + + mem_free_block(pd_entry_get_frame (entry)); + virt_addr+=1024*4096; + + } + + // stack + virt_addr=0x8c00000; + for(int j=0;j<1;j++) + { + + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; + ptable *table=pd_entry_get_frame(entry); + + for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) + { + pt_entry pte=&table->m_entries [PAGE_TABLE_INDEX (virt) ]; + mem_free_block(pt_entry_get_frame(pte)); // get free space from the memory manager + } + + mem_free_block(pd_entry_get_frame (entry)); + virt_addr+=1024*4096; + + } + mem_free_block(dir); + + x86_paging_enable(); +} // // vmem init / also copies all the shit over for FORK // if copy_dir==NULL creates brandnew dir @@ -711,10 +731,3 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) return dir; } -void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi) -{ - fixme("do not share fb_addr with syscalls like that!"); - fb_addr=cfg_multiboot->framebuffer_addr; - local_apic_addr=cfg_acpi->local_apic_address; - io_apic_addr=cfg_acpi->io_apic_address; -} |
