summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-08-19 03:15:50 +0200
committerMiguel <m.i@gmx.at>2018-08-19 03:15:50 +0200
commit9b13ca03dacb6a385461dccad319010537add5cf (patch)
tree4397fdff0d1566b7bec761031ce2077e88cd5379 /kernel/vmem.c
parenta2bd733e517364b6c9ddd26706d85fac09656854 (diff)
get vesa working in vmem.
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c55
1 files changed, 54 insertions, 1 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index f49689f..3d3456b 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -10,6 +10,7 @@
#define FOOLOS_MODULE_NAME "vmem"
static uint32_t kernel_pages;
+static uint32_t fb_addr;
// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS
@@ -305,6 +306,57 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
virt_addr+=1024*4096;
}
+ // FRAMEBUFFER IDENTITY MAP (4pages enought? )
+ phys_addr=fb_addr;
+ virt_addr=fb_addr;
+
+ for(int j=0;j<4;j++)
+ {
+
+ // this is the table for our page directory. It maps 1024*4096 bytes
+ ptable* table;
+
+ // create new tables on init
+ if(copy_dir==NULL)
+ {
+ // alloc space for our new table
+ table = (ptable*) kballoc(1);
+ if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
+
+ //! idenitity mapping
+ for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096)
+ {
+ //! create a new page
+ pt_entry page=0;
+ pt_entry_add_attrib (&page, I86_PTE_PRESENT);
+ pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
+ pt_entry_add_attrib (&page, I86_PTE_USER);
+ pt_entry_set_frame (&page, frame);
+
+ //! ...and add it to the page table
+ table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
+ *entry=0;
+ pd_entry_add_attrib (entry, I86_PDE_PRESENT);
+ pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
+ pt_entry_add_attrib (entry, I86_PTE_USER);
+ pd_entry_set_frame (entry, (physical_addr)table);
+
+ }
+
+ // otherwise simply take existing stuff from pdir 0
+ else
+ {
+ dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
+ copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
+
+ }
+
+ phys_addr+=1024*4096;
+ virt_addr+=1024*4096;
+ }
// programm space
virt_addr=0x8000000;
@@ -442,8 +494,9 @@ void vmem_set_dir(pdirectory *dir)
x86_set_pdbr(dir);
}
-pdirectory* vmem_init(uint32_t kernel_blocks)
+pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr)
{
+ fb_addr=frameb_addr;
kernel_pages=kernel_blocks/1024+1;
return vmem_new_space_dir(NULL);
}