summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-08-23 03:20:56 +0200
committerMiguel <m.i@gmx.at>2018-08-23 03:20:56 +0200
commit4404fa9b3d98646f942e32146722a9d0a68edc13 (patch)
tree79e494ec81a462db0217fc763a7ddae1827c02bd /kernel/vmem.c
parent98bf7b67543b36b6fe49f2b68c115ebeaf630603 (diff)
never ending struggle with forking
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c71
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);
}
+
+