diff --git a/src/bin/shell/commands.c b/src/bin/shell/commands.c index 0c0380a..9fb7478 100644 --- a/src/bin/shell/commands.c +++ b/src/bin/shell/commands.c @@ -59,6 +59,21 @@ } } } + else if (memcmp(data->args->arg,"test2", 5) == 0) { + for (i=0x0;i<5;i++) { + cPid = fork(); + if (cPid == 0x0) { + printf("Pid: [%i:%i]\n",cPid,i); + sched_yield(); + exit(0x1); + } + else { + printf("Childs Pid: [%i]\n",cPid); + while (pidStatus(cPid) > 0) + sched_yield(); + } + } + } else if (memcmp(data->args->arg,"echo",4) == 0) { for (i=1;iargc;i++) { printf("%s ",data->argv[i]); diff --git a/src/sys/include/lib/kmalloc.h b/src/sys/include/lib/kmalloc.h index 3d068f2..741f6ee 100644 --- a/src/sys/include/lib/kmalloc.h +++ b/src/sys/include/lib/kmalloc.h @@ -50,26 +50,17 @@ void kfree(void *baseAddr); void *kmalloc(uInt32 len); -void initMalloc(); -void *getEmptyDesc(); -void insertFreeDesc(struct memDescriptor *freeDesc); -void mergeMemBlocks(); -void kfreeProcess(pidType pid); - -extern struct memDescriptor *kernDesc; -extern struct memDescriptor *freeKernDesc; -extern struct memDescriptor *emptyKernDesc; - -extern int mallocLock; #ifdef __cplusplus -} + } #endif #endif /*** $Log$ + Revision 1.3 2004/05/21 15:00:27 reddawg + Cleaned up END ***/ diff --git a/src/sys/include/ubixos/sched.h b/src/sys/include/ubixos/sched.h index b79c2bd..d5e08b8 100644 --- a/src/sys/include/ubixos/sched.h +++ b/src/sys/include/ubixos/sched.h @@ -65,6 +65,7 @@ struct tssStruct tss; struct i387Struct i387; struct osInfo oInfo; + fileDescriptor *imageFd; tState state; uInt32 gid; uInt32 uid; @@ -104,6 +105,10 @@ /*** $Log$ + Revision 1.9 2004/07/09 13:23:20 reddawg + sched: schedInit to sched_init + Adjusted initialization routines + Revision 1.8 2004/06/22 14:02:14 solar Added the PLACEHOLDER state for a task diff --git a/src/sys/kernel/endtask.c b/src/sys/kernel/endtask.c index d062adc..6de259f 100644 --- a/src/sys/kernel/endtask.c +++ b/src/sys/kernel/endtask.c @@ -1,4 +1,4 @@ -/***************************************************************************************** + /***************************************************************************************** Copyright (c) 2002-2004 The UbixOS Project All rights reserved. @@ -36,7 +36,11 @@ void endTask(pidType pid) { //kprintf("Ending Task: [%i:%i:%i]\n",pid,_current->id,systemVitals->freePages); vmmFreeProcessPages(pid); - //kprintf("Ending Task: [%i:%i:%i]\n",pid,_current->id,systemVitals->freePages); + if (_current->imageFd) + fclose(_current->imageFd); + //kfree(_current->oInfo.cwd); + kprintf("Ending Task: [%i:%i:%i]\n",pid,_current->id,systemVitals->freePages); + //schedDeleteTask(_current->id); _current->state = DEAD; schedYield(); /* I'm pretty sure we need this if the thread is ending itself */ return; @@ -44,6 +48,9 @@ /*** $Log$ + Revision 1.5 2004/06/26 01:24:44 reddawg + Fixens + Revision 1.4 2004/06/25 17:25:52 reddawg I am cleaning too diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index 0fb9da9..e98c820 100644 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -346,6 +346,7 @@ tmpFd = fopen(file,"r"); + _current->imageFd = tmpFd; /* If We Dont Find the File Return */ if (tmpFd == 0x0) { @@ -451,6 +452,9 @@ /*** $Log$ + Revision 1.41 2004/07/17 03:10:18 reddawg + Added asserts no problems thusfar + Revision 1.40 2004/06/28 23:12:58 reddawg file format now container:/path/to/file diff --git a/src/sys/kernel/fork.c b/src/sys/kernel/fork.c index 5e49c3b..3c08427 100644 --- a/src/sys/kernel/fork.c +++ b/src/sys/kernel/fork.c @@ -99,7 +99,7 @@ newProcess->tss.cr3 = (uInt32)vmmCopyVirtualSpace(newProcess->id); newProcess->oInfo.curDir = _current->oInfo.curDir; newProcess->oInfo.container = _current->oInfo.container; - newProcess->oInfo.cwd = _current->oInfo.cwd; + sprintf(newProcess->oInfo.cwd,_current->oInfo.cwd); newProcess->state = READY; /* Return Id of Proccess */ return(newProcess->id); @@ -107,6 +107,9 @@ /*** $Log$ + Revision 1.9 2004/07/18 03:01:44 reddawg + Few changes to spinlock hopefully it will cure our deadlock + Revision 1.8 2004/07/17 03:32:22 reddawg assert() diff --git a/src/sys/kernel/sched.c b/src/sys/kernel/sched.c index 185f97c..955d208 100644 --- a/src/sys/kernel/sched.c +++ b/src/sys/kernel/sched.c @@ -39,6 +39,7 @@ #include #include #include +#include extern union descriptorTableUnion ubixGDT[5]; @@ -209,6 +210,7 @@ tmpTask->timeSlice = systemVitals->dQuantum * tmpTask->nice; tmpTask->oInfo.cwd = (char *)kmalloc(1024); + assert(tmpTask->oInfo.cwd); /* Are we adding a task at the end of the last prio queue? */ if (0x0 == prioLevels[_current->nice]->next) @@ -245,13 +247,14 @@ for (tmpTask = taskList; tmpTask; tmpTask = tmpTask->next) { if (tmpTask->id == id) { tmpTask->prev->next = tmpTask->next; - + tmpTask->next->prev = tmpTask->prev; if (_current == tmpTask) { _current == tmpTask->next; + break; } } } - + kfree(tmpTask->oInfo.cwd); kfree(tmpTask); spinUnlock(&schedTaskSpinLock); return(0x0); @@ -307,6 +310,10 @@ /*** $Log$ + Revision 1.12 2004/07/09 13:23:20 reddawg + sched: schedInit to sched_init + Adjusted initialization routines + Revision 1.11 2004/06/22 14:03:10 solar Making the task queue with priorities functional diff --git a/src/sys/kernel/spinlock.c b/src/sys/kernel/spinlock.c index d376299..5145c98 100644 --- a/src/sys/kernel/spinlock.c +++ b/src/sys/kernel/spinlock.c @@ -46,7 +46,7 @@ inline int spinTryLock(spinLock_t *lock) { register int locked; assert(lock); - asm volatile"xchgl %0, %1" + asm volatile("xchgl %0, %1" : "=&r" (locked), "=m" (*lock) : "0" (1) ); return(!locked); @@ -54,7 +54,7 @@ inline void spinLock(spinLock_t *lock) { assert(lock); - while (! spinTryLock(lock)) + while (!spinTryLock(lock)) while (*lock == 1); } @@ -66,6 +66,9 @@ /*** $Log$ + Revision 1.6 2004/07/18 03:01:44 reddawg + Few changes to spinlock hopefully it will cure our deadlock + Revision 1.5 2004/07/17 16:43:10 reddawg shell: fixed stress testing ubistry: fixed some segfaults diff --git a/src/sys/lib/kmalloc.c b/src/sys/lib/kmalloc.c index 633dc9b..69f14b7 100644 --- a/src/sys/lib/kmalloc.c +++ b/src/sys/lib/kmalloc.c @@ -41,17 +41,20 @@ static spinLock_t mallocSpinLock = SPIN_LOCK_INITIALIZER; -void initMalloc() { - int i=0; +static void initMalloc() { + int i = 0x0; struct memDescriptor *tmpDesc1 = 0x0; struct memDescriptor *tmpDesc2 = 0x0; + emptyKernDesc = (struct memDescriptor *)vmmGetFreeKernelPage(sysID,4); assert(emptyKernDesc); + tmpDesc1 = emptyKernDesc; tmpDesc1->prev = 0x0; tmpDesc1->status = 0x0; tmpDesc1->limit = 0x0; - for (i=1;i<((4096/sizeof(struct memDescriptor))*4);i++) { + + for (i = 0x1;i < ((0x1000/sizeof(struct memDescriptor))*4);i++) { tmpDesc2 = &emptyKernDesc[i]; tmpDesc2->prev = tmpDesc1; tmpDesc1->next = tmpDesc2; @@ -59,6 +62,7 @@ tmpDesc2->limit = 0x0; tmpDesc1 = tmpDesc2; } + tmpDesc1->next = 0x0; //Return return; @@ -74,8 +78,10 @@ 02/17/03 - Is This Efficient? ************************************************************************/ -void *getEmptyDesc() { +static void *getEmptyDesc() { struct memDescriptor *tmpDesc = emptyKernDesc; + assert(tmpDesc); + if (tmpDesc != 0x0) { emptyKernDesc = tmpDesc->next; emptyKernDesc->prev = 0x0; @@ -89,6 +95,110 @@ /************************************************************************ +Function: void insertFreeDesc(struct memDescriptor *freeDesc) +Description: This Function Inserts A Free Descriptor On The List Which Is + Kept In Size Order + +Notes: + +02/17/03 - This Was Inspired By TCA's Great Wisdom - + "[20:20:59] You should just insert it in order" + +************************************************************************/ +static void insertFreeDesc(struct memDescriptor *freeDesc) { + struct memDescriptor *tmpDesc; + + assert(freeDesc); + + freeDesc->status = 0x0; + if (freeKernDesc != 0x0) { + for (tmpDesc=freeKernDesc;tmpDesc;tmpDesc=tmpDesc->next) { + if ((freeDesc->limit >= tmpDesc->limit) && (!tmpDesc->next)) { + tmpDesc->next = freeDesc; + freeDesc->prev = tmpDesc; + freeDesc->next = 0x0; + return; + } + else if ((freeDesc->limit >= tmpDesc->limit) && (freeDesc->limit <= tmpDesc->next->limit)) { + freeDesc->next = tmpDesc->next; + freeDesc->prev = tmpDesc; + tmpDesc->next->prev = freeDesc; + tmpDesc->next = freeDesc; + return; + } + } + } + else { + freeDesc->prev = 0x0; + freeDesc->next = 0x0; + freeKernDesc = freeDesc; + return; + } + //sysErr("Error With Freeing Blocks"); + return; + } + +/************************************************************************ + +Function: void mergeMemBlocks() +Description: This Function Will Merge Free Blocks And Free Pages + +Notes: + +03/05/03 - We Have A Problem It Seems The First Block Is Limit 0x0 + +************************************************************************/ +static void mergeMemBlocks() { + struct memDescriptor *tmpDesc1 = 0x0; + struct memDescriptor *tmpDesc2 = 0x0; + uInt32 baseAddr = 0x0; + + return; + + //Loop The Free Descriptors See If We Can Merge Them + for (tmpDesc1=freeKernDesc;tmpDesc1;tmpDesc1=tmpDesc1->next) { + /* + Compare The Base Addr With The Other Descriptors If You Find The One + That You Are Looking For Lets Merge Them + */ + if (tmpDesc1->limit != 0x0) { + baseAddr = (uInt32)tmpDesc1->baseAddr + (uInt32)tmpDesc1->limit; + for (tmpDesc2=freeKernDesc;tmpDesc2;tmpDesc2=tmpDesc2->next) { + if ((uInt32)tmpDesc2->baseAddr == baseAddr) { + tmpDesc1->limit += tmpDesc2->limit; + tmpDesc2->baseAddr = 0x0; + tmpDesc2->limit = 0x0; + tmpDesc2->status = 0x0; + if (tmpDesc2->prev) { + tmpDesc2->prev->next = tmpDesc2->next; + } + if (tmpDesc2->next) { + tmpDesc2->next->prev = tmpDesc2->prev; + } + tmpDesc2->prev = 0x0; + tmpDesc2->next = emptyKernDesc; + emptyKernDesc->prev = tmpDesc2; + emptyKernDesc = tmpDesc2; + if (tmpDesc1->prev) { + tmpDesc1->prev->next = tmpDesc1->next; + } + if (tmpDesc1->next) { + tmpDesc1->next->prev = tmpDesc1->prev; + } + tmpDesc1->prev = 0x0; + tmpDesc1->next = 0x0; + insertFreeDesc(tmpDesc1); + tmpDesc1 = freeKernDesc; + break; + } + } + } + } + return; + } + +/************************************************************************ + Function: void *kmalloc(uInt32 len) Description: Allocate Kernel Memory @@ -229,112 +339,11 @@ return; } -/************************************************************************ - -Function: void insertFreeDesc(struct memDescriptor *freeDesc) -Description: This Function Inserts A Free Descriptor On The List Which Is - Kept In Size Order - -Notes: - -02/17/03 - This Was Inspired By TCA's Great Wisdom - - "[20:20:59] You should just insert it in order" - -************************************************************************/ -void insertFreeDesc(struct memDescriptor *freeDesc) { - struct memDescriptor *tmpDesc; - - assert(freeDesc); - - freeDesc->status = 0x0; - if (freeKernDesc != 0x0) { - for (tmpDesc=freeKernDesc;tmpDesc;tmpDesc=tmpDesc->next) { - if ((freeDesc->limit >= tmpDesc->limit) && (!tmpDesc->next)) { - tmpDesc->next = freeDesc; - freeDesc->prev = tmpDesc; - freeDesc->next = 0x0; - return; - } - else if ((freeDesc->limit >= tmpDesc->limit) && (freeDesc->limit <= tmpDesc->next->limit)) { - freeDesc->next = tmpDesc->next; - freeDesc->prev = tmpDesc; - tmpDesc->next->prev = freeDesc; - tmpDesc->next = freeDesc; - return; - } - } - } - else { - freeDesc->prev = 0x0; - freeDesc->next = 0x0; - freeKernDesc = freeDesc; - return; - } - //sysErr("Error With Freeing Blocks"); - return; - } - -/************************************************************************ - -Function: void mergeMemBlocks() -Description: This Function Will Merge Free Blocks And Free Pages - -Notes: - -03/05/03 - We Have A Problem It Seems The First Block Is Limit 0x0 - -************************************************************************/ -void mergeMemBlocks() { - struct memDescriptor *tmpDesc1 = 0x0; - struct memDescriptor *tmpDesc2 = 0x0; - uInt32 baseAddr = 0x0; - - return; - - //Loop The Free Descriptors See If We Can Merge Them - for (tmpDesc1=freeKernDesc;tmpDesc1;tmpDesc1=tmpDesc1->next) { - /* - Compare The Base Addr With The Other Descriptors If You Find The One - That You Are Looking For Lets Merge Them - */ - if (tmpDesc1->limit != 0x0) { - baseAddr = (uInt32)tmpDesc1->baseAddr + (uInt32)tmpDesc1->limit; - for (tmpDesc2=freeKernDesc;tmpDesc2;tmpDesc2=tmpDesc2->next) { - if ((uInt32)tmpDesc2->baseAddr == baseAddr) { - tmpDesc1->limit += tmpDesc2->limit; - tmpDesc2->baseAddr = 0x0; - tmpDesc2->limit = 0x0; - tmpDesc2->status = 0x0; - if (tmpDesc2->prev) { - tmpDesc2->prev->next = tmpDesc2->next; - } - if (tmpDesc2->next) { - tmpDesc2->next->prev = tmpDesc2->prev; - } - tmpDesc2->prev = 0x0; - tmpDesc2->next = emptyKernDesc; - emptyKernDesc->prev = tmpDesc2; - emptyKernDesc = tmpDesc2; - if (tmpDesc1->prev) { - tmpDesc1->prev->next = tmpDesc1->next; - } - if (tmpDesc1->next) { - tmpDesc1->next->prev = tmpDesc1->prev; - } - tmpDesc1->prev = 0x0; - tmpDesc1->next = 0x0; - insertFreeDesc(tmpDesc1); - tmpDesc1 = freeKernDesc; - break; - } - } - } - } - return; - } - /*** $Log$ + Revision 1.10 2004/07/17 18:00:47 reddawg + kmalloc: added assert() + Revision 1.9 2004/07/17 15:54:52 reddawg kmalloc: added assert() bioscall: fixed some potential problem by not making 16bit code diff --git a/src/sys/vfs/file.c b/src/sys/vfs/file.c index bc9cac1..1376c96 100644 --- a/src/sys/vfs/file.c +++ b/src/sys/vfs/file.c @@ -36,6 +36,7 @@ #include #include #include +#include /************************************************************************ @@ -46,6 +47,7 @@ ************************************************************************/ int fclose(fileDescriptor *fd) { fileDescriptor *tmpFd = 0x0; + assert(fd); /* Search For File Descriptor */ for (tmpFd=fdTable;tmpFd;tmpFd=tmpFd->next) { if (tmpFd == fd) { @@ -253,6 +255,9 @@ /*** $Log$ + Revision 1.8 2004/06/29 03:59:48 reddawg + Fixed a few issues with subdirectories they are working much better now + Revision 1.7 2004/06/29 00:18:49 reddawg Sub Dirs