diff --git a/bin/init/main.c b/bin/init/main.c index 2c783eb..25e02ba 100644 --- a/bin/init/main.c +++ b/bin/init/main.c @@ -84,10 +84,12 @@ sched_yield(); } */ + startup: + printf("FORKING!"); i = fork(); - printf("FORKED: %i!\n", i); + printf("FORKED: %i!\n", i); if (0 == i) { printf("Starting Login Daemon.\n"); diff --git a/sys/i386/fork.c b/sys/i386/fork.c index ece4534..990fe3f 100644 --- a/sys/i386/fork.c +++ b/sys/i386/fork.c @@ -94,10 +94,10 @@ newProcess->td.vm_dsize = _current->td.vm_dsize; newProcess->td.vm_daddr = _current->td.vm_daddr; - //kprintf("Copying Mem Space! [0x%X:0x%X:0x%X:0x%X:0x%X:%i:%i]\n", newProcess->tss.esp0, newProcess->tss.esp, newProcess->tss.ebp, td->frame->tf_esi, td->frame->tf_eip, newProcess->id, _current->id); + kprintf("Copying Mem Space! [0x%X:0x%X:0x%X:0x%X:0x%X:%i:%i]\n", newProcess->tss.esp0, newProcess->tss.esp, newProcess->tss.ebp, td->frame->tf_esi, td->frame->tf_eip, newProcess->id, _current->id); newProcess->tss.cr3 = (uInt32) vmm_copyVirtualSpace(newProcess->id); - //kprintf( "Copied Mem Space!\n" ); + kprintf( "Copied Mem Space!\n" ); newProcess->state = FORK; /* Fix gcc optimization problems */ diff --git a/sys/i386/i386_exec.c b/sys/i386/i386_exec.c index c6b260d..061a434 100644 --- a/sys/i386/i386_exec.c +++ b/sys/i386/i386_exec.c @@ -200,6 +200,11 @@ newProcess->files[0] = 0x0; + /* Build LDT For GS and FS */ + if (vmm_remapPage(vmm_findFreePage(newProcess->id), VMM_USER_START, PAGE_DEFAULT, newProcess->id, 0) == 0x0) { + K_PANIC("Error: Remap Page Failed"); + } + /* Set up default stack for thread here filled with arg list 3 times */ asm volatile( "pusha \n" @@ -341,7 +346,7 @@ */ for (x = 0x0; x < (programHeader[i].p_memsz); x += 0x1000) { /* Make readonly and read/write !!! */ - if (vmm_remapPage(vmm_findFreePage(newProcess->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x), PAGE_DEFAULT, newProcess->id) == 0x0) + if (vmm_remapPage(vmm_findFreePage(newProcess->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x), PAGE_DEFAULT, newProcess->id, 0) == 0x0) K_PANIC("Remap Page Failed"); memset((void *) ((programHeader[i].p_vaddr & 0xFFFFF000) + x), 0x0, 0x1000); @@ -370,7 +375,7 @@ //MrOlsen (2016-01-14) FIX: is the stack start supposed to be addressable xhcnage x= 1 to x=0 //x = 0 because GS= stack address not address -1 fix! for (x = 1; x <= 100; x++) { - vmm_remapPage(vmm_findFreePage(newProcess->id), (STACK_ADDR+1) - (x * 0x1000), PAGE_DEFAULT | PAGE_STACK, newProcess->id); + vmm_remapPage(vmm_findFreePage(newProcess->id), (STACK_ADDR+1) - (x * 0x1000), PAGE_DEFAULT | PAGE_STACK, newProcess->id, 0); bzero((STACK_ADDR+1) - (x * 0x1000), 0x1000); } @@ -380,7 +385,7 @@ //vmm_remapPage(vmm_findFreePage(newProcess->id), 0x5BB000, KERNEL_PAGE_DEFAULT | PAGE_STACK, newProcess->id); /* for (x = 0; x < 2; x++) - vmm_remapPage(vmm_findFreePage(newProcess->id), 0xFFFFF000 - (PAGE_SIZE * x), KERNEL_PAGE_DEFAULT | PAGE_STACK, newProcess->id); + vmm_remapPage(vmm_findFreePage(newProcess->id), 0xFFFFF000 - (PAGE_SIZE * x), KERNEL_PAGE_DEFAULT | PAGE_STACK, newProcess->id, 0); */ /* Set All The Proper Information For The Task */ @@ -447,15 +452,15 @@ tmp[i + x] = 0x0; /* Build LDT For GS and FS */ - if (vmm_remapPage(vmm_findFreePage(newProcess->id), 0x400000, PAGE_DEFAULT, newProcess->id) == 0x0) { + if (vmm_remapPage(vmm_findFreePage(newProcess->id), VMM_USER_START, PAGE_DEFAULT, newProcess->id, 0) == 0x0) { K_PANIC("Error: Remap Page Failed"); } - struct gdtDescriptor *taskLDT = 0x400000; + struct gdtDescriptor *taskLDT = VMM_USER_START; struct gdtDescriptor *tmpDesc = 0x0; - tmpDesc = 0x400000 + sizeof(struct gdtDescriptor);//taskLDT[1]; + tmpDesc = VMM_USER_START + sizeof(struct gdtDescriptor);//taskLDT[1]; uint32_t data_addr = 0x0; tmpDesc->limitLow = (0xFFFFF & 0xFFFF); @@ -551,10 +556,15 @@ //! Clean the virtual of COW pages left over from the fork //vmm_cleanVirtualSpace( (uint32_t) _current->td.vm_daddr + (_current->td.vm_dsize << PAGE_SHIFT) ); //MrOlsen 2017-12-15 - FIX! - This should be done before it was causing a lot of problems why did I free space after loading binary???? - vmm_cleanVirtualSpace((uint32_t) 0x8048000); + //vmm_cleanVirtualSpace((uint32_t) 0x8048000); + vmm_cleanVirtualSpace((uint32_t) VMM_USER_START); /* Clear Stack */ - bzero(STACK_ADDR - (100 * PAGE_SIZE), (PAGE_SIZE * 100)); + //bzero(STACK_ADDR - (100 * PAGE_SIZE), (PAGE_SIZE * 100)); + for (x = 1; x <= 100; x++) { + vmm_remapPage(vmm_findFreePage(_current->id), (STACK_ADDR+1) - (x * 0x1000), PAGE_DEFAULT | PAGE_STACK, _current->id, 0); + bzero((STACK_ADDR+1) - (x * 0x1000), 0x1000); + } /* Load ELF Header */ if ((binaryHeader = (Elf_Ehdr *) kmalloc(sizeof(Elf_Ehdr))) == 0x0) @@ -624,7 +634,7 @@ */ for (x = 0x0; x < (round_page(programHeader[i].p_memsz)); x += 0x1000) { /* Make readonly and read/write !!! */ - if (vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x), PAGE_DEFAULT, _current->id) == 0x0) { + if (vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x), PAGE_DEFAULT, _current->id, 0) == 0x0) { K_PANIC("Error: Remap Page Failed"); } else { @@ -859,15 +869,15 @@ */ /* Build LDT For GS and FS */ - if (vmm_remapPage(vmm_findFreePage(_current->id), 0x400000, PAGE_DEFAULT, _current->id) == 0x0) { + if (vmm_remapPage(vmm_findFreePage(_current->id), VMM_USER_START, PAGE_DEFAULT, _current->id, 0) == 0x0) { K_PANIC("Error: Remap Page Failed"); } - struct gdtDescriptor *taskLDT = 0x400000; + struct gdtDescriptor *taskLDT = VMM_USER_START; struct gdtDescriptor *tmpDesc = 0x0; - tmpDesc = 0x400000 + sizeof(struct gdtDescriptor);//taskLDT[1]; + tmpDesc = VMM_USER_START + sizeof(struct gdtDescriptor);//taskLDT[1]; tmpDesc->limitLow = (0xFFFFF & 0xFFFF); tmpDesc->baseLow = (data_addr & 0xFFFF); @@ -880,6 +890,8 @@ _current->tss.gs = 0xF; //Select 0x8 + Ring 3 + LDT _current->pgrp = _current->id; + kprintf("DONE YET?"); + return (0x0); } diff --git a/sys/i386/sched.c b/sys/i386/sched.c index 9da2ca2..68db655 100644 --- a/sys/i386/sched.c +++ b/sys/i386/sched.c @@ -89,7 +89,7 @@ if (spinTryLock(&schedulerSpinLock)) return; - tmpTask = _current->next; + tmpTask = ((_current == 0) ? 0 : _current->next); //outportByte(0xE9,_current->id + '0'); schedStart: diff --git a/sys/i386/trap.c b/sys/i386/trap.c index 785b559..1a2d4d2 100644 --- a/sys/i386/trap.c +++ b/sys/i386/trap.c @@ -128,18 +128,20 @@ trap_code = frame->tf_trapno; + cr2 = rcr2(); + kprintf("CR2: 0x%X", cr2); + if ((frame->tf_eflags & PSL_I) == 0) { if (SEL_GET_PL(frame->tf_cs) == SEL_PL_USER || (frame->tf_eflags & PSL_VM)) { die_if_kernel("TEST", frame, 0x100); // kpanic( "INT OFF! USER" ); } else { - die_if_kernel("TEST", frame, 0x100); + die_if_kernel("TEST", frame, 0x200); // kpanic( "INT OFF! KERN[0x%X]", trap_code ); } } - cr2 = rcr2(); kprintf("trap_code: %i(0x%X), EIP: 0x%X, CR2: 0x%X\n", frame->tf_trapno, frame->tf_trapno, frame->tf_eip, cr2); if (frame->tf_trapno == 0xc) { vmm_pageFault(frame, cr2); diff --git a/sys/include/vmm/paging.h b/sys/include/vmm/paging.h index 61f9a28..009c6be 100644 --- a/sys/include/vmm/paging.h +++ b/sys/include/vmm/paging.h @@ -88,7 +88,7 @@ uint32_t vmm_getPhysicalAddr(uint32_t); uint32_t vmm_getRealAddr(uint32_t); int vmm_setPageAttributes(uint32_t, uint16_t); -int vmm_remapPage(uint32_t, uint32_t, uint16_t, pidType); +int vmm_remapPage(uint32_t, uint32_t, uint16_t, pidType, int haveLock); int vmm_pagingInit(); void *vmm_getFreeMallocPage(uint16_t count); //void vmm_pageFault( uint32_t, uint32_t, uint32_t ); diff --git a/sys/include/vmm/vmm.h b/sys/include/vmm/vmm.h index 40d2a15..021d179 100644 --- a/sys/include/vmm/vmm.h +++ b/sys/include/vmm/vmm.h @@ -50,7 +50,7 @@ #define VMM_MMAP_ADDR_PMODE VMM_KERN_START /* (PD_BASE_ADDR + PAGE_SIZE) */ #define VMM_MMAP_ADDR_RMODE 0x101000 -#define VMM_KERN_START 0xC0800000 +#define VMM_KERN_START 0xC0800000 //TMP ADDED 1000 #define VMM_KERN_END 0xFDFFFFFF #define VMM_KERN_STACK_START 0xFE000000 diff --git a/sys/init/main.c b/sys/init/main.c index d103497..272f101 100644 --- a/sys/init/main.c +++ b/sys/init/main.c @@ -79,7 +79,7 @@ { .dummy = 0}, ubixStandardDescriptor(0x0000, 0xFFFFF, (dCode + dRead + dBig + dBiglim)), ubixStandardDescriptor(0x0000, 0xFFFFF, (dData + dWrite + dBig + dBiglim)), -ubixStandardDescriptor(0x400000, 0xFFFFF, (dLdt)), +ubixStandardDescriptor(VMM_USER_START, 0xFFFFF, (dLdt)), ubixStandardDescriptor(0x4200, (sizeof(struct tssStruct)), (dTss + dDpl3)), ubixStandardDescriptor(0x0000, 0xFFFFF, (dCode + dRead + dBig + dBiglim + dDpl3)), ubixStandardDescriptor(0x0000, 0xFFFFF, (dData + dWrite + dBig + dBiglim + dDpl3)), diff --git a/sys/kernel/elf.c b/sys/kernel/elf.c index 3eb6160..506de0d 100644 --- a/sys/kernel/elf.c +++ b/sys/kernel/elf.c @@ -93,7 +93,7 @@ for (x = 0x0; x < (programHeader[i].p_memsz + 0xFFF); x += 0x1000) { /* Make readonly and read/write */ - if (vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x + real_base_addr), PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x + real_base_addr), PAGE_DEFAULT, _current->id, 0x0) == 0x0) K_PANIC("Error: Remap Page Failed"); memset((void *) ((programHeader[i].p_vaddr & 0xFFFFF000) + x + real_base_addr), 0x0, 0x1000); diff --git a/sys/kernel/ld.c b/sys/kernel/ld.c index b839cf5..2d51c43 100644 --- a/sys/kernel/ld.c +++ b/sys/kernel/ld.c @@ -93,7 +93,7 @@ */ for (x = 0; x < (programHeader[i].p_memsz); x += 0x1000) { /* make r/w or ro */ - if ((vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x + LD_START), PAGE_DEFAULT, _current->id)) == 0x0) + if ((vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x + LD_START), PAGE_DEFAULT, _current->id, 0)) == 0x0) K_PANIC("vmmRemapPage: ld"); memset((void *) ((programHeader[i].p_vaddr & 0xFFFFF000) + x + LD_START), 0x0, 0x1000); } diff --git a/sys/vmm/Makefile b/sys/vmm/Makefile index ba7f146..0bb2326 100644 --- a/sys/vmm/Makefile +++ b/sys/vmm/Makefile @@ -6,7 +6,7 @@ include ../Makefile.incl # Objects -OBJS = vmm_allocpagedir.o page_fault.o pagefault.o getfreevirtualpage.o copyvirtualspace.o setpageattributes.o unmappage.o getphysicaladdr.o getfreepage.o createvirtualspace.o vmm_memory.o paging.o vmm_init.o vmm_mmap.o freevirtualpage.o +OBJS = vmm_allocpagetable.o page_fault.o pagefault.o getfreevirtualpage.o copyvirtualspace.o setpageattributes.o unmappage.o getphysicaladdr.o getfreepage.o createvirtualspace.o vmm_memory.o paging.o vmm_init.o vmm_mmap.o freevirtualpage.o all: $(OBJS) diff --git a/sys/vmm/copyvirtualspace.c b/sys/vmm/copyvirtualspace.c index 9607090..9d509c5 100644 --- a/sys/vmm/copyvirtualspace.c +++ b/sys/vmm/copyvirtualspace.c @@ -57,6 +57,7 @@ uint32_t *parentStackPage = 0x0, *newStackPage = 0x0; uint16_t x = 0, i = 0, s = 0; + spinLock(&cvsSpinLock); /* Set Address Of Parent Page Directory */ diff --git a/sys/vmm/getfreepage.c b/sys/vmm/getfreepage.c index ce2f57a..f0ca123 100644 --- a/sys/vmm/getfreepage.c +++ b/sys/vmm/getfreepage.c @@ -61,7 +61,7 @@ if ((uInt32) pageTableSrc[y] == (uInt32) 0x0) { /* Map A Physical Page To The Virtual Page */ - if ((vmm_remapPage(vmm_findFreePage(pid), ((x * 0x400000) + (y * 0x1000)), KERNEL_PAGE_DEFAULT, pid)) == 0x0) + if ((vmm_remapPage(vmm_findFreePage(pid), ((x * 0x400000) + (y * 0x1000)), KERNEL_PAGE_DEFAULT, pid, 0)) == 0x0) kpanic("vmmRemapPage: vmm_getFreePage\n"); /* Clear This Page So No Garbage Is There */ diff --git a/sys/vmm/getfreevirtualpage.c b/sys/vmm/getfreevirtualpage.c index 4353d7b..6a30bbf 100644 --- a/sys/vmm/getfreevirtualpage.c +++ b/sys/vmm/getfreevirtualpage.c @@ -117,7 +117,7 @@ } else if ((uint32_t) pageTable[y] == (uint32_t) 0x0) { - if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (y * PAGE_SIZE)), PAGE_DEFAULT, pid)) == 0x0) + if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (y * PAGE_SIZE)), PAGE_DEFAULT, pid, 0)) == 0x0) kpanic("vmmRemapPage: getFreeVirtualPage-1: (%i)[0x%X]\n", type, ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (y * PAGE_SIZE))); vmm_clearVirtualPage((uInt32) ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (y * PAGE_SIZE))); diff --git a/sys/vmm/pagefault.c b/sys/vmm/pagefault.c index 6dba711..d2c5620 100644 --- a/sys/vmm/pagefault.c +++ b/sys/vmm/pagefault.c @@ -114,6 +114,7 @@ kprintf("pageDir: [0x%X]\n", pageDir[pageDirectoryIndex]); kprintf("pageTable: [0x%X:0x%X:0x%X:0x%X]\n", pageTable[pageTableIndex], pageTableIndex, pageDirectoryIndex, eip); kprintf("Segfault At Address: [0x%X][0x%X][%i][0x%X] Non Mapped\n", memAddr, esp, _current->id, eip); + kpanic("SIT HERE FOR NOW"); spinUnlock(&pageFaultSpinLock); endTask(_current->id); } @@ -127,6 +128,7 @@ kprintf("pageDir: [0x%X]\n", pageDir[pageDirectoryIndex]); kprintf("pageTable: [0x%X:0x%X:0x%X:0x%X]\n", pageTable[pageTableIndex], pageTableIndex, pageDirectoryIndex, eip); kprintf("Segfault At Address: [0x%X][0x%X][%i][0x%X] Non Mapped\n", memAddr, esp, _current->id, eip); + kpanic("SIT HERE FOR NOW"); kprintf("Out Of Stack Space: [0x%X]\n", memAddr & 0xFF0000); spinUnlock(&pageFaultSpinLock); endTask(_current->id); diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index 7ca7657..3e0f762 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -36,6 +36,7 @@ #include #include #include +#include uint32_t *kernelPageDirectory = 0x0; // Pointer To Kernel Page Directory @@ -171,7 +172,7 @@ /* Remap The Memory List */ for (i = 0x101000; i <= (0x101000 + (numPages * sizeof(mMap))); i += 0x1000) { - if ((vmm_remapPage(i, (VMM_MMAP_ADDR_PMODE + (i - 0x101000)), PAGE_DEFAULT, sysID)) == 0x0) + if ((vmm_remapPage(i, (VMM_MMAP_ADDR_PMODE + (i - 0x101000)), PAGE_DEFAULT, sysID, 0)) == 0x0) K_PANIC("vmmRemapPage failed\n"); } @@ -196,7 +197,7 @@ 07/28/04 - If perms == 0x0 set to PAGE_DEFAULT *****************************************************************************************/ -int vmm_remapPage(uint32_t source, uint32_t dest, uint16_t perms, pidType pid) { +int vmm_remapPage(uint32_t source, uint32_t dest, uint16_t perms, pidType pid, int haveLock) { uint16_t destPageDirectoryIndex = 0x0, destPageTableIndex = 0x0; uint32_t *pageDir = 0x0, *pageTable = 0x0; @@ -212,10 +213,12 @@ if (dest == 0x0) K_PANIC("dest == 0x0"); + if (haveLock == 0) { if (dest >= VMM_USER_START && dest <= VMM_USER_END) spinLock(&rmpSpinLock); else spinLock(&pdSpinLock); + } if (perms == 0x0) perms = KERNEL_PAGE_DEFAULT; @@ -238,7 +241,7 @@ /* If The Page Is Mapped In Free It Before We Remap */ if ((pageTable[destPageTableIndex] & PAGE_PRESENT) == PAGE_PRESENT) { - kpanic("A Page Is Already Mapped Here"); + kpanic("A Page Is Already Mapped Here: 0x%X:0x%X", dest, destPageTableIndex); if ((pageTable[destPageTableIndex] & PAGE_STACK) == PAGE_STACK) kprintf("Stack Page: [0x%X]\n", dest); @@ -268,10 +271,12 @@ rmDone: /* Return */ + if (haveLock == 0x0) { if (dest >= VMM_USER_START && dest <= VMM_USER_END) spinUnlock(&rmpSpinLock); else spinUnlock(&pdSpinLock); + } return (source); } @@ -284,10 +289,10 @@ 07/30/02 - This Returns A Free Page In The Kernel Space ***********************************************************************/ -void *vmm_getFrdeeKernelPage(pidType pid, uint16_t count) { +void *vmm_getFreeKernelPage(pidType pid, uint16_t count) { int pdI = 0x0, ptI = 0x0, c = 0, lc = 0; - uint32_t *pageDirectory = PT_BASE_ADDR; + uint32_t *pageDirectory = PD_BASE_ADDR; uint32_t *pageTable = 0x0; @@ -301,7 +306,7 @@ if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) if (vmm_allocPageTable(pdI, pid) == -1) - kpanic("Failed To Allocate Page Dir"); + kpanic("Failed To Allocate Page Dir: 0x%X", pdI); /* Set Page Table Address */ pageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * pdI)); @@ -323,29 +328,23 @@ if (c == count) goto gotPages; - /* Map A Physical Page To The Virtual Page */ - //if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (ptI * PAGE_SIZE)), KERNEL_PAGE_DEFAULT, pid)) == 0x0) - //K_PANIC("vmmRemapPage failed: gfkp-2\n"); - /* Clear This Page So No Garbage Is There */ - //vmm_clearVirtualPage((uint32_t) ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (ptI * PAGE_SIZE))); - //spinUnlock(&fkpSpinLock); - /* Return The Address Of The Newly Allocate Page */ - //return ((void *) ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (ptI * PAGE_SIZE))); } } startAddress = 0x0; goto noPagesAvail; - gotPages: for (c = 0; c < count; c++) { - if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), (startAddress + (PAGE_SIZE * c)), KERNEL_PAGE_DEFAULT, pid)) == 0x0) + gotPages: +for (c = 0; c < count; c++) { + if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), (startAddress + (PAGE_SIZE * c)), KERNEL_PAGE_DEFAULT, pid, 1)) == 0x0) K_PANIC("vmmRemapPage failed: gfkp-1\n"); vmm_clearVirtualPage((uint32_t) (startAddress + (PAGE_SIZE * c))); } - noPagesAvail: spinUnlock(&pdSpinLock); + noPagesAvail: +spinUnlock(&pdSpinLock); return (startAddress); } @@ -390,11 +389,11 @@ dI = (baseAddr / (1024 * 4096)); tI = ((baseAddr - (dI * (1024 * 4096))) / 4096); - if (vmm_remapPage(child->tss.cr3, 0x5A00000, KERNEL_PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(child->tss.cr3, 0x5A00000, KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("vmm_remapPage: Failed"); for (i = 0; i < 0x1000; i++) { - if (vmm_remapPage(childPageDir[i], 0x5A01000 + (i * 0x1000), KERNEL_PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(childPageDir[i], 0x5A01000 + (i * 0x1000), KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("Returned NULL"); } for (x = (_current->oInfo.vmStart / (1024 * 4096)); x < 1024; x++) { @@ -432,7 +431,7 @@ childPageTable = (uint32_t *) (0x5A01000 + (0x1000 * dI)); - if (vmm_remapPage(childPageTable[tI + c], ((x * (1024 * 4096)) + ((y + c) * 4096)), KERNEL_PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(childPageTable[tI + c], ((x * (1024 * 4096)) + ((y + c) * 4096)), KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("remap == NULL"); } @@ -453,7 +452,7 @@ //Map A Physical Page To The Virtual Page childPageTable = (uint32_t *) (0x5A01000 + (0x1000 * dI)); - if (vmm_remapPage(childPageTable[tI], ((x * (1024 * 4096)) + (y * 4096)), KERNEL_PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(childPageTable[tI], ((x * (1024 * 4096)) + (y * 4096)), KERNEL_PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("remap Failed"); //Return The Address Of The Mapped In Memory @@ -525,25 +524,25 @@ } if (c != -1) { for (c = 0; c < count; c++) { - if (vmm_remapPage((uint32_t) vmm_findFreePage( sysID), ((x * 0x400000) + ((y + c) * 0x1000)), KERNEL_PAGE_DEFAULT, sysID) == 0x0) + if (vmm_remapPage((uint32_t) vmm_findFreePage( sysID), ((x * 0x400000) + ((y + c) * 0x1000)), KERNEL_PAGE_DEFAULT, sysID, 0) == 0x0) K_PANIC("remap Failed"); vmm_clearVirtualPage((uint32_t) ((x * 0x400000) + ((y + c) * 0x1000))); } spinUnlock(&fkpSpinLock); - return ((void *) ((x * 0x400000) + (y * 0x1000))); + return ((void *) ((x * (PAGE_SIZE * PD_ENTRIES)) + (y * PAGE_SIZE))); } } else { /* Map A Physical Page To The Virtual Page */ - if (vmm_remapPage((uint32_t) vmm_findFreePage( sysID), ((x * 0x400000) + (y * 0x1000)), KERNEL_PAGE_DEFAULT, sysID) == 0x0) + if (vmm_remapPage((uint32_t) vmm_findFreePage( sysID), ((x * 0x400000) + (y * 0x1000)), KERNEL_PAGE_DEFAULT, sysID, 0) == 0x0) K_PANIC("Failed"); /* Clear This Page So No Garbage Is There */ vmm_clearVirtualPage((uint32_t) ((x * 0x400000) + (y * 0x1000))); /* Return The Address Of The Newly Allocate Page */ spinUnlock(&fkpSpinLock); - return ((void *) ((x * 0x400000) + (y * 0x1000))); + return ((void *) ((x * (PAGE_SIZE * PD_ENTRIES)) + (y * PAGE_SIZE))); } } } @@ -582,7 +581,7 @@ if (new > old) { for (i = old; i < new; i += 0x1000) { - if (vmm_remapPage(vmm_findFreePage(_current->id), i, PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(vmm_findFreePage(_current->id), i, PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("remap Failed"); } td->vm_dsize += btoc(new - old); @@ -605,45 +604,44 @@ pageDir = (uint32_t *) PD_BASE_ADDR; kprintf("PDE*PS: 0x%X", (PD_ENTRIES * PAGE_SIZE)); - for (x = (addr / (PD_ENTRIES * PAGE_SIZE)); x < PD_INDEX(VMM_USER_END); x++) { - //kprintf("X: 0x%X,0x%X]", x, pageDir[x]); + for (x = (addr / (PD_ENTRIES * PAGE_SIZE)); x <= PD_INDEX(VMM_USER_END); x++) { if ((pageDir[x] & PAGE_PRESENT) == PAGE_PRESENT) { - kprintf("X: 0x%X", x); pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * x)); - kprintf("X: 0x%X", x); - kprintf("pTS: 0x%X(0x%X)\n", pageTableSrc, pageDir[x]); - for (y = 0; y < PAGE_SIZE; y++) { + for (y = 0; y < PT_ENTRIES; y++) { if ((pageTableSrc[y] & PAGE_PRESENT) == PAGE_PRESENT) { - kprintf("pTS[%i:%i]: 0x%X", x, y, pageTableSrc[y]); if ((pageTableSrc[y] & PAGE_COW) == PAGE_COW) { - kprintf("[aCC.E: %i(0x%X)]", y, pageTableSrc[y]); adjustCowCounter(((uint32_t) pageTableSrc[y] & 0xFFFFF000), -1); - kprintf("[aCC.X: %i(0x%X)]", y, pageTableSrc[y]); pageTableSrc[y] = 0x0; } +/* else if ((pageTableSrc[y] & PAGE_STACK) == PAGE_STACK) { //TODO: We need to fix this so we can clean the stack! //kprintf("Page Stack!: 0x%X", (x * 0x400000) + (y * 0x1000)); // pageTableSrc[y] = 0x0; //MrOlsen (2016-01-18) NOTE: WHat should I Do Here? kprintf( "STACK: (%i:%i)", x, y ); } +*/ else { +/* +int vmmMemoryMapIndex = ((pageTableSrc[y] & 0xFFFFF000) / 4096); + vmmMemoryMap[vmmMemoryMapIndex].cowCounter = 0x0; + vmmMemoryMap[vmmMemoryMapIndex].pid = vmmID; + vmmMemoryMap[vmmMemoryMapIndex].status = memAvail; + systemVitals->freePages++; +*/ pageTableSrc[y] = 0x0; } } } - kprintf("ENDY:%i", y); } } - while (1) - asm("nop"); - asm( "movl %cr3,%eax\n" "movl %eax,%cr3\n" ); +kprintf("Here?"); return (0x0); } diff --git a/sys/vmm/vmm_allocpagetable.c b/sys/vmm/vmm_allocpagetable.c index e978139..c9d5cec 100644 --- a/sys/vmm/vmm_allocpagetable.c +++ b/sys/vmm/vmm_allocpagetable.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -15,12 +16,15 @@ //spinLock(&pdSpinLock); /* Map Page Table Page Into Page Directory */ - pageDirectory[pdI] = (uint32_t) vmm_findFreePage(pid) | KERN_PAGE_DEFAULT; + if ((pdI >= PD_INDEX(VMM_USER_START)) && (pdI <= PD_INDEX(VMM_USER_END))) + pageDirectory[pdI] = (uint32_t) vmm_findFreePage(pid) | PAGE_DEFAULT; + else + pageDirectory[pdI] = (uint32_t) vmm_findFreePage(pid) | KERNEL_PAGE_DEFAULT; /* Map Page Table To Virtual Space So We Can Easily Manipulate It */ pageTable = (uint32_t *) (PT_BASE_ADDR + (PD_INDEX( PT_BASE_ADDR ) * PAGE_SIZE)); - if ((pageTable[pdI] & PAGE_PRESENT) == PAGE_PRESET) + if ((pageTable[pdI] & PAGE_PRESENT) == PAGE_PRESENT) kpanic("How did this happen"); pageTable[pdI] = pageDirectory[pdI]; diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 6250713..2ce66ab 100644 --- a/sys/vmm/vmm_mmap.c +++ b/sys/vmm/vmm_mmap.c @@ -138,7 +138,7 @@ cap_maxprot = VM_PROT_ALL; */ for (i = addr; i < (addr + size); i += 0x1000) { - if (vmm_remapPage(vmm_findFreePage(_current->id), i, PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(vmm_findFreePage(_current->id), i, PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("remap Failed"); } kprintf("td->vm_dsize should be adjust but isn't"); @@ -171,7 +171,7 @@ for (x = 0x0; x < round_page(uap->len); x += 0x1000) { vmm_unmapPage(((uint32_t)uap->addr & 0xFFFFF000) + x, 1); /* Make readonly and read/write !!! */ - if (vmm_remapPage(vmm_findFreePage(_current->id), (((uint32_t)uap->addr & 0xFFFFF000) + x), PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(vmm_findFreePage(_current->id), (((uint32_t)uap->addr & 0xFFFFF000) + x), PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("Remap Page Failed"); } @@ -200,7 +200,7 @@ for (x = 0x0; x < round_page(uap->len); x += 0x1000) { vmm_unmapPage(((uint32_t)uap->addr & 0xFFFFF000) + x, 1); /* Make readonly and read/write !!! */ - if (vmm_remapPage(vmm_findFreePage(_current->id), (((uint32_t)uap->addr & 0xFFFFF000) + x), PAGE_DEFAULT, _current->id) == 0x0) + if (vmm_remapPage(vmm_findFreePage(_current->id), (((uint32_t)uap->addr & 0xFFFFF000) + x), PAGE_DEFAULT, _current->id, 0) == 0x0) K_PANIC("Remap Page Failed"); }