summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-09 03:17:52 +0200
committerMiguel <m.i@gmx.at>2018-09-09 03:17:52 +0200
commitfc1d491479abd74a1e038ad9ff7d4d330d79e4a8 (patch)
tree173bc4bca336fbc8a53c9bbd3468946499e161ae /kernel/vmem.c
parent9dabe01545644dd78448d8d489616872f14d964b (diff)
ioapic works!
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 6d34a08..0dd896c 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -8,6 +8,7 @@
static uint32_t kernel_pages;
uint32_t fb_addr;
uint32_t apic_addr;
+uint32_t io_apic_addr;
// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS
@@ -400,6 +401,57 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
phys_addr+=1024*4096;
virt_addr+=1024*4096;
}
+ // 2 pages for ioapic ( in case on boundary??)
+ phys_addr=io_apic_addr;
+ virt_addr=io_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++)
@@ -532,10 +584,11 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
return dir;
}
-pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr, uint32_t apic_ad)
+pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr, uint32_t apic_ad, uint32_t ioapic_ad)
{
fb_addr=frameb_addr;
apic_addr=apic_ad;
+ io_apic_addr=ioapic_ad;
kernel_pages=kernel_blocks/1024+1;
return vmem_new_space_dir(NULL,false);
}