diff --git a/lib/libc_old/stdlib/malloc.c b/lib/libc_old/stdlib/malloc.c index 5627b90..8fb74ee 100644 --- a/lib/libc_old/stdlib/malloc.c +++ b/lib/libc_old/stdlib/malloc.c @@ -66,6 +66,8 @@ if ( ( emptyKernDesc = (struct memDescriptor *) getPage( 0x4 ) ) == 0x0 ) return ( 0x0 ); + printf("getPage(0x%X): 0x%X", 0x4, emptyKernDesc); + /* zero out the memory so we know there is no garbage */ memset( emptyKernDesc, 0x0, 0x4000 ); diff --git a/sys/i386/fork.c b/sys/i386/fork.c index 990fe3f..0d1056e 100644 --- a/sys/i386/fork.c +++ b/sys/i386/fork.c @@ -97,7 +97,7 @@ 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! [0x%X]\n", newProcess->tss.cr3 ); newProcess->state = FORK; /* Fix gcc optimization problems */ diff --git a/sys/i386/i386_exec.c b/sys/i386/i386_exec.c index d1c0392..22afe47 100644 --- a/sys/i386/i386_exec.c +++ b/sys/i386/i386_exec.c @@ -453,20 +453,18 @@ K_PANIC("Error: Remap Page Failed"); } - struct gdtDescriptor *taskLDT = VMM_USER_LDT; + struct gdtDescriptor *taskLDT = 0x0; - struct gdtDescriptor *tmpDesc = 0x0; - - tmpDesc = VMM_USER_LDT + sizeof(struct gdtDescriptor);//taskLDT[1]; + taskLDT = VMM_USER_LDT + sizeof(struct gdtDescriptor); uint32_t data_addr = 0x0; - tmpDesc->limitLow = (0xFFFFF & 0xFFFF); - tmpDesc->baseLow = (data_addr & 0xFFFF); - tmpDesc->baseMed = ((data_addr >> 16) & 0xFF); - tmpDesc->access = ((dData + dWrite + dBig + dBiglim + dDpl3) + dPresent) >> 8; - tmpDesc->limitHigh = (0xFFFFF >> 16); - tmpDesc->granularity = ((dData + dWrite + dBig + dBiglim + dDpl3) & 0xFF) >> 4; - tmpDesc->baseHigh = data_addr >> 24; + taskLDT->limitLow = (0xFFFFF & 0xFFFF); + taskLDT->baseLow = (data_addr & 0xFFFF); + taskLDT->baseMed = ((data_addr >> 16) & 0xFF); + taskLDT->access = ((dData + dWrite + dBig + dBiglim + dDpl3) + dPresent) >> 8; + taskLDT->limitHigh = (0xFFFFF >> 16); + taskLDT->granularity = ((dData + dWrite + dBig + dBiglim + dDpl3) & 0xFF) >> 4; + taskLDT->baseHigh = data_addr >> 24; /* Switch Back To The Kernels VM Space */ @@ -871,21 +869,19 @@ K_PANIC("Error: Remap Page Failed"); } - struct gdtDescriptor *taskLDT = VMM_USER_LDT; + struct gdtDescriptor *taskLDT = 0x0; - struct gdtDescriptor *tmpDesc = 0x0; - - tmpDesc = VMM_USER_LDT + sizeof(struct gdtDescriptor);//taskLDT[1]; + taskLDT = VMM_USER_LDT + sizeof(struct gdtDescriptor);//taskLDT[1]; //data_addr = 0x0; //TEMP - tmpDesc->limitLow = (0xFFFFF & 0xFFFF); - tmpDesc->baseLow = (data_addr & 0xFFFF); - tmpDesc->baseMed = ((data_addr >> 16) & 0xFF); - tmpDesc->access = ((dData + dWrite + dBig + dBiglim + dDpl3) + dPresent) >> 8; - tmpDesc->limitHigh = (0xFFFFF >> 16); - tmpDesc->granularity = ((dData + dWrite + dBig + dBiglim + dDpl3) & 0xFF) >> 4; - tmpDesc->baseHigh = data_addr >> 24; + taskLDT->limitLow = (0xFFFFF & 0xFFFF); + taskLDT->baseLow = (data_addr & 0xFFFF); + taskLDT->baseMed = ((data_addr >> 16) & 0xFF); + taskLDT->access = ((dData + dWrite + dBig + dBiglim + dDpl3) + dPresent) >> 8; + taskLDT->limitHigh = (0xFFFFF >> 16); + taskLDT->granularity = ((dData + dWrite + dBig + dBiglim + dDpl3) & 0xFF) >> 4; + taskLDT->baseHigh = data_addr >> 24; _current->tss.gs = 0xF; //Select 0x8 + Ring 3 + LDT _current->pgrp = _current->id; diff --git a/sys/i386/sched.c b/sys/i386/sched.c index 68db655..f455626 100644 --- a/sys/i386/sched.c +++ b/sys/i386/sched.c @@ -150,7 +150,10 @@ } asm("sti"); - asm("ljmp $0x20,$0\n"); + asm( + "lgdtl (loadGDT)\n" + "ljmp $0x20,$0\n" + ); } else { spinUnlock(&schedulerSpinLock); diff --git a/sys/i386/trap.c b/sys/i386/trap.c index ae2b794..b701d73 100644 --- a/sys/i386/trap.c +++ b/sys/i386/trap.c @@ -98,12 +98,22 @@ ss = 0x10; } - kprintf("%s: %04lx(%i:%i)[0x%X]\n", str, err & 0xffff, regs->tf_trapno, regs->tf_err, regs->tf_ss); - kprintf("CPU: %d\n", 0); - kprintf("EIP: %04x:[<%08lx>]\nEFLAGS: %08lx\n", 0xffff & regs->tf_cs, regs->tf_eip, regs->tf_eflags); + kprintf("\n%s: 0x%X:%i, CPU %d, EIP: 0x%X, EFLAGS: 0x%X\n", str, regs->tf_err, regs->tf_trapno, 0x0, regs->tf_eip, regs->tf_eflags); kprintf("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n", regs->tf_eax, regs->tf_ebx, regs->tf_ecx, regs->tf_edx); kprintf("esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n", regs->tf_esi, regs->tf_edi, regs->tf_ebp, esp); - kprintf("cs: 0x%X ds: 0x%X es: 0x%X fs: 0x%X gs: 0x%X ss: 0x%X\n", regs->tf_cs, regs->tf_ds, regs->tf_es, regs->tf_fs, regs->tf_gs, ss); + kprintf("cs: 0x%X ds: 0x%X es: 0x%X fs: 0x%X gs: 0x%X ss: 0x%X\n", regs->tf_cs, regs->tf_ds, regs->tf_es, regs->tf_fs, regs->tf_gs, ss); + kprintf("cr0: 0x%X, cr2: 0x%X, cr3: 0x%X, cr4: 0x%X\n", rcr0(), rcr2(), rcr3(), rcr4()); + + 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); @@ -111,11 +121,11 @@ for (i = 0; i < 16; i++) { if (i && ((i % 8) == 0)) - kprintf("\n "); + kprintf("\n "); kprintf("%08lx ", get_seg_long(ss, stack++)); } - while(1) asm("nop"); + endTask(_current->id); } void trap(struct trapframe *frame) { @@ -127,7 +137,7 @@ trap_code = frame->tf_trapno; cr2 = rcr2(); - kprintf("CR2: 0x%X", cr2); + kprintf("CR2: 0x%X[0x%X]", cr2,_current->tss.ldt); if ((frame->tf_eflags & PSL_I) == 0) { if (SEL_GET_PL(frame->tf_cs) == SEL_PL_USER || (frame->tf_eflags & PSL_VM)) { diff --git a/sys/kernel/endtask.c b/sys/kernel/endtask.c index 9cadda3..0203bd7 100644 --- a/sys/kernel/endtask.c +++ b/sys/kernel/endtask.c @@ -43,29 +43,11 @@ ************************************************************************/ void endTask(pidType pid) { - //kTask_t *tmpTask = 0x0; - /* Don't mess with scheduler structures from outside the scheduler! */ - /* Just set status to dead, and let the scheduler clean up itself */ sched_setStatus(pid, DEAD); - //tmpTask = schedFindTask(pid); - //if (sched_deleteTask(pid) != 0x0) - // kpanic("sched_deleteTask: Failed\n"); - //kprintf("Ending Task: (%i:0x%X)\n",tmpTask->id,tmpTask); - //sched_addDelTask(tmpTask); - //tmpTask->state = DEAD; - - //tmpTask->term->owner = tmpTask->parentPid; - - if (pid == _current->id) - while (1) - sched_yield(); sched_yield(); - return; + while (1) + asm("hlt"); + } - -/*** - END - ***/ - diff --git a/sys/kernel/gen_calls.c b/sys/kernel/gen_calls.c index 542b955..f2bac53 100644 --- a/sys/kernel/gen_calls.c +++ b/sys/kernel/gen_calls.c @@ -199,7 +199,13 @@ 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" + "mov $0xF,%eax\n" + "mov %eax,%gs\n" + "pop %eax\n" + ); td->td_retval[0] = 0; } else { kprintf("sysarch(%i,NULL)", args->op); diff --git a/sys/kernel/ld.c b/sys/kernel/ld.c index 2d51c43..59604a8 100644 --- a/sys/kernel/ld.c +++ b/sys/kernel/ld.c @@ -56,7 +56,8 @@ Elf_Addr addr; /* Open our dynamic linker */ - ldFd = fopen("sys:/libexec/ld.so", "rb"); + //ldFd = fopen("sys:/libexec/ld.so", "rb"); + ldFd = fopen("sys:/libexec/ld-elf.so.1", "rb"); if (ldFd == 0x0) { kprintf("Can not open ld.so\n"); diff --git a/sys/vmm/copyvirtualspace.c b/sys/vmm/copyvirtualspace.c index 9d509c5..6abf5cf 100644 --- a/sys/vmm/copyvirtualspace.c +++ b/sys/vmm/copyvirtualspace.c @@ -104,7 +104,6 @@ parentStackPage = (uint32_t *) (((PAGE_SIZE * PD_ENTRIES) * x) + (PAGE_SIZE * i)); /* Copy The Stack Byte For Byte (I Should Find A Faster Way) */ - //kprintf("SP(%i[0x%X]:%i[0x%X]): 0x%X, 0x%X", x, (PAGE_SIZE * PD_ENTRIES) * x, i, i * PAGE_SIZE, newStackPage, parentStackPage); memcpy(newStackPage, parentStackPage, PAGE_SIZE); /* Insert New Stack Into Page Table */ @@ -160,7 +159,6 @@ parentStackPage = (uint32_t *) (((PAGE_SIZE * PD_ENTRIES) * x) + (PAGE_SIZE * i)); /* Copy The Stack Byte For Byte (I Should Find A Faster Way) */ - //kprintf("SP(%i[0x%X]:%i[0x%X]): 0x%X, 0x%X", x, (PAGE_SIZE * PD_ENTRIES) * x, i, i * PAGE_SIZE, newStackPage, parentStackPage); memcpy(newStackPage, parentStackPage, PAGE_SIZE); /* Insert New Stack Into Page Table */ diff --git a/sys/vmm/getfreevirtualpage.c b/sys/vmm/getfreevirtualpage.c index ac09d09..9b047f4 100644 --- a/sys/vmm/getfreevirtualpage.c +++ b/sys/vmm/getfreevirtualpage.c @@ -1,4 +1,4 @@ -/*- + /*- * Copyright (c) 2002-2018 The UbixOS Project. * All rights reserved. * @@ -72,19 +72,24 @@ else K_PANIC("Invalid Type"); + /* Locate Initial Page Table */ - pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); - keepMapping: - if (pdI > PD_INDEX(VMM_USER_END)) + pdI = PD_INDEX(start_page); + + if (pdI > PD_INDEX(VMM_USER_END)) { + map_from = 0x0; goto doneMapping; + } - if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) /* If Page Directory Is Not Yet Allocated Allocate It */ + /* If Page Directory Is Not Yet Allocated Allocate It */ + if ((pageDirectory[pdI] & PAGE_PRESENT) != PAGE_PRESENT) { vmm_allocPageTable(pdI, pid); + } - pageTable = (uint32_t *) (PT_BASE_ADDR + (pdI * 0x1000)); + pageTable = (uint32_t *) (PT_BASE_ADDR + (pdI * PAGE_SIZE)); - ptI = ((start_page - (pdI * (PD_ENTRIES * PAGE_SIZE))) / PAGE_SIZE); + ptI = PT_INDEX(start_page); for (y = ptI; y < PT_ENTRIES && counter < count; y++, counter++) { @@ -94,7 +99,6 @@ kprintf("COW PAGE NOT CLEANED!"); start_page += (PAGE_SIZE * counter); - pdI = ((start_page + ((counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE))); map_from = 0x0; counter = 0; goto keepMapping; @@ -106,7 +110,6 @@ if (counter < count) { start_page += (PAGE_SIZE * counter); - pdI = ((start_page + (counter * PAGE_SIZE)) / (PD_ENTRIES * PAGE_SIZE)); goto keepMapping; } @@ -118,11 +121,11 @@ //_current->oInfo.vmStart += (count * PAGE_SIZE); - for (counter = 0; count < count; counter++) { - if ((vmm_remapPage((uint32_t) vmm_findFreePage(pid), map_from + (counter * PAGE_SIZE), PAGE_DEFAULT, pid, 0)) == 0x0) + for (counter = 0; counter < 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))); + bzero((map_from + (counter * PAGE_SIZE)), PAGE_SIZE); } doneMapping: diff --git a/sys/vmm/pagefault.c b/sys/vmm/pagefault.c index e630ed6..b79422a 100644 --- a/sys/vmm/pagefault.c +++ b/sys/vmm/pagefault.c @@ -61,13 +61,13 @@ uint32_t memAddr = cr2; //MrOlsen 2017-12-15 - - kprintf("CR2: [0x%X], EIP: 0x%X, ERR: 0x%X\n", cr2, frame->tf_eip, frame->tf_err); + kprintf("CR2: [0x%X], EIP: 0x%X, ERR: 0x%X, PID: %i\n", cr2, frame->tf_eip, frame->tf_err, _current->id); /* Try to aquire lock otherwise spin till we do */ spinLock(&pageFaultSpinLock); /* Set page dir pointer to the address of the visable page directory */ - pageDir = (uInt32 *) PD_BASE_ADDR; + pageDir = (uint32_t *) PD_BASE_ADDR; /* UBU - This is a temp panic for 0x0 read write later on I will handle this differently */ if (memAddr == 0x0) { @@ -76,10 +76,10 @@ } /* Calculate The Page Directory Index */ - pageDirectoryIndex = (memAddr >> 22); + pageDirectoryIndex = PD_INDEX(memAddr); /* Calculate The Page Table Index */ - pageTableIndex = ((memAddr >> 12) & 0x3FF); + pageTableIndex = PT_INDEX(memAddr); /* UBU - This is a temporary routine for handling access to a page of a non existant page table */ if (pageDir[pageDirectoryIndex] == 0x0) { @@ -89,10 +89,10 @@ } else { /* Set pageTable To Point To Virtual Address Of Page Table */ - pageTable = (uInt32 *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + pageTable = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * pageDirectoryIndex)); /* Test if this is a COW on page */ - if (((uInt32) pageTable[pageTableIndex] & PAGE_COW) == PAGE_COW) { + if (((uint32_t) pageTable[pageTableIndex] & PAGE_COW) == PAGE_COW) { /* Set Src To Base Address Of Page To Copy */ src = (uInt32 *) (memAddr & 0xFFFFF000); /* Allocate A Free Page For Destination */ @@ -113,7 +113,7 @@ kprintf("Security failed pagetable not user permission\n"); 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); + 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); @@ -128,11 +128,10 @@ /* Need To Create A Routine For Attempting To Access Non Mapped Memory */ 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); + 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 4a1c2bc..5b0e454 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -230,6 +230,7 @@ destPageDirectoryIndex = PD_INDEX(dest); if ((pageDir[destPageDirectoryIndex] & PAGE_PRESENT) != PAGE_PRESENT) { + //kprintf("[NpdI:0x%X]", destPageDirectoryIndex); vmm_allocPageTable(destPageDirectoryIndex, pid); } @@ -262,6 +263,7 @@ pageTable[destPageTableIndex] = (uint32_t) (source | perms); /* Reload The Page Table; */ + rmDone: asm volatile( "push %eax \n" "movl %cr3,%eax\n" @@ -269,7 +271,9 @@ "pop %eax \n" ); - rmDone: +if (dest == 0x1294b000) + kprintf("WOOT: 0x%X, 0x%X", PD_INDEX(dest), PT_INDEX(dest)); + /* Return */ if (haveLock == 0x0) { if (dest >= VMM_USER_START && dest <= VMM_USER_END) @@ -489,7 +493,7 @@ for (x = PT_INDEX(VMM_KERN_START); x <= PT_INDEX(VMM_KERN_END); x++) { if ((pageDirectory[x] & PAGE_PRESENT) != PAGE_PRESENT) /* If Page Directory Is Not Yet Allocated Allocate It */ - vmm_allocatePageTable(x, sysID); + vmm_allocPageTable(x, sysID); pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * x)); diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 416b369..0d1a1ff 100644 --- a/sys/vmm/vmm_mmap.c +++ b/sys/vmm/vmm_mmap.c @@ -182,7 +182,6 @@ } td->td_retval[0] = vmm_getFreeVirtualPage(_current->id, round_page( uap->len ) / 0x1000, VM_TASK); - 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)); }