diff --git a/sys/i386/sched.c b/sys/i386/sched.c index f455626..f8b09f2 100644 --- a/sys/i386/sched.c +++ b/sys/i386/sched.c @@ -151,7 +151,6 @@ asm("sti"); asm( - "lgdtl (loadGDT)\n" "ljmp $0x20,$0\n" ); } diff --git a/sys/i386/trap.c b/sys/i386/trap.c index b701d73..150144d 100644 --- a/sys/i386/trap.c +++ b/sys/i386/trap.c @@ -107,12 +107,14 @@ struct gdtDescriptor *taskLDT = (struct gdtDescriptor *)(VMM_USER_LDT + sizeof(struct gdtDescriptor)); uint32_t data_addr = 0x0; + /* data_addr += taskLDT->baseLow; data_addr += taskLDT->baseMed << 16; data_addr += taskLDT->baseHigh << 24; kprintf("LDT: 0x%X", data_addr); while (1) asm("nop"); + */ store_TR(i); kprintf("Process %s (pid: %i, process nr: %d, stackpage=%08lx)\nStack:", _current->name, _current->id, 0xffff & i, KERNEL_STACK); diff --git a/sys/kernel/gen_calls.c b/sys/kernel/gen_calls.c index f2bac53..718c95e 100644 --- a/sys/kernel/gen_calls.c +++ b/sys/kernel/gen_calls.c @@ -199,6 +199,7 @@ tmpDesc->limitHigh = (0xFFFFF >> 16); tmpDesc->granularity = ((dData + dWrite + dBig + dBiglim + dDpl3) & 0xFF) >> 4; tmpDesc->baseHigh = base_addr >> 24; +/* asm( "push %eax\n" "lgdtl (loadGDT)\n" @@ -206,6 +207,7 @@ "mov %eax,%gs\n" "pop %eax\n" ); +*/ td->td_retval[0] = 0; } else { kprintf("sysarch(%i,NULL)", args->op); diff --git a/sys/vmm/copyvirtualspace.c b/sys/vmm/copyvirtualspace.c index 6abf5cf..87f7716 100644 --- a/sys/vmm/copyvirtualspace.c +++ b/sys/vmm/copyvirtualspace.c @@ -75,7 +75,23 @@ /* Map Kernel Code Region Entries 0 & 1 */ newPageDirectory[0] = parentPageDirectory[0]; - newPageDirectory[1] = parentPageDirectory[1]; + //XXX: We Dont Need This - newPageDirectory[1] = parentPageDirectory[1]; + + if ((newPageTable = (uint32_t *) vmm_getFreeKernelPage(pid, 1)) == 0x0) + kpanic("Error: newPageTable == NULL, File: %s, Line: %i\n", __FILE__, __LINE__); + + parentPageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * 1)); + + for (x = 0;x < PT_ENTRIES;x++) + newPageTable[x] = parentPageTable[x]; + + newPageDirectory[1] = (vmm_getPhysicalAddr((uint32_t) newPageTable) | KERNEL_PAGE_DEFAULT); + + vmm_unmapPage((uint32_t) newPageTable, 1); + + newPageTable = 0x0; + + /* Map The Kernel Memory Region Entry 770 Address 0xC0800000 */ for (x = PD_INDEX(VMM_KERN_START); x <= PD_INDEX(VMM_KERN_END); x++) diff --git a/sys/vmm/createvirtualspace.c b/sys/vmm/createvirtualspace.c index 67dd68a..a7e64c7 100644 --- a/sys/vmm/createvirtualspace.c +++ b/sys/vmm/createvirtualspace.c @@ -73,7 +73,20 @@ /* Map The Lower 8MB Kernel Code Space */ newPageDirectory[0] = parentPageDirectory[0]; - newPageDirectory[1] = parentPageDirectory[1]; + //XXX: We Dont Need This - newPageDirectory[1] = parentPageDirectory[1]; + + newPageTable = (uint32_t *) vmm_getFreePage(pid); + bzero(newPageTable, PAGE_SIZE); + + parentPageTable = (uint32_t *)(PT_BASE_ADDR + (PAGE_SIZE * 1)); + + for (x = 0; x < PT_ENTRIES; x++) { + newPageTable[x] = parentPageTable[x]; + } + + newPageDirectory[1] = (vmm_getPhysicalAddr((uint32_t) newPageTable) | KERNEL_PAGE_DEFAULT); + + vmm_unmapPage((uint32_t) newPageTable, 1); /* Map The Top Kernel (APPROX 1GB) Region Of The VM Space */ for (x = PD_INDEX(VMM_KERN_START); x < PD_ENTRIES; x++) { diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index 5b0e454..64b70e3 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -81,6 +81,7 @@ kernelPageDirectory[0] = (uint32_t) ((uint32_t) (pageTable) | PAGE_DEFAULT); + /* * Map the first 1MB of Memory to the kernel MM space because our kernel starts * at 0x30000 @@ -92,6 +93,15 @@ pageTable[i] = (uint32_t) ((i * 0x1000) | KERNEL_PAGE_DEFAULT); //MrOlsen 2018-01-14 PAGE_DEFAULT } /* end for */ + /* Allocate a page for the first 4MB of memory */ + if ((pageTable = (uint32_t *) vmm_findFreePage( sysID)) == 0x0) + K_PANIC("Error: vmm_findFreePage Failed"); + + /* Make Sure The Page Table Is Clean */ + memset(pageTable, 0x0, 0x1000); + + kernelPageDirectory[1] = (uint32_t) ((uint32_t) (pageTable) | PAGE_DEFAULT); + /* * Create page tables for the top 1GB of VM space. This space is set aside * for kernel space and will be shared with each process