diff options
| author | Miguel <m.i@gmx.at> | 2018-08-23 03:20:56 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-08-23 03:20:56 +0200 |
| commit | 4404fa9b3d98646f942e32146722a9d0a68edc13 (patch) | |
| tree | 79e494ec81a462db0217fc763a7ddae1827c02bd /kernel/vmem.c | |
| parent | 98bf7b67543b36b6fe49f2b68c115ebeaf630603 (diff) | |
never ending struggle with forking
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 71 |
1 files changed, 30 insertions, 41 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index 76421d0..55b9ca3 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -7,15 +7,12 @@ #include "mem.h" #include "vmem.h" - - static uint32_t kernel_pages; static uint32_t fb_addr; // TODO : why is the frame not 0xfffff?? enum PAGE_PTE_FLAGS { - I86_PTE_PRESENT = 1, //0000000000000000000000000000001 I86_PTE_WRITABLE = 2, //0000000000000000000000000000010 I86_PTE_USER = 4, //0000000000000000000000000000100 @@ -31,7 +28,6 @@ enum PAGE_PTE_FLAGS enum PAGE_PDE_FLAGS { - I86_PDE_PRESENT = 1, //0000000000000000000000000000001 I86_PDE_WRITABLE = 2, //0000000000000000000000000000010 I86_PDE_USER = 4, //0000000000000000000000000000100 @@ -62,15 +58,12 @@ void pt_entry_del_attrib (pt_entry* e, uint32_t attrib) } void pt_entry_set_frame (pt_entry* e , physical_addr addr) { - // *e = (*e & ~I86_PTE_FRAME) | addr; - *e|=I86_PTE_FRAME&addr; - } + physical_addr pt_entry_get_frame (pt_entry* e) { return *e&I86_PTE_FRAME; - } bool pt_entry_is_present (pt_entry e) { @@ -87,93 +80,86 @@ physical_addr pt_entry_pfn (pt_entry e) return e&I86_PTE_FRAME; } -void pd_entry_add_attrib (pd_entry* e, uint32_t attrib) +void pd_entry_add_attrib (pd_entry* e, uint32_t attrib) { *e|=attrib; } -void pd_entry_del_attrib (pd_entry* e, uint32_t attrib) +void pd_entry_del_attrib (pd_entry* e, uint32_t attrib) { *e&=~attrib; } -void pd_entry_set_frame (pd_entry* e, physical_addr add) + +void pd_entry_set_frame (pd_entry* e, physical_addr add) { *e|=I86_PDE_FRAME&add; } + physical_addr pd_entry_get_frame (pd_entry* e) { return *e&I86_PDE_FRAME; - } -bool pd_entry_is_present (pd_entry e) +boolpd_entry_is_present (pd_entry e) { return e&I86_PDE_PRESENT; } + /* -bool pd_entry_is_user (pd_entry e) +bool pd_entry_is_user (pd_entry e) { return 1; } -bool pd_entry_is_4mb (pd_entry e) +bool pd_entry_is_4mb (pd_entry e) { return 1; } */ -bool pd_entry_is_writable (pd_entry e) +bool pd_entry_is_writable (pd_entry e) { return e&I86_PDE_WRITABLE; } -physical_addr pd_entry_pfn (pd_entry e) +physical_addr pd_entry_pfn (pd_entry e) { return e&I86_PDE_FRAME; } /* -void pd_entry_enable_global (pd_entry e) +void pd_entry_enable_global (pd_entry e) { } */ - uint8_t vmmngr_alloc_page (pt_entry* e) { - - //! allocate a free physical frame - void* p = pmmngr_alloc_block (); - if (!p) - return 0; - - //! map it to the page - pt_entry_set_frame (e, (physical_addr)p); - pt_entry_add_attrib (e, I86_PTE_PRESENT); - - return 1; + // allocate a free physical frame + void* p = pmmngr_alloc_block (); + if (!p) return 0; + + // map it to the page + pt_entry_set_frame (e, (physical_addr)p); + pt_entry_add_attrib (e, I86_PTE_PRESENT); + + return 1; } void vmmngr_free_page (pt_entry* e) { void* p = (void*)pt_entry_pfn (*e); - if (p) - pmmngr_free_block (p); - + if (p) pmmngr_free_block (p); pt_entry_del_attrib (e, I86_PTE_PRESENT); } pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) { - - if (p) - return &p->m_entries[ PAGE_TABLE_INDEX (addr) ]; - + if (p) return &p->m_entries[ PAGE_TABLE_INDEX (addr) ]; return 0; } - - +/// SHIT BELOW THIs LINE void vmem_free_dir(pdirectory *dir) { x86_paging_disable(); @@ -239,6 +225,7 @@ void vmem_free_dir(pdirectory *dir) // // TODO: FIX // KERNEL SPACE HARDCODED TO 5 first PAGES +// FRAMEBUFER WE GET ON INIT // PROGRAMM SPACE HARDCODED TO 0x8000000+2 pages and 0x8c00000+1 pages // @@ -389,7 +376,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) if(copy_dir!=NULL) { uint32_t addr_old=pt_entry_get_frame(&oldtable->m_entries[PAGE_TABLE_INDEX(virt)]); - klog("physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old); + //klog("physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old); memcpy(phys_addr,addr_old,4096); } @@ -448,7 +435,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) if(copy_dir!=NULL) { uint32_t addr_old=pt_entry_get_frame(&oldtable->m_entries[PAGE_TABLE_INDEX(virt)]); - klog("physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old); + //klog("physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old); memcpy(phys_addr,addr_old,4096); } @@ -495,3 +482,5 @@ pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr) kernel_pages=kernel_blocks/1024+1; return vmem_new_space_dir(NULL); } + + |
