diff --git a/sys/i386/sched.c b/sys/i386/sched.c index f8b09f2..72d942a 100644 --- a/sys/i386/sched.c +++ b/sys/i386/sched.c @@ -90,15 +90,16 @@ return; tmpTask = ((_current == 0) ? 0 : _current->next); - //outportByte(0xE9,_current->id + '0'); schedStart: /* Yield the next task from the current prio queue */ for (; tmpTask != 0x0; tmpTask = tmpTask->next) { - if (tmpTask->state > 0x0) { + if (tmpTask->state == FORK) + tmpTask->state = READY; + + if (tmpTask->state == READY) { + _current->state = READY; _current = tmpTask; - if (_current->state == FORK) - _current->state = READY; break; } else if (tmpTask->state == DEAD) { @@ -106,7 +107,9 @@ if (delTask->parent != 0x0) { delTask->parent->children -= 1; delTask->parent->last_exit = delTask->id; + schedSetStatus(delTask->parent->id, READY); } + tmpTask = tmpTask->next; sched_deleteTask(delTask->id); sched_addDelTask(delTask); @@ -120,7 +123,7 @@ goto schedStart; } - if (_current->state > 0x0) { + if (_current->state == READY) { if (_current->oInfo.v86Task == 0x1) irqDisable(0x0); @@ -133,26 +136,12 @@ ubixGDT[4].descriptor.baseHigh = (memAddr >> 24); ubixGDT[4].descriptor.access = '\x89'; - /* Not Sure Why I Was Doing This? I Am Commenting Out For Now To See What HAppens */ - /* - // memAddr = STACK_ADDR; //(uint32_t) & (_current->tss); - ubixGDT[10].descriptor.baseLow = (STACK_ADDR & 0xFFFF); - ubixGDT[10].descriptor.baseMed = ((STACK_ADDR >> 16) & 0xFF); - ubixGDT[10].descriptor.baseHigh = (STACK_ADDR >> 24); - //ubixGDT[10].descriptor.access = '\x89'; - */ + _current->state = RUNNING; + spinUnlock(&schedulerSpinLock); - if (_current->id == 600) { - kprintf("EIP: 0x%X", _current->tss.eip); - kprintf("esp0: 0x%X", _current->tss.esp0); - kprintf("user_esp: 0x%X", _current->tss.esp); - } - asm("sti"); - asm( - "ljmp $0x20,$0\n" - ); + asm("ljmp $0x20,$0"); } else { spinUnlock(&schedulerSpinLock); diff --git a/sys/kernel/gen_calls.c b/sys/kernel/gen_calls.c index 718c95e..5898b77 100644 --- a/sys/kernel/gen_calls.c +++ b/sys/kernel/gen_calls.c @@ -145,37 +145,40 @@ int sys_wait4(struct thread *td, struct sys_wait4_args *args) { int error = 0; - //MrOlsen 2018kprintf("wait4: %i", args->pid); - if (args->pid == -1) { if (_current->children <= 0) { - td->td_retval[0] = ECHILD; - return(-1); + td->td_retval[0] = ECHILD; + return (-1); } int children = _current->children; - while (_current->children == children) + while (_current->children == children) { + schedSetStatus(_current->id, WAIT); sched_yield(); + } td->td_retval[0] = _current->last_exit; td->td_retval[1] = 0x8; - return(0x0); - } else { - - kTask_t *tmpTask = schedFindTask(args->pid); - - if (tmpTask != 0x0) { - while (tmpTask != 0x0) { - sched_yield(); - tmpTask = schedFindTask(args->pid); - } - td->td_retval[0] = args->pid; - } else { - td->td_retval[0] = -1; - error = -1; + return (0x0); } + else { + + kTask_t *tmpTask = schedFindTask(args->pid); + + if (tmpTask != 0x0) { + while (tmpTask != 0x0) { + schedSetStatus(_current->id, WAIT); + sched_yield(); + tmpTask = schedFindTask(args->pid); + } + td->td_retval[0] = args->pid; + } + else { + td->td_retval[0] = -1; + error = -1; + } } return (error); } @@ -199,17 +202,18 @@ tmpDesc->limitHigh = (0xFFFFF >> 16); tmpDesc->granularity = ((dData + dWrite + dBig + dBiglim + dDpl3) & 0xFF) >> 4; tmpDesc->baseHigh = base_addr >> 24; -/* - asm( + /* + asm( "push %eax\n" "lgdtl (loadGDT)\n" "mov $0xF,%eax\n" "mov %eax,%gs\n" "pop %eax\n" - ); -*/ + ); + */ td->td_retval[0] = 0; - } else { + } + else { kprintf("sysarch(%i,NULL)", args->op); td->td_retval[0] = -1; } @@ -248,30 +252,36 @@ if (args->set != 0x0) { memcpy(&td->sigmask, args->set, sizeof(sigset_t)); td->td_retval[0] = 0; - } else { + } + else { td->td_retval[0] = -1; } - } else if (args->how == SIG_BLOCK) { + } + else if (args->how == SIG_BLOCK) { if (args->set != 0x0) { td->sigmask.__bits[0] &= args->set->__bits[0]; td->sigmask.__bits[1] &= args->set->__bits[1]; td->sigmask.__bits[2] &= args->set->__bits[2]; td->sigmask.__bits[3] &= args->set->__bits[3]; td->td_retval[0] = 0; - } else { + } + else { td->td_retval[0] = -1; } - } else if (args->how == SIG_UNBLOCK) { + } + else if (args->how == SIG_UNBLOCK) { if (args->set != 0x0) { td->sigmask.__bits[0] |= args->set->__bits[0]; td->sigmask.__bits[1] |= args->set->__bits[1]; td->sigmask.__bits[2] |= args->set->__bits[2]; td->sigmask.__bits[3] |= args->set->__bits[3]; td->td_retval[0] = 0; - } else { + } + else { td->td_retval[0] = -1; } - } else { + } + else { kprintf("SPM: 0x%X", args->how); td->td_retval[0] = -1; } @@ -309,22 +319,26 @@ if (args->pgid == 0x0 || args->pgid == _current->id) { td->td_retval[0] = 0x0; _current->pgrp = _current->id; - } else { + } + else { td->td_retval[0] = -1; } - } else { + } + else { kTask_t *tmpTask = schedFindTask(pid); if (tmpTask == 0x0) { td->td_retval[0] = -1; - } else { + } + else { /* Get The PRGP We Want To Set */ pgrp = (args->pgid == 0) ? tmpTask->pgrp : args->pgid; if (pgrp != _current->pgrp || pgrp != tmpTask->id) { td->td_retval[0] = -1; - } else { + } + else { td->td_retval[0] = 0x0; tmpTask->pgrp = pgrp; }