summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-11 19:49:17 +0200
committerMiguel <m.i@gmx.at>2018-09-11 19:49:17 +0200
commitc9351caacd49c8442cc586f9e53a2dcc49a004aa (patch)
tree7032ebdc1a6ff27043a3d2e81d897c2bf78731af /kernel/vmem.c
parentbd2c3fcfa2b562724667d7b83089b5ff1e2d33dc (diff)
cleaning up vmem etc..
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c143
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;
-}