summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-08 17:08:55 +0200
committerMiguel <m.i@gmx.at>2018-09-08 17:08:55 +0200
commit9fde748acea83d775e367a64858414b674f05b13 (patch)
tree0927b570c07c9ee469817a560b965c094c5d8145 /kernel/vmem.c
parentaa4b4c6c1918a51318709761873d1c5e248a831d (diff)
struggling with pic and lapic and smp...
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c59
1 files changed, 57 insertions, 2 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 1652a9e..6d34a08 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -7,6 +7,7 @@
static uint32_t kernel_pages;
uint32_t fb_addr;
+uint32_t apic_addr;
// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS
@@ -222,7 +223,7 @@ void vmem_free_dir(pdirectory *dir)
// programm pages procreates new programmspace
//
// TODO: FIX
-// KERNEL SPACE `kernel_pages` first PAGES
+// KERNEL SPACE `kernel_pages` first 8 PAGES = 32megs
// FRAMEBUFER WE GET ON INIT
// PROGRAMM SPACE HARDCODED TO 0x8000000+2 pages and 0x8c00000+1 pages
//
@@ -244,6 +245,8 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
uint32_t phys_addr=0;
uint32_t virt_addr=0;
+ kernel_pages=8;
+
// first pages are identity mapped
for(int j=0;j<kernel_pages;j++)
{
@@ -346,6 +349,57 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
virt_addr+=1024*4096;
}
+ // 2 pages for apic ( in case on boundary??)
+ phys_addr=apic_addr;
+ virt_addr=apic_addr;
+
+ for(int j=0;j<2;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)kpanic("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;
for(int j=0;j<2;j++)
@@ -478,9 +532,10 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
return dir;
}
-pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr)
+pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr, uint32_t apic_ad)
{
fb_addr=frameb_addr;
+ apic_addr=apic_ad;
kernel_pages=kernel_blocks/1024+1;
return vmem_new_space_dir(NULL,false);
}