diff --git a/src/sys/drivers/pit.c b/src/sys/drivers/pit.c index 14f0664..aa4838b 100755 --- a/src/sys/drivers/pit.c +++ b/src/sys/drivers/pit.c @@ -1,3 +1,4 @@ //outportByte(0x43,0x36); - //outportByte(0x40,((1193180/1000) & 0xFF)); - //outportByte(0x40,(((1193180/1000) << 8) & 0xFF)); \ No newline at end of file + //outportByte(0x40,((1193180/1000) & 0x00FF)); + //outportByte(0x40,(((1193180/1000) >> 8) & 0x00FF)); + \ No newline at end of file diff --git a/src/sys/include/ubixos/idt.h b/src/sys/include/ubixos/idt.h index 4a4cdfe..c31d78b 100755 --- a/src/sys/include/ubixos/idt.h +++ b/src/sys/include/ubixos/idt.h @@ -42,5 +42,6 @@ void _int11(); void _int12(); void _int13(); +void timerInt(); #endif \ No newline at end of file diff --git a/src/sys/include/ubixos/vitals.h b/src/sys/include/ubixos/vitals.h index 05dfb14..09708c4 100755 --- a/src/sys/include/ubixos/vitals.h +++ b/src/sys/include/ubixos/vitals.h @@ -28,6 +28,8 @@ typedef struct vitalsStruct { uLong openFiles; + uLong sysTicks; + uLong sysUptime; } vitalsNode; extern vitalsNode *systemVitals; diff --git a/src/sys/init/main.c b/src/sys/init/main.c index a420133..d7e4175 100755 --- a/src/sys/init/main.c +++ b/src/sys/init/main.c @@ -36,6 +36,16 @@ #include #include +#define outb_p(value,port) \ +__asm__ ("outb %%al,%%dx\n" \ + "\tjmp 1f\n" \ + "1:\tjmp 1f\n" \ + "1:"::"a" (value),"d" (port)) + + +#define outb(value,port) \ +__asm__ ("outb %%al,%%dx"::"a" (value),"d" (port)) + descriptorTable(GDT,6) { {dummy:0}, @@ -104,6 +114,9 @@ execThread(idleThread,0xAFFF,"Idle Thread"); execFile("init"); kprintf("Free Pages: [%i]\n",freePages); + outportByteP(0x43,0x3C); + outportByteP(0x40,((1193180/1000) & 0x00FF)); + outportByte(0x40,(((1193180/1000) >> 8) & 0x00FF)); enableIrq(0); while (1); } diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index 18aafc1..6005a27 100755 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -134,7 +134,7 @@ _current->tss.gs = 0x10; _current->tss.ldt = 0x18; _current->tss.trace_bitmap = 0x80000000; - _current->status = READY; + _current->status = 1; //Switch Back To The Kernels VM Space asm( "movl %0,%%eax \n" @@ -180,7 +180,7 @@ newProcess->tss.gs = 0x10; newProcess->tss.ldt = 0x18; newProcess->tss.trace_bitmap = 0x80000000; - newProcess->status = READY; + newProcess->status = 1; //Return return; } diff --git a/src/sys/kernel/idlethread.c b/src/sys/kernel/idlethread.c index ab9e0db..6784238 100755 --- a/src/sys/kernel/idlethread.c +++ b/src/sys/kernel/idlethread.c @@ -29,7 +29,7 @@ void idleThread() { while (1) { - asm("nop"); + asm("hlt"); //checkTasks(); /* Looks for run away proccesses and kills thems */ } } diff --git a/src/sys/kernel/idt.c b/src/sys/kernel/idt.c index 5d4bb85..c1ffa29 100755 --- a/src/sys/kernel/idt.c +++ b/src/sys/kernel/idt.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -36,7 +37,7 @@ unsigned short limit __attribute__ ((packed)); union descriptorTableunion *idt __attribute__ ((packed)); } loadidt= { (256 * sizeof(union descriptorTableunion) - 1), IDT }; - + /* Sets Up Initial IDT Table */ void initIdt() { int i=0; @@ -69,6 +70,7 @@ setVector(&_int13,13,dPresent + dTrap + dDpl1); setVector(&_pageFault,14,dPresent + dTrap + dDpl1); setVector(&_sysCall,128,dPresent + dTrap + dDpl1); + setVector(timerInt,0x68, (dInt + dPresent + dDpl3)); } /* Sets Up IDT Vector */ @@ -174,3 +176,34 @@ kprintf("int13: General Protection Fault!\n"); while(1); } + +/* Timer Interupt */ +__asm__ ( + ".globl timerInt \n" + "timerInt: \n" + " pusha \n" + " movl systemVitals,%ecx \n" + " incl 4(%ecx) \n" + " mov $0x20,%dx \n" + " mov $0x20,%ax \n" + " outb %al,%dx \n" + " movl 4(%ecx),%eax \n" + " movl $1000,%ebx \n" + " xor %edx,%edx \n" + " div %ebx \n" + " test %edx,%edx \n" + " jnz next \n" + " incl 8(%ecx) \n" + "next: \n" + " movl 4(%ecx),%eax \n" + " movl $5,%ebx \n" + " xor %edx,%edx \n" + " div %ebx \n" + " test %edx,%edx \n" + " jnz done \n" + " call schedule \n" + " jmp done \n" + "done: \n" + " popa \n" + " iret \n" + ); \ No newline at end of file diff --git a/src/sys/kernel/io.c b/src/sys/kernel/io.c index 7f7ae15..3a25253 100755 --- a/src/sys/kernel/io.c +++ b/src/sys/kernel/io.c @@ -72,6 +72,24 @@ /************************************************************************ +Function: inline void outportByteP(unsigned int port,unsigned char value); +Description: This Funciton Will Outputut One Byte To A Port With A Delay +Notes: + +************************************************************************/ +inline void outportByteP(unsigned int port,unsigned char value) { + asm volatile( + "outb %%al,%%dx\n" + "jmp 1f \n" + "1: jmp 1f \n" + "1: \n" + : + : "d" (port), "a" (value) + ); + } + +/************************************************************************ + Function: inline void outportWord(unsigned int port,unsigned char value); Description: This Funciton Will Outputut One Word To A Port Notes: diff --git a/src/sys/kernel/panic.c b/src/sys/kernel/panic.c index 31fa0a1..8526483 100755 --- a/src/sys/kernel/panic.c +++ b/src/sys/kernel/panic.c @@ -25,7 +25,8 @@ #include void panic() { - kprintf("System Panic!\nHalting Machine!\n"); + kprintf("System Panic Occurred!\nHalting Machine!\n"); + disableIrq(0); while (1) { asm("hlt"); } diff --git a/src/sys/kernel/schedule.c b/src/sys/kernel/schedule.c index 004b7e6..82dc502 100755 --- a/src/sys/kernel/schedule.c +++ b/src/sys/kernel/schedule.c @@ -55,202 +55,126 @@ int switches = 0; uint8_t paniced = 0; -void kpanic(char * mess) -{ - kprintf(mess); - paniced = 1; - schedule(); -} +void kpanic(char * mess) { + kprintf(mess); + paniced = 1; + schedule(); + } -void kmemset(void * dest, char value, int size) -{ - size--; - while(size >= 0) - ((char *)dest)[size--] = value; -} +void kmemset(void * dest, char value, int size) { + size--; + while(size >= 0) + ((char *)dest)[size--] = value; + } -void initScheduler(void) -{ - //kprintf(">>Init\n"); +void initScheduler(void) { + kTask_t * firstTask = 0x0; + kprintf(">>Init\n"); - spinlockInit(&schedSpinlock); - waitQueueInit(&taskQueue, 0); + spinlockInit(&schedSpinlock); + waitQueueInit(&taskQueue, 0); // create -1 task. - kTask_t * firstTask = kmalloc(sizeof(kTask_t)); - //kprintf("from malloc %08x\n", firstTask); - if (firstTask == NULL) - kpanic("Scheduler Init: Couldn't allocate first task"); - - firstTask->id = -1; - firstTask->status = EMPTY; - waitQueueInsert(&taskQueue, firstTask, firstTask->id); - - currentProc = -1; - _current = firstTask; - - //kprintf("<id = -1; + firstTask->status = EMPTY; + waitQueueInsert(&taskQueue, firstTask, firstTask->id); currentProc = -1; - _current = &taskList[-1]; - - spinlockInit(&schedSpinlock); - - setVector(timerInt, mVec, (dInt + dPresent + dDpl3)); + _current = firstTask; + kprintf("<>FindTask\n"); - kprintf(">>FindTask\n"); + newTask = kmalloc(sizeof(kTask_t)); + kprintf("from malloc %08x\n", newTask); + if (newTask == NULL) + kpanic("Scheduler: Couldn't allocate memory for new task"); - kTask_t * newTask = kmalloc(sizeof(kTask_t)); - //kprintf("from malloc %08x\n", newTask); - if (newTask == NULL) - kpanic("Scheduler: Couldn't allocate memory for new task"); - - spinlockLock(&schedSpinlock, CURRENT_CPU); + spinlockLock(&schedSpinlock, CURRENT_CPU); - kmemset(newTask, '\0', sizeof(kTask_t)); - lastPid++; - newTask->id = lastPid; - newTask->status = EMPTY; - newTask->usedMath=0; - newTask->cpuTime = 0; - newTask->uid = -1; - newTask->gid = -1; + kmemset(newTask, '\0', sizeof(kTask_t)); + lastPid++; + newTask->id = lastPid; + newTask->status = EMPTY; + newTask->usedMath=0; + newTask->cpuTime = 0; + newTask->uid = -1; + newTask->gid = -1; - numTasks++; + numTasks++; - waitQueueInsert(&taskQueue, newTask, newTask->id); - spinlockUnlock(&schedSpinlock, CURRENT_CPU); + waitQueueInsert(&taskQueue, newTask, newTask->id); + spinlockUnlock(&schedSpinlock, CURRENT_CPU); - kprintf("<= (numTasks-1)) { - i = 0; - } - for (;i>getTask\n"); - - spinlockLock(&schedSpinlock, CURRENT_CPU); - temp = waitQueueFind(&taskQueue, taskId); - spinlockUnlock(&schedSpinlock, CURRENT_CPU); +kTask_t * getTask(int taskId) { + kTask_t * temp; - //kprintf("<>getTask\n"); + spinlockLock(&schedSpinlock, CURRENT_CPU); + temp = waitQueueFind(&taskQueue, taskId); + spinlockUnlock(&schedSpinlock, CURRENT_CPU); + kprintf("<>schedule\n"); - - outportByte(0x20, 0x20); - - if (paniced == 1) - while (1) - asm("nop;nop;nop;nop;nop"); - - if (numTasks == 0) - return; - spinlockLock(&schedSpinlock, CURRENT_CPU); - - chooseTask = currentProc + 1; - - while ((getTask(chooseTask)->status != READY) && - (getTask(chooseTask)->status != RUNNING) && (loopCount < 4)) - { - chooseTask++; - chooseTask %= numTasks; - if (chooseTask == 0) - loopCount++; - //kprintf("Trying: %d\n", chooseTask); - //kprintf("numtasks: %d\n", numTasks); + kprintf(">>schedule\n"); + if (paniced == 1) + while (1) + asm("nop;nop;nop;nop;nop"); + if (numTasks == 0) + return; + spinlockLock(&schedSpinlock, CURRENT_CPU); + chooseTask = currentProc + 1; + while ((getTask(chooseTask)->status != READY) && (getTask(chooseTask)->status != RUNNING) && (loopCount < 4)) { + kprintf("Status: [%i][%i][%i]\n",getTask(chooseTask)->status,READY,RUNNING); + chooseTask++; + chooseTask %= numTasks; + if (chooseTask == 0) + loopCount++; + kprintf("Trying: %d\n", chooseTask); + kprintf("numtasks: %d\n", numTasks); } - if (loopCount == 4) - chooseTask = -1; - kprintf("Found one %d\n", chooseTask); - if (chooseTask != -1) - { - if (getTask(chooseTask)->status == RUNNING) - { - getTask(chooseTask)->status = READY; - } - currentProc = chooseTask; - _current = getTask(chooseTask); - getTask(chooseTask)->status = RUNNING; - getTask(chooseTask)->cpuTime++; - memAddr = (uint32_t) &(getTask(chooseTask)->tss); - GDT[4].descriptor.baseLow = (memAddr & 0xFFFF); - GDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xFF); - GDT[4].descriptor.baseHigh = (memAddr >> 24); - - //kprintf("Spinlock try\n"); - spinlockUnlock(&schedSpinlock, CURRENT_CPU); - //kprintf("Spinlock complete\n"); - - kprintf("<status == RUNNING) { + getTask(chooseTask)->status = READY; + } + currentProc = chooseTask; + _current = getTask(chooseTask); + getTask(chooseTask)->status = RUNNING; + getTask(chooseTask)->cpuTime++; + memAddr = (uint32_t) &(getTask(chooseTask)->tss); + GDT[4].descriptor.baseLow = (memAddr & 0xFFFF); + GDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xFF); + GDT[4].descriptor.baseHigh = (memAddr >> 24); + kprintf("Spinlock try\n"); spinlockUnlock(&schedSpinlock, CURRENT_CPU); -} + kprintf("Spinlock complete\n"); + kprintf("<openFiles = 0x0; + systemVitals->sysTicks = 0x0; + systemVitals->sysUptime = 0x0; //Return return; } \ No newline at end of file diff --git a/src/sys/vmm/paging.c b/src/sys/vmm/paging.c index 9543625..a94d2ef 100755 --- a/src/sys/vmm/paging.c +++ b/src/sys/vmm/paging.c @@ -202,8 +202,9 @@ pageTable = (uLong *)(tablesBaseAddress + (4096 * pageDirectoryIndex)); //Free The Physical Page If Flags Is 0 if (flags == 0) { - //clearVirtualPage(pageAddr); - //freePage((uLong)(pageTable[pageTableIndex] & 0xFFFFF000)); + //kprintf("Test\n"); + clearVirtualPage(pageAddr); + freePage((uLong)(pageTable[pageTableIndex] & 0xFFFFF000)); } //Unmap The Page pageTable[pageTableIndex] = 0x0; @@ -627,7 +628,7 @@ kprintf("Segfault At Address: [0x%x][%i]\n",memAddr,_current->id); freeProcessPages(_current->id); _current->status = EMPTY; - if (_current->id < -1) { + if (_current->id <= -1) { panic(); } schedule(); @@ -654,10 +655,10 @@ } else { //Need To Create A Routine For Attempting To Access Non Mapped Memory - kprintf("Segfault At Address: [0x%x][%i]\n",memAddr,_current->id); + kprintf("Segfault At Address: [0x%X][%i]\n",memAddr,_current->id); freeProcessPages(_current->id); _current->status = EMPTY; - if (_current->id < -1) { + if (_current->id <= -1) { panic(); } schedule();