From 9fde748acea83d775e367a64858414b674f05b13 Mon Sep 17 00:00:00 2001 From: Miguel Date: Sat, 8 Sep 2018 17:08:55 +0200 Subject: struggling with pic and lapic and smp... --- kernel/vmem.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'kernel/vmem.c') 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;jm_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); } -- cgit v1.2.3