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/bin/ls/main.c b/bin/ls/main.c index cb11901..a2abb05 100644 --- a/bin/ls/main.c +++ b/bin/ls/main.c @@ -69,7 +69,6 @@ printf("Segbase: 0x%X - 0x%X\n", segbase, &segbase); - printf("argc: %i - %i\n", argc, argv[0]); exit(0); diff --git a/doc/vmm/i386_vmm_map.txt b/doc/vmm/i386_vmm_map.txt index e42739d..5861c31 100644 --- a/doc/vmm/i386_vmm_map.txt +++ b/doc/vmm/i386_vmm_map.txt @@ -1,10 +1,11 @@ -KERNEL CODE START 0 - 0x00000000 - 0x003FFFFF -KERNEL CODE END 1 - 0x00400000 - 0x007FFFFF -USER START 2 - 0x00800000 - 0x00BFFFFF -USER END 767 - 0xBFC00000 - 0xBFFFFFFF -PAGE_DIRS 768 - 0xC0000000 - 0xC03FFFFF -PAGE DIR 769 - 0xC0400000 - 0xC07FFFFF -KERNEL SPACE 770 - 0xC0800000 - 0xC0BFFFFF -KERNEL SPACE END 1015 - 0xFDC00000 - 0xFDFFFFFF -KERNEL STACK START 1016 - 0xFE000000 - 0xFE3FFFFF -KERENL STACK END 1023 - 0xFFC00000 - 0xFFFFFFFF \ No newline at end of file +KERNEL CODE START 0 - 0x00000000 - 0x003FFFFF +KERNEL CODE END 1 - 0x00400000 - 0x007FEFFF +USER_LDT 1 - 0x007FF000 - 0x007FFFFF +USER START 2 - 0x00800000 - 0x00BFFFFF +USER END 767 - 0xBFC00000 - 0xBFFFFFFF +PAGE_DIRS 768 - 0xC0000000 - 0xC03FFFFF +PAGE DIR 769 - 0xC0400000 - 0xC07FFFFF +KERNEL SPACE 770 - 0xC0800000 - 0xC0BFFFFF +KERNEL SPACE END 1015 - 0xFDC00000 - 0xFDFFFFFF +KERNEL STACK START 1016 - 0xFE000000 - 0xFE3FFFFF +KERENL STACK END 1023 - 0xFFC00000 - 0xFFFFFFFF 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..d1c0392 100644 --- a/sys/i386/i386_exec.c +++ b/sys/i386/i386_exec.c @@ -341,7 +341,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 +370,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 +380,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 +447,17 @@ tmp[i + x] = 0x0; /* Build LDT For GS and FS */ - if (vmm_remapPage(vmm_findFreePage(newProcess->id), 0x400000, PAGE_DEFAULT, newProcess->id) == 0x0) { + vmm_unmapPage(VMM_USER_LDT, 1); + + if (vmm_remapPage(vmm_findFreePage(newProcess->id), VMM_USER_LDT, PAGE_DEFAULT, newProcess->id, 0) == 0x0) { K_PANIC("Error: Remap Page Failed"); } - struct gdtDescriptor *taskLDT = 0x400000; + struct gdtDescriptor *taskLDT = VMM_USER_LDT; struct gdtDescriptor *tmpDesc = 0x0; - tmpDesc = 0x400000 + sizeof(struct gdtDescriptor);//taskLDT[1]; + tmpDesc = VMM_USER_LDT + sizeof(struct gdtDescriptor);//taskLDT[1]; uint32_t data_addr = 0x0; tmpDesc->limitLow = (0xFFFFF & 0xFFFF); @@ -551,10 +553,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 +631,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 +866,18 @@ */ /* Build LDT For GS and FS */ - if (vmm_remapPage(vmm_findFreePage(_current->id), 0x400000, PAGE_DEFAULT, _current->id) == 0x0) { + vmm_unmapPage(VMM_USER_LDT, 1); // Can I Free This? + if (vmm_remapPage(vmm_findFreePage(_current->id), VMM_USER_LDT, PAGE_DEFAULT, _current->id, 0) == 0x0) { K_PANIC("Error: Remap Page Failed"); } - struct gdtDescriptor *taskLDT = 0x400000; + struct gdtDescriptor *taskLDT = VMM_USER_LDT; struct gdtDescriptor *tmpDesc = 0x0; - tmpDesc = 0x400000 + sizeof(struct gdtDescriptor);//taskLDT[1]; + tmpDesc = VMM_USER_LDT + sizeof(struct gdtDescriptor);//taskLDT[1]; + + //data_addr = 0x0; //TEMP 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[0x%X]?", data_addr); + 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 3e4333e..ae2b794 100644 --- a/sys/i386/trap.c +++ b/sys/i386/trap.c @@ -35,8 +35,6 @@ #define KERNEL_STACK 0x2000 -void die_if_kernel(char *str, struct trapframe *regs, long err); - #define TRAP_CODE(trap_nr, signr, str, trap_name, tsk) void do_##trap_name(struct trapframe *regs, long error_code) { \ die_if_kernel(str, regs, error_code); \ } @@ -128,21 +126,27 @@ 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); - - die_if_kernel("trapCode", frame, frame->tf_trapno); - endTask(_current->id); - sched_yield(); + if (frame->tf_trapno == 0xc) { + vmm_pageFault(frame, cr2); + } + else { + die_if_kernel("trapCode", frame, frame->tf_trapno); + endTask(_current->id); + sched_yield(); + } } diff --git a/sys/include/sys/trap.h b/sys/include/sys/trap.h index e3a73f5..0b86020 100644 --- a/sys/include/sys/trap.h +++ b/sys/include/sys/trap.h @@ -55,6 +55,7 @@ int tf_ss; }; +void die_if_kernel(char *str, struct trapframe *regs, long err); void trap( struct trapframe * ); #endif /* END _SYS_TRAP_H */ diff --git a/sys/include/vmm/paging.h b/sys/include/vmm/paging.h index a79b729..6269e46 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 83b7d0b..009c0a3 100644 --- a/sys/include/vmm/vmm.h +++ b/sys/include/vmm/vmm.h @@ -26,8 +26,8 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _VMM_VMM_H_ -#define _VMM_VMM_H_ +#ifndef _VMM_VMM_H +#define _VMM_VMM_H #include #include @@ -50,11 +50,10 @@ #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_END 0xFDFFFFFF +#define VMM_KERN_CODE_START 0x00000000 +#define VMM_KERN_CODE_END 0x007FEFFF -#define VMM_KERN_STACK_START 0xFE000000 -#define VMM_KERN_STACK_END 0xFFFFFFFF +#define VMM_USER_LDT 0x007FF000 #define VMM_USER_START 0x00800000 #define VMM_USER_END 0xBFFFFFFF @@ -62,6 +61,14 @@ #define VMM_PAGE_DIRS 0xC0000000 #define VMM_PAGE_DIR 0xC0400000 +#define VMM_KERN_START 0xC0800000 //TMP ADDED 1000 +#define VMM_KERN_END 0xFDFFFFFF + +#define VMM_KERN_STACK_START 0xFE000000 +#define VMM_KERN_STACK_END 0xFFFFFFFF + + extern struct spinLock pdSpinLock; + struct freebsd6_mmap_args { char addr_l_[PADL_(caddr_t)]; @@ -111,6 +118,8 @@ int adjustCowCounter(uInt32 baseAddr, int adjustment); void vmm_freeProcessPages(pidType pid); + int vmm_allocPageTable(uint32_t, pidType); + #ifdef __cplusplus } #endif diff --git a/sys/init/main.c b/sys/init/main.c index d103497..dd389cb 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_LDT, 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/gen_calls.c b/sys/kernel/gen_calls.c index cf82caa..542b955 100644 --- a/sys/kernel/gen_calls.c +++ b/sys/kernel/gen_calls.c @@ -39,6 +39,7 @@ #include #include #include +#include /* Exit Syscall */ int sys_exit(struct thread *td, struct sys_exit_args *args) { @@ -189,7 +190,7 @@ base_addr = (uint32_t) segbase[0]; struct gdtDescriptor *tmpDesc = 0x0; - tmpDesc = 0x400000 + sizeof(struct gdtDescriptor); //taskLDT[1]; + tmpDesc = VMM_USER_LDT + sizeof(struct gdtDescriptor); //taskLDT[1]; tmpDesc->limitLow = (0xFFFFF & 0xFFFF); tmpDesc->baseLow = (base_addr & 0xFFFF); 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 601de40..0bb2326 100644 --- a/sys/vmm/Makefile +++ b/sys/vmm/Makefile @@ -6,7 +6,7 @@ include ../Makefile.incl # Objects -OBJS = 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/createvirtualspace.c b/sys/vmm/createvirtualspace.c index f32bdce..67dd68a 100644 --- a/sys/vmm/createvirtualspace.c +++ b/sys/vmm/createvirtualspace.c @@ -150,8 +150,11 @@ /* Flush The Page From Garbage In Memory */ bzero(newPageTable, PAGE_SIZE); - for (x = 0; x < PD_ENTRIES; x++) + for (x = 0; x < PD_ENTRIES; x++) { + if (x == 0x21) + kprintf("[0x%X]", newPageDirectory[x]); newPageTable[x] = newPageDirectory[x]; + } /* Unmap Page From Virtual Space */ vmm_unmapPage((uint32_t) newPageTable, 1); 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 1558912..ac09d09 100644 --- a/sys/vmm/getfreevirtualpage.c +++ b/sys/vmm/getfreevirtualpage.c @@ -47,128 +47,85 @@ ************************************************************************/ void *vmm_getFreeVirtualPage(pidType pid, int count, int type) { int y = 0, counter = 0, pdI = 0x0, ptI = 0x0; - uint32_t *pageTableSrc = 0x0; - uint32_t *pageDir = 0x0; + + uint32_t *pageDirectory = 0x0; + uint32_t *pageTable = 0x0; + uint32_t start_page = 0x0; + uint32_t map_from = 0x0; spinLock(&fvpSpinLock); - pageDir = (uint32_t *) PD_BASE_ADDR; + pageDirectory = (uint32_t *) PD_BASE_ADDR; /* Lets Search For A Free Page */ if (_current->oInfo.vmStart <= 0x100000) kpanic("Invalid vmStart\n"); - //MrOlsen kprintf("type: %i ", type); - /* Get Our Starting Address */ if (type == VM_THRD) { start_page = (uint32_t) (_current->td.vm_daddr + ctob(_current->td.vm_dsize)); } else if (type == VM_TASK) { - //kprintf("vmStart"); start_page = _current->oInfo.vmStart; } else K_PANIC("Invalid Type"); - /* - * - * I Need To Write Some Function For Space That Is Returned Maybe A Malloc Type Map - * - */ + /* Locate Initial Page Table */ + pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); - /* - * Lets Start Allocating Pages - */ - for ( counter = 0; counter < count; counter++ ) { - /* Locate Initial Page Table */ - pdI = ((start_page + (counter * 0x1000)) / 0x400000); + keepMapping: + if (pdI > PD_INDEX(VMM_USER_END)) + goto doneMapping; - keepMapping: - //kprintf("PAGE IS"); - /* If Page Directory Is Not Yet Allocated Allocate It */ - if ((pageDir[pdI] & PAGE_PRESENT) != PAGE_PRESENT) { - //kprintf("PAGE NOT %i,", __LINE__); - pageDir[pdI] = (uInt32) vmm_findFreePage(_current->id) | PAGE_DEFAULT; - //kprintf("PAGE NOT %i,", __LINE__); + if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) /* If Page Directory Is Not Yet Allocated Allocate It */ + vmm_allocPageTable(pdI, pid); - //kprintf("PAGE NOT %i,", __LINE__); + pageTable = (uint32_t *) (PT_BASE_ADDR + (pdI * 0x1000)); - /* Also Add It To Virtual Space So We Can Make Changes Later */ - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (PD_INDEX( PT_BASE_ADDR ) * 0x1000)); /* Table that maps that 4b */ - pageTableSrc[pdI] = (pageDir[pdI] & 0xFFFFF000) | PAGE_DEFAULT; /* Is This Why Page Needs To Be User As Well? */ - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (pdI * 0x1000)); + ptI = ((start_page - (pdI * (PD_ENTRIES * PAGE_SIZE))) / PAGE_SIZE); - /* Reload Page Directory */ - asm( - "movl %cr3,%eax\n" - "movl %eax,%cr3\n" - ); + for (y = ptI; y < PT_ENTRIES && counter < count; y++, counter++) { - //kprintf("PAGE NOT %i,", __LINE__); - pageTableSrc = (uInt32 *) (PT_BASE_ADDR + (0x1000 * pdI)); - - //kprintf("PAGE NOT %i,", __LINE__); - /* Initialize The New Page Table To Prevent Dirty Bits */ - for (y = 0x0; y < PD_ENTRIES; y++) { - pageTableSrc[y] = (uInt32) 0x0; - } - //kprintf("PAGE NOT %i,", __LINE__); - - } - else { - pageTableSrc = (uInt32 *) (PT_BASE_ADDR + (0x1000 * pdI)); - } - - ptI = ((start_page - (pdI * 0x400000)) / 0x1000); - - for (y = ptI; y < 1024 && counter < count; y++) { - - /* Loop Through The Page Table Find An UnAllocated Page */ - if ((pageTableSrc[y] & PAGE_COW) == PAGE_COW) { + /* Loop Through The Page Table Find An UnAllocated Page */ + if ((pageTable[y] & PAGE_PRESENT) == PAGE_PRESENT) { + if ((pageTable[y] & PAGE_COW) == PAGE_COW) kprintf("COW PAGE NOT CLEANED!"); - } - else if ((uInt32) pageTableSrc[y] == (uInt32) 0x0) { - if ((vmm_remapPage((uInt32) vmm_findFreePage(pid), ((pdI * (1024 * 4096)) + (y * 4096)), PAGE_DEFAULT, pid)) == 0x0) - kpanic("vmmRemapPage: getFreeVirtualPage-1: (%i)[0x%X]\n", type, ((pdI * (1024 * 4096)) + (y * 4096))); - vmm_clearVirtualPage((uInt32) ((pdI * (1024 * 4096)) + (y * 4096))); - } - else { - kprintf("-> y: %i, ptI: 0x%X, pdI: 0x%X pTS: 0x%X ??\n", y, ptI, pdI, pageTableSrc[y]); - K_PANIC("UHM HOW DO WE HAVE AN ALLOCATED PAGE HERE!!\n"); - } - //kprintf("[0x%X:%i:%i:%i]", ((pdI * (1024 * 4096)) + (y * 4096)), y, counter, count); - counter++; - - } - if (counter < count) { - //kprintf("Need More Pages!"); - start_page += (0x1000 * counter); - pdI = ((start_page + (counter * 0x1000)) / 0x400000); + start_page += (PAGE_SIZE * counter); + pdI = ((start_page + ((counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE))); + map_from = 0x0; + counter = 0; goto keepMapping; } + + if (map_from == 0x0) + map_from = start_page; } - if (type == VM_THRD) { - _current->td.vm_dsize += btoc(count * 0x1000); - //kprintf( "vm_dsize: [0x%X]][0x%X]\n", ctob( _current->td.vm_dsize ), _current->td.vm_dsize ); + if (counter < count) { + start_page += (PAGE_SIZE * counter); + pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); + goto keepMapping; } + + gotPages: + if (type == VM_THRD) + _current->td.vm_dsize += btoc(count * PAGE_SIZE); else if (type == VM_TASK) - _current->oInfo.vmStart += (count * 0x1000); + _current->oInfo.vmStart = map_from + (count * PAGE_SIZE); - /* - * MMAP Return - */ + //_current->oInfo.vmStart += (count * PAGE_SIZE); - //kprintf( "mmap: [0x%x]\n", start_page ); - /* If No Free Page Was Found Return NULL */ + for (counter = 0; count < count; counter++) { + if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), map_from + (counter * PAGE_SIZE), PAGE_DEFAULT, pid, 0)) == 0x0) + kpanic("vmmRemapPage: getFreeVirtualPage-1: (%i)[0x%X]\n", type, map_from + (counter * PAGE_SIZE)); + + vmm_clearVirtualPage((uint32_t) (map_from + (counter * PAGE_SIZE))); + } + + doneMapping: spinUnlock(&fvpSpinLock); - return (start_page); + return (map_from); } - -/*** - END - ***/ - diff --git a/sys/vmm/pagefault.c b/sys/vmm/pagefault.c index 6dba711..e630ed6 100644 --- a/sys/vmm/pagefault.c +++ b/sys/vmm/pagefault.c @@ -114,6 +114,8 @@ 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); + die_if_kernel("SEGFAULT", frame, 0xC); + kpanic("SIT HERE FOR NOW"); spinUnlock(&pageFaultSpinLock); endTask(_current->id); } @@ -127,6 +129,8 @@ 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); + die_if_kernel("SEGFAULT", frame, 0xC); + 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 e52feaf..4a1c2bc 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -36,10 +36,12 @@ #include #include #include +#include uint32_t *kernelPageDirectory = 0x0; // Pointer To Kernel Page Directory static struct spinLock fkpSpinLock = SPIN_LOCK_INITIALIZER; + static struct spinLock rmpSpinLock = SPIN_LOCK_INITIALIZER; /***************************************************************************************** @@ -157,7 +159,6 @@ if ((pageTable = (uint32_t *) vmm_findFreePage(sysID)) == 0x0) K_PANIC("ERROR: vmm_findFreePage Failed"); - /* Now Lets Turn On Paging With This Initial Page Table */ asm volatile( "movl %0,%%eax \n" @@ -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,7 +213,12 @@ if (dest == 0x0) K_PANIC("dest == 0x0"); - spinLock(&rmpSpinLock); + if (haveLock == 0) { + if (dest >= VMM_USER_START && dest <= VMM_USER_END) + spinLock(&rmpSpinLock); + else + spinLock(&pdSpinLock); + } if (perms == 0x0) perms = KERNEL_PAGE_DEFAULT; @@ -224,37 +230,19 @@ destPageDirectoryIndex = PD_INDEX(dest); if ((pageDir[destPageDirectoryIndex] & PAGE_PRESENT) != PAGE_PRESENT) { - //kprintf("Page Not Present: 0x%X, Source: 0x%X, Dest: 0x%X, dPDI: 0x%X\n", dest, source, dest, destPageDirectoryIndex); - /* If Page Table Is Non Existant Then Set It Up */ - /* UBU Why does the page table need to be user writable? */ - pageDir[destPageDirectoryIndex] = (uint32_t) vmm_findFreePage(pid) | PAGE_DEFAULT; - - /* Also Add It To Virtual Space So We Can Make Changes Later */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (PD_INDEX( PT_BASE_ADDR ) * 0x1000)); /* Table that maps that 4b */ - pageTable[destPageDirectoryIndex] = (pageDir[destPageDirectoryIndex] & 0xFFFFF000) | PAGE_DEFAULT; /* Is This Why Page Needs To Be User As Well? */ - - pageTable = (uint32_t *) (PT_BASE_ADDR + (destPageDirectoryIndex * 0x1000)); - - /* Need To Figure Out invlpg */ - asm volatile( - "push %eax \n" - "mov %cr3,%eax \n" - "mov %eax,%cr3 \n" - "pop %eax \n" - ); - - memset(pageTable, 0x0, 0x1000); - + vmm_allocPageTable(destPageDirectoryIndex, pid); } /* Set Address To Page Table */ - pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * destPageDirectoryIndex)); + pageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * destPageDirectoryIndex)); /* Get The Index To The Page Table */ - destPageTableIndex = PT_INDEX(dest); //((dest - (destPageDirectoryIndex * 0x400000)) / 0x1000); + destPageTableIndex = PT_INDEX(dest); /* 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: 0x%X:0x%X", dest, destPageTableIndex); + if ((pageTable[destPageTableIndex] & PAGE_STACK) == PAGE_STACK) kprintf("Stack Page: [0x%X]\n", dest); @@ -283,74 +271,82 @@ rmDone: /* Return */ - spinUnlock(&rmpSpinLock); + if (haveLock == 0x0) { + if (dest >= VMM_USER_START && dest <= VMM_USER_END) + spinUnlock(&rmpSpinLock); + else + spinUnlock(&pdSpinLock); + } return (source); } /************************************************************************ - Function: void *vmmGetFreeKernelPage(pidType pid); + Function: void *vmm_getFreeKernelPage(pidType pid, uint16_t count); Description: Returns A Free Page Mapped To The VM Space Notes: - 07/30/02 - This Returns A Free Page In The Top 1GB For The Kernel + 07/30/02 - This Returns A Free Page In The Kernel Space - ************************************************************************/ + ***********************************************************************/ void *vmm_getFreeKernelPage(pidType pid, uint16_t count) { - int x = 0, y = 0, c = 0; - uint32_t *pageTableSrc = 0x0; + int pdI = 0x0, ptI = 0x0, c = 0, lc = 0; - spinLock(&fkpSpinLock); + uint32_t *pageDirectory = PD_BASE_ADDR; + + uint32_t *pageTable = 0x0; + + uint32_t startAddress = 0x0; + + /* Lock The Page Dir & Tables For All Since Kernel Space Is Shared */ + spinLock(&pdSpinLock); /* Lets Search For A Free Page */ - for (x = 768; x < 1024; x++) { + for (pdI = PD_INDEX(VMM_KERN_START); pdI <= PD_INDEX(VMM_KERN_END); pdI++) { + + if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) + if (vmm_allocPageTable(pdI, pid) == -1) + kpanic("Failed To Allocate Page Dir: 0x%X", pdI); /* Set Page Table Address */ - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (4096 * x)); + pageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * pdI)); - for (y = 0; y < 1024; y++) { + /* Loop Through The Page Table For A Free Page */ + for (ptI = 0; ptI < PT_ENTRIES; ptI++) { - /* Loop Through The Page Table Find An UnAllocated Page */ - if ((uint32_t) pageTableSrc[y] == (uint32_t) 0x0) { - if (count > 1) { - for (c = 0; c < count; c++) { - if (y + c < 1024) { - if ((uint32_t) pageTableSrc[y + c] != (uint32_t) 0x0) { - c = -1; - break; - } - } - } - if (c != -1) { - for (c = 0; c < count; c++) { - if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), ((x * (1024 * 4096)) + ((y + c) * 4096)), KERNEL_PAGE_DEFAULT, pid)) == 0x0) - K_PANIC("vmmRemapPage failed: gfkp-1\n"); - vmm_clearVirtualPage((uint32_t) ((x * (1024 * 4096)) + ((y + c) * 4096))); - } - spinUnlock(&fkpSpinLock); - return ((void *) ((x * (1024 * 4096)) + (y * 4096))); - } - } - else { - /* Map A Physical Page To The Virtual Page */ - - if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), ((x * (1024 * 4096)) + (y * 4096)), KERNEL_PAGE_DEFAULT, pid)) == 0x0) - K_PANIC("vmmRemapPage failed: gfkp-2\n"); - - /* Clear This Page So No Garbage Is There */ - vmm_clearVirtualPage((uint32_t) ((x * (1024 * 4096)) + (y * 4096))); - - spinUnlock(&fkpSpinLock); - /* Return The Address Of The Newly Allocate Page */ - return ((void *) ((x * (1024 * 4096)) + (y * 4096))); - } + /* Check For Unalocated Page */ + if ((pageTable[ptI] & PAGE_PRESENT) != PAGE_PRESENT) { + if (startAddress == 0x0) + startAddress = ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (ptI * PAGE_SIZE)); + c++; } + else { + startAddress = 0x0; + c = 0; + } + + if (c == count) + goto gotPages; + } } - /* If No Free Page Was Found Return NULL */ - spinUnlock(&fkpSpinLock); - return (0x0); + 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, 1)) == 0x0) + K_PANIC("vmmRemapPage failed: gfkp-1\n"); + + vmm_clearVirtualPage((uint32_t) (startAddress + (PAGE_SIZE * c))); + + } + + noPagesAvail: +spinUnlock(&pdSpinLock); + + return (startAddress); } /************************************************************************ @@ -393,15 +389,15 @@ 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++) { - + kpanic("v_mFT"); pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (4096 * x)); for (y = 0; y < 1024; y++) { @@ -435,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"); } @@ -456,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 @@ -483,12 +479,20 @@ uInt16 x = 0x0, y = 0x0; int c = 0x0; uint32_t *pageTableSrc = 0x0; + uint32_t *pageDirectory = 0x0; + + pageDirectory = (uint32_t *) PD_BASE_ADDR; spinLock(&fkpSpinLock); + /* Lets Search For A Free Page */ for (x = PT_INDEX(VMM_KERN_START); x <= PT_INDEX(VMM_KERN_END); x++) { - /* Set Page Table Address */ - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (0x1000 * x)); + + if ((pageDirectory[x] & PAGE_PRESENT) != PAGE_PRESENT) /* If Page Directory Is Not Yet Allocated Allocate It */ + vmm_allocatePageTable(x, sysID); + + pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * x)); + for (y = 0; y < 1024; y++) { /* Loop Through The Page Table Find An UnAllocated Page */ if ((uint32_t) pageTableSrc[y] == (uint32_t) 0x0) { @@ -503,25 +507,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))); } } } @@ -560,7 +564,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); @@ -583,45 +587,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/unmappage.c b/sys/vmm/unmappage.c index bfb0cfd..21fd215 100644 --- a/sys/vmm/unmappage.c +++ b/sys/vmm/unmappage.c @@ -48,10 +48,16 @@ void vmm_unmapPage(uint32_t pageAddr, int flags) { int pageDirectoryIndex = 0, pageTableIndex = 0; uint32_t *pageTable = 0x0; + uint32_t *pageDirectory = 0x0; + + pageDirectory = PD_BASE_ADDR; /* Get The Index To The Page Directory */ pageDirectoryIndex = (pageAddr >> 22); + if ((pageDirectory[pageDirectoryIndex] & PAGE_PRESENT) != PAGE_PRESENT) + return; + //Calculate The Page Table Index pageTableIndex = ((pageAddr >> 12) & 0x3FF); @@ -110,32 +116,3 @@ } return; } - -/*** - $Log: unmappage.c,v $ - Revision 1.1.1.1 2006/06/01 12:46:13 reddawg - ubix2 - - Revision 1.2 2005/10/12 00:13:38 reddawg - Removed - - Revision 1.1.1.1 2005/09/26 17:24:54 reddawg - no message - - Revision 1.4 2004/07/26 19:15:49 reddawg - test code, fixes and the like - - Revision 1.3 2004/06/15 12:35:05 reddawg - Cleaned Up - - Revision 1.2 2004/06/10 22:23:56 reddawg - Volatiles - - Revision 1.1.1.1 2004/04/15 12:06:53 reddawg - UbixOS v1.0 - - Revision 1.7 2004/04/13 16:36:34 reddawg - Changed our copyright, it is all now under a BSD-Style license - - END - ***/ diff --git a/sys/vmm/vmm_allocpagetable.c b/sys/vmm/vmm_allocpagetable.c new file mode 100644 index 0000000..c9d5cec --- /dev/null +++ b/sys/vmm/vmm_allocpagetable.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include + + +int vmm_allocPageTable(uint32_t pdI, pidType pid) { + uint32_t *pageDirectory = PD_BASE_ADDR; + uint32_t *pageTable = 0x0; + + if ((pdI >= PD_ENTRIES) || ((pageDirectory[pdI] & PAGE_PRESENT) == PAGE_PRESENT)) + return(-1); + + + /* Lock The Page Directory So We Dont Collide With Another Thread */ + //spinLock(&pdSpinLock); + + /* Map Page Table Page Into Page Directory */ + 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_PRESENT) + kpanic("How did this happen"); + + pageTable[pdI] = pageDirectory[pdI]; + + /* Reload Page Directory */ + asm( + "movl %cr3,%eax\n" + "movl %eax,%cr3\n" + ); + + /* Clean The Page */ + pageTable = (uint32_t *) (PT_BASE_ADDR + (pdI * PAGE_SIZE)); + bzero(pageTable, PAGE_SIZE); + + //spinUnlock(&pdSpinLock); + + return(0x0); + +} diff --git a/sys/vmm/vmm_init.c b/sys/vmm/vmm_init.c index 85fab6b..8adaf91 100644 --- a/sys/vmm/vmm_init.c +++ b/sys/vmm/vmm_init.c @@ -27,8 +27,11 @@ */ #include +#include #include +struct spinLock pdSpinLock = SPIN_LOCK_INITIALIZER; + /*! Function: int vmm_init() diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 6250713..416b369 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"); } @@ -182,7 +182,8 @@ } td->td_retval[0] = vmm_getFreeVirtualPage(_current->id, round_page( uap->len ) / 0x1000, VM_TASK); - //bzero(td->td_retval[0], uap->len); + kprintf("uap->len: 0x%X, add: 0x%X, count: 0x%X", uap->len, td->td_retval[0], round_page(uap->len) / 0x1000); + bzero(td->td_retval[0], uap->len); return (0x0); //vmm_getFreeVirtualPage(_current->id, round_page( uap->len ) / 0x1000, VM_THRD)); } else { @@ -200,7 +201,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"); }