diff --git a/src/sys/init/main.c b/src/sys/init/main.c index d7e4175..6f7be5f 100755 --- a/src/sys/init/main.c +++ b/src/sys/init/main.c @@ -36,17 +36,6 @@ #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}, standardDescriptor(0x0, 0xFFFFF, (dCode + dRead + dBig + dBiglim)), @@ -114,9 +103,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)); + //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 6005a27..92b6688 100755 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -134,13 +134,15 @@ _current->tss.gs = 0x10; _current->tss.ldt = 0x18; _current->tss.trace_bitmap = 0x80000000; - _current->status = 1; + _current->status = READY; //Switch Back To The Kernels VM Space asm( "movl %0,%%eax \n" "movl %%eax,%%cr3 \n" : : "d" ((uLong *)(kernelPageDirectory)) ); + //kprintf("Temp: [%i](%i)\n",getTask(0),getTask(0)->status); + //while(1); //Finally Return return; } @@ -157,6 +159,7 @@ kTask_t * newProcess; //Find A New Thread newProcess = findTask(); + //kprintf("newProcess: [%i](%i)\n",newProcess,newProcess->status); //Set All The Correct Thread Attributes newProcess->tss.back_link = 0x0; newProcess->tss.esp0 = 0x5000; @@ -180,7 +183,12 @@ newProcess->tss.gs = 0x10; newProcess->tss.ldt = 0x18; newProcess->tss.trace_bitmap = 0x80000000; - newProcess->status = 1; + newProcess->status = READY; + //kprintf("newProcess: [%i](%i){%i}\n",newProcess,newProcess->status,newProcess->id); + //newProcess = getTask(0); + //kprintf("newProcess: [%i](%i){%i}\n",newProcess,newProcess->status,newProcess->id); + //kprintf("Temp: [%i](%i)\n",getTask(0),getTask(0)->status); + //while(1); //Return return; } diff --git a/src/sys/kernel/fork.c b/src/sys/kernel/fork.c index 9e0ce55..805b388 100755 --- a/src/sys/kernel/fork.c +++ b/src/sys/kernel/fork.c @@ -74,7 +74,7 @@ : "g" (newProcess->tss.esp), "g" (newProcess->tss.ebp) ); newProcess->tss.cr3 = (long)copyVirtualSpace(newProcess->id); - newProcess->status = RUNNING; + newProcess->status = READY; childStart: if (ret == 0) { asm("":"=b" (ret)); diff --git a/src/sys/kernel/idt.c b/src/sys/kernel/idt.c index c1ffa29..14dbd60 100755 --- a/src/sys/kernel/idt.c +++ b/src/sys/kernel/idt.c @@ -196,7 +196,7 @@ " incl 8(%ecx) \n" "next: \n" " movl 4(%ecx),%eax \n" - " movl $5,%ebx \n" + " movl $500,%ebx \n" " xor %edx,%edx \n" " div %ebx \n" " test %edx,%edx \n" diff --git a/src/sys/kernel/schedule.c b/src/sys/kernel/schedule.c index 82dc502..7ade282 100755 --- a/src/sys/kernel/schedule.c +++ b/src/sys/kernel/schedule.c @@ -69,7 +69,7 @@ void initScheduler(void) { kTask_t * firstTask = 0x0; - kprintf(">>Init\n"); + //kprintf(">>Init\n"); spinlockInit(&schedSpinlock); waitQueueInit(&taskQueue, 0); @@ -77,7 +77,7 @@ // create -1 task. firstTask = kmalloc(sizeof(kTask_t)); - kprintf("from malloc %08x\n", firstTask); + //kprintf("from malloc %08x\n", firstTask); if (firstTask == NULL) kpanic("Scheduler Init: Couldn't allocate first task"); firstTask->id = -1; @@ -85,16 +85,16 @@ waitQueueInsert(&taskQueue, firstTask, firstTask->id); currentProc = -1; _current = firstTask; - kprintf("<>FindTask\n"); + //kprintf(">>FindTask\n"); newTask = kmalloc(sizeof(kTask_t)); - kprintf("from malloc %08x\n", newTask); + //kprintf("from malloc %08x\n", newTask); if (newTask == NULL) kpanic("Scheduler: Couldn't allocate memory for new task"); @@ -114,19 +114,19 @@ waitQueueInsert(&taskQueue, newTask, newTask->id); spinlockUnlock(&schedSpinlock, CURRENT_CPU); - kprintf("<status); return newTask; } kTask_t * getTask(int taskId) { kTask_t * temp; - kprintf(">>getTask\n"); + //kprintf(">>getTask\n"); spinlockLock(&schedSpinlock, CURRENT_CPU); temp = waitQueueFind(&taskQueue, taskId); spinlockUnlock(&schedSpinlock, CURRENT_CPU); - kprintf("<>schedule\n"); + //kprintf(">>schedule\n"); if (paniced == 1) while (1) asm("nop;nop;nop;nop;nop"); @@ -143,7 +143,12 @@ return; spinlockLock(&schedSpinlock, CURRENT_CPU); chooseTask = currentProc + 1; +/* if (chooseTask >= numTasks) { + chooseTask = 0; + } */ + kprintf("chooseTask: [%i]\n",chooseTask); while ((getTask(chooseTask)->status != READY) && (getTask(chooseTask)->status != RUNNING) && (loopCount < 4)) { +// 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; @@ -164,84 +169,28 @@ getTask(chooseTask)->status = RUNNING; getTask(chooseTask)->cpuTime++; memAddr = (uint32_t) &(getTask(chooseTask)->tss); + GDT[4].descriptor.access = 0x89; GDT[4].descriptor.baseLow = (memAddr & 0xFFFF); GDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xFF); GDT[4].descriptor.baseHigh = (memAddr >> 24); - kprintf("Spinlock try\n"); + //kprintf("Spinlock try\n"); spinlockUnlock(&schedSpinlock, CURRENT_CPU); - kprintf("Spinlock complete\n"); - kprintf("<id,numTasks); asm("ljmp $0x20,$0\n"); } spinlockUnlock(&schedSpinlock, CURRENT_CPU); } -/* -void schedule() { - int i,proc = -1,memAddr; - outportByte(0x20, 0x20); - if (paniced == 1) - while (1) - asm("nop;nop;nop;nop;nop"); - - spinlockLock(&schedSpinlock, CURRENT_CPU); - i = currentProc + 1; - while ((taskList[i].status != READY) && (taskList[i].status != RUNNING)) - { - i++; - i %= numTasks; - } - proc = i; - if (proc != -1) { - if (taskList[currentProc].status == RUNNING) - { - taskList[currentProc].status = READY; - } - currentProc = proc; - _current = &taskList[proc]; - taskList[proc].status = RUNNING; - taskList[proc].cpuTime++; - memAddr = (unsigned int)&taskList[proc].tss; - GDT[4].descriptor.access = 0x89; - GDT[4].descriptor.baseLow = (memAddr & 0xFFFF); - GDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xff); - GDT[4].descriptor.baseHigh = (memAddr >> 24); - //kprintf("Task: [%i][%i][%i]\n",_current->id,_current->tss.cr3,&_current->tss.cr3); - - spinlockUnlock(&schedSpinlock, CURRENT_CPU); - - asm("ljmp $0x20,$0\n"); - } - } -*/ - -/* Timer Interupt */ -/* -asm ( - ".globl timerInt \n" - "timerInt: \n" - " pusha \n" - " call schedule \n" - " popa \n" - " iret \n" - ); -*/ - -// New stuff commented out for now. - -waitQueue_t * waitQueueCreate(int type) -{ - waitQueue_t * queue = (waitQueue_t *) kmalloc(sizeof(waitQueue_t)); - - if (queue == NULL) - return NULL; - - kmemset(queue, '\0', sizeof(waitQueue_t)); - - queue->magic_number = schedMagicNumber; - queue->type = type; - - return queue; +waitQueue_t * waitQueueCreate(int type) { + waitQueue_t * queue = (waitQueue_t *) kmalloc(sizeof(waitQueue_t)); + if (queue == NULL) + return NULL; + kmemset(queue, '\0', sizeof(waitQueue_t)); + queue->magic_number = schedMagicNumber; + queue->type = type; + return queue; } void waitQueueInit(waitQueue_t * queue, int type) @@ -298,47 +247,36 @@ kmemset(queue, '\0', sizeof(waitQueue_t)); } -void waitQueueInsert(waitQueue_t * queue, void * data, int id) -{ - struct waitQueueNode * temp; - - //kprintf("Here. %d\n", id); - - if (queue == NULL) - return; - - if (queue->magic_number != schedMagicNumber) - return; - - temp = NULL; - temp = (struct waitQueueNode *) kmalloc(sizeof(struct waitQueueNode)); - //kprintf("from malloc %08x\n", temp); - //kprintf("Ye.\n"); - kmemset(temp, '\0', sizeof(struct waitQueueNode)); - //kprintf("Yo.\n"); - temp->prev = temp->next = NULL; - - if (queue->first == NULL) - { - kprintf("head was NULL.\n"); - queue->first = queue->last = temp; - } - else - { - queue->last->next = temp; - temp->prev = queue->last; - queue->last = temp; - } - - temp->data = data; - temp->id = id; - - kprintf("Queue head = %08x\n", queue->first); - kprintf("Queue tail = %08x\n", queue->last); - kprintf("Sizeof = %d\n", sizeof(waitQueue_t)); - - return; -} +void waitQueueInsert(waitQueue_t * queue, void * data, int id) { + struct waitQueueNode * temp = 0x0; + //kprintf("Here. %d\n", id); + if (queue == NULL) + return; + if (queue->magic_number != schedMagicNumber) + return; + temp = (struct waitQueueNode *) kmalloc(sizeof(struct waitQueueNode)); + //kprintf("from malloc %08x\n", temp); + kprintf("Ye.\n"); + kmemset(temp, '\0', sizeof(struct waitQueueNode)); + //kprintf("Yo.\n"); + temp->prev = temp->next = NULL; + if (queue->first == NULL) { + //kprintf("head was NULL.\n"); + queue->first = queue->last = temp; + } + else { + queue->last->next = temp; + temp->prev = queue->last; + queue->last = temp; + } + //kprintf("Data: [%i]\n",data); + temp->data = data; + temp->id = id; + //kprintf("Queue head = %08x\n", queue->first); + //kprintf("Queue tail = %08x\n", queue->last); + //kprintf("Sizeof = %d\n", sizeof(waitQueue_t)); + return; + } void * waitQueueRemove(waitQueue_t * queue, int * id) { @@ -374,38 +312,30 @@ } -void * waitQueueFind(waitQueue_t * queue, int id) -{ - struct waitQueueNode * temp; - - if (queue == NULL) - return NULL; - - if (queue->magic_number != schedMagicNumber) - return NULL; - - if (queue->first == NULL) - return NULL; - - temp = queue->first; - - //kprintf (">>while\n"); - - while ((temp->id != id) && (temp->next != NULL)) - { - //kprintf("id = %d\n", id); - //kprintf("temp->id: %d\n", temp->id); - //kprintf("temp->next: %08x\n", temp->next); - temp = temp->next; +void * waitQueueFind(waitQueue_t * queue, int id) { + struct waitQueueNode * temp = 0x0; + if (queue == NULL) + return NULL; + if (queue->magic_number != schedMagicNumber) + return NULL; + if (queue->first == NULL) + return NULL; + temp = queue->first; + //kprintf (">>while\n"); + while ((temp->id != id) && (temp->next != NULL)) { + //while (temp->id != id) { + //kprintf("id = %d\n", id); + //kprintf("temp->id: %d\n", temp->id); + //kprintf("temp->next: %08x\n", temp->next); + temp = temp->next; } //while(1) // ; - - //kprintf("<id == id) - return temp; - - return NULL; + //kprintf("Out Of Loop: [%i][%i]\n",temp,temp->id); + //kprintf("<id == id) { + return(temp->data); + } + return(NULL); }