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/i386_exec.c b/sys/i386/i386_exec.c index 061a434..d1c0392 100644 --- a/sys/i386/i386_exec.c +++ b/sys/i386/i386_exec.c @@ -200,11 +200,6 @@ 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" @@ -452,15 +447,17 @@ tmp[i + x] = 0x0; /* Build LDT For GS and FS */ - if (vmm_remapPage(vmm_findFreePage(newProcess->id), VMM_USER_START, PAGE_DEFAULT, newProcess->id, 0) == 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 = VMM_USER_START; + struct gdtDescriptor *taskLDT = VMM_USER_LDT; struct gdtDescriptor *tmpDesc = 0x0; - tmpDesc = VMM_USER_START + sizeof(struct gdtDescriptor);//taskLDT[1]; + tmpDesc = VMM_USER_LDT + sizeof(struct gdtDescriptor);//taskLDT[1]; uint32_t data_addr = 0x0; tmpDesc->limitLow = (0xFFFFF & 0xFFFF); @@ -869,15 +866,18 @@ */ /* Build LDT For GS and FS */ - if (vmm_remapPage(vmm_findFreePage(_current->id), VMM_USER_START, PAGE_DEFAULT, _current->id, 0) == 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 = VMM_USER_START; + struct gdtDescriptor *taskLDT = VMM_USER_LDT; struct gdtDescriptor *tmpDesc = 0x0; - tmpDesc = VMM_USER_START + 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); @@ -890,7 +890,7 @@ _current->tss.gs = 0xF; //Select 0x8 + Ring 3 + LDT _current->pgrp = _current->id; - kprintf("DONE YET?"); + kprintf("DONE YET[0x%X]?", data_addr); return (0x0); } diff --git a/sys/i386/trap.c b/sys/i386/trap.c index 1a2d4d2..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); \ } 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/vmm.h b/sys/include/vmm/vmm.h index 021d179..009c0a3 100644 --- a/sys/include/vmm/vmm.h +++ b/sys/include/vmm/vmm.h @@ -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 //TMP ADDED 1000 -#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,12 @@ #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; diff --git a/sys/init/main.c b/sys/init/main.c index 272f101..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(VMM_USER_START, 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/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/vmm/getfreevirtualpage.c b/sys/vmm/getfreevirtualpage.c index 6a30bbf..8dba9ed 100644 --- a/sys/vmm/getfreevirtualpage.c +++ b/sys/vmm/getfreevirtualpage.c @@ -52,6 +52,7 @@ uint32_t *pageTable = 0x0; uint32_t start_page = 0x0; + uint32_t map_from = 0x0; spinLock(&fvpSpinLock); @@ -71,51 +72,35 @@ else K_PANIC("Invalid Type"); + /* Locate Initial Page Table */ + pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); - /* Locate Initial Page Table */ - pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); + keepMapping: - keepMapping: + if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) /* If Page Directory Is Not Yet Allocated Allocate It */ + vmm_allocPageTable(pdI, pid); - if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) { /* If Page Directory Is Not Yet Allocated Allocate It */ + pageTable = (uint32_t *) (PT_BASE_ADDR + (pdI * 0x1000)); - - /* Map A Page Directory Into The Page Table */ - pageDirectory[pdI] = (uint32_t) vmm_findFreePage(_current->id) | 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 ) * PAGE_SIZE)); /* Table that maps that 4MB */ - - pageTable[pdI] = (pageDirectory[pdI] & 0xFFFFF000) | PAGE_DEFAULT; - - /* Reload Page Directory */ - asm( - "movl %cr3,%eax\n" - "movl %eax,%cr3\n" - ); - - pageTable = (uint32_t *) (PT_BASE_ADDR + (pdI * 0x1000)); - bzero(pageTable, PAGE_SIZE); - } - else { - pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * pdI)); - } - - ptI = ((start_page - (pdI * (PD_ENTRIES * PAGE_SIZE))) / PAGE_SIZE); + ptI = ((start_page - (pdI * (PD_ENTRIES * PAGE_SIZE))) / PAGE_SIZE); for (y = ptI; y < PT_ENTRIES && counter < count; y++, counter++) { - /* Loop Through The Page Table Find An UnAllocated Page */ + /* 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!"); start_page += (PAGE_SIZE * counter); - pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); + 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; + /* 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, 0)) == 0x0) kpanic("vmmRemapPage: getFreeVirtualPage-1: (%i)[0x%X]\n", type, ((pdI * (PD_ENTRIES * PAGE_SIZE)) + (y * PAGE_SIZE))); @@ -126,22 +111,29 @@ kprintf("-> y: %i, ptI: 0x%X, pdI: 0x%X pTS: 0x%X ??\n", y, ptI, pdI, pageTable[y]); K_PANIC("UHM HOW DO WE HAVE AN ALLOCATED PAGE HERE!!\n"); } - } - if (counter < count) { + */ + } + + if (counter < count) { start_page += (PAGE_SIZE * counter); pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); - goto keepMapping; - } - - + goto keepMapping; + } gotPages: - if (type == VM_THRD) { + if (type == VM_THRD) _current->td.vm_dsize += btoc(count * PAGE_SIZE); - } else if (type == VM_TASK) - _current->oInfo.vmStart += (count * PAGE_SIZE); + _current->oInfo.vmStart = map_from + (count * PAGE_SIZE); + //_current->oInfo.vmStart += (count * PAGE_SIZE); + + for (counter = 0; count < count;counter ++) { + 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))); + } spinUnlock(&fvpSpinLock); return (start_page); diff --git a/sys/vmm/pagefault.c b/sys/vmm/pagefault.c index d2c5620..e630ed6 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); + die_if_kernel("SEGFAULT", frame, 0xC); kpanic("SIT HERE FOR NOW"); spinUnlock(&pageFaultSpinLock); endTask(_current->id); @@ -128,6 +129,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); + die_if_kernel("SEGFAULT", frame, 0xC); kpanic("SIT HERE FOR NOW"); kprintf("Out Of Stack Space: [0x%X]\n", memAddr & 0xFF0000); spinUnlock(&pageFaultSpinLock); diff --git a/sys/vmm/unmappage.c b/sys/vmm/unmappage.c index 1551965..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); diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 2ce66ab..416b369 100644 --- a/sys/vmm/vmm_mmap.c +++ b/sys/vmm/vmm_mmap.c @@ -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 {