diff --git a/sys/fs/vfs/inode.c b/sys/fs/vfs/inode.c index bcfaab3..c1ef2ce 100644 --- a/sys/fs/vfs/inode.c +++ b/sys/fs/vfs/inode.c @@ -1,10 +1,20 @@ #include #include +#include static struct inode *first_inode; static struct wait_queue *inode_wait = NULL; static int nr_inodes = 0, nr_free_inodes = 0; +static void write_inode(struct inode * inode); +static void __wait_on_inode(struct inode * inode); +static inline void unlock_inode(struct inode * inode); + +static inline void wait_on_inode(struct inode * inode) { + if (inode->i_lock) + __wait_on_inode(inode); +} + void iput(struct inode * inode) { if (!inode) return; @@ -28,7 +38,7 @@ if (inode->i_pipe) { unsigned long page = (unsigned long) PIPE_BASE(*inode); PIPE_BASE (*inode) = NULL; - free_page(page); + vmm_freeVirtualPage(page); } if (inode->i_sb && inode->i_sb->s_op && inode->i_sb->s_op->put_inode) { inode->i_sb->s_op->put_inode(inode); @@ -44,3 +54,38 @@ nr_free_inodes++; return; } + +static void __wait_on_inode(struct inode * inode) { + struct wait_queue wait = { _current, NULL }; + + add_wait_queue(&inode->i_wait, &wait); + repeat: _current->state = UNINTERRUPTIBLE; + if (inode->i_lock) { + sched_yield(); + //schedule(); + goto repeat; + } + remove_wait_queue(&inode->i_wait, &wait); + _current->state = RUNNING; +} + +static void write_inode(struct inode * inode) { + if (!inode->i_dirt) + return; + wait_on_inode(inode); + if (!inode->i_dirt) + return; + if (!inode->i_sb || !inode->i_sb->s_op || !inode->i_sb->s_op->write_inode) { + inode->i_dirt = 0; + return; + } + inode->i_lock = 1; + inode->i_sb->s_op->write_inode(inode); + unlock_inode(inode); +} + + +static inline void unlock_inode(struct inode * inode) { + inode->i_lock = 0; + wake_up(&inode->i_wait); +} diff --git a/sys/i386/sched.c b/sys/i386/sched.c index e808666..9488039 100644 --- a/sys/i386/sched.c +++ b/sys/i386/sched.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -55,6 +56,8 @@ static struct spinLock schedulerSpinLock = SPIN_LOCK_INITIALIZER; +int need_resched = 0; + /************************************************************************ Function: int sched_init() @@ -294,7 +297,88 @@ return (0x0); } -/*** - END - ***/ +void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait) +{ + unsigned long flags; + save_flags(flags); + cli(); + if (!*p) { + wait->next = wait; + *p = wait; + } else { + wait->next = (*p)->next; + (*p)->next = wait; + } + restore_flags(flags); +} + +void remove_wait_queue(struct wait_queue ** p, struct wait_queue * wait) { + unsigned long flags; + struct wait_queue * tmp; + + save_flags(flags); + cli(); + if ((*p == wait) && + ((*p = wait->next) == wait)) { + *p = NULL; + } else { + tmp = wait; + while (tmp->next != wait) { + tmp = tmp->next; + } + tmp->next = wait->next; + } + wait->next = NULL; + restore_flags(flags); +} + +void wake_up_interruptible(struct wait_queue **q) { + struct wait_queue *tmp; + kTask_t *p; + + if (!q || !(tmp = *q)) + return; + do { + if ((p = tmp->task) != NULL) { + if (p->state == INTERRUPTIBLE) { + p->state = RUNNING; + if (p->counter > _current->counter) + need_resched = 1; + } + } + if (!tmp->next) { + kprintf("wait_queue is bad (eip = %08lx)\n", ((unsigned long *) q)[-1]); + kprintf(" q = %p\n", q); + kprintf(" *q = %p\n", *q); + kprintf(" tmp = %p\n", tmp); + break; + } + tmp = tmp->next; + } while (tmp != *q); +} + +void wake_up(struct wait_queue **q) { + struct wait_queue *tmp; + kTask_t * p; + + if (!q || !(tmp = *q)) + return; + do { + if ((p = tmp->task) != NULL) { + if ((p->state == UNINTERRUPTIBLE) || (p->state == INTERRUPTIBLE)) { + p->state = RUNNING; + if (p->counter > _current->counter) + need_resched = 1; + } + } + if (!tmp->next) { + kprintf("wait_queue is bad (eip = %08lx)\n", ((unsigned long *) q)[-1]); + kprintf(" q = %p\n", q); + kprintf(" *q = %p\n", *q); + kprintf(" tmp = %p\n", tmp); + break; + } + tmp = tmp->next; + } while (tmp != *q); +} diff --git a/sys/include/ubixos/sched.h b/sys/include/ubixos/sched.h index f1fec85..f47e351 100644 --- a/sys/include/ubixos/sched.h +++ b/sys/include/ubixos/sched.h @@ -31,14 +31,17 @@ #define _SCHED_H #include -//#include #include #include #include #include +#include + +#define NOGROUP -1 +#define NGROUPS 32 typedef enum { - PLACEHOLDER = -2, DEAD = -1, NEW = 0, READY = 1, RUNNING = 2, IDLE = 3, FORK = 4, WAIT = 5 + PLACEHOLDER = -2, DEAD = -1, NEW = 0, READY = 1, RUNNING = 2, IDLE = 3, FORK = 4, WAIT = 5, UNINTERRUPTIBLE = 6, INTERRUPTIBLE = 7 } tState; struct osInfo { @@ -72,6 +75,8 @@ struct inode *pwd; struct inode *root; struct inode *exec; + uint32_t counter; + uint16_t groups[NGROUPS]; } kTask_t; int sched_init(); @@ -90,96 +95,3 @@ extern kTask_t *_usedMath; #endif - -/*** - $Log: sched.h,v $ - Revision 1.3 2006/12/15 15:43:46 reddawg - Changes - - Revision 1.2 2006/10/27 16:42:42 reddawg - Testing - - Revision 1.1.1.1 2006/06/01 12:46:14 reddawg - ubix2 - - Revision 1.2 2005/10/12 00:13:37 reddawg - Removed - - Revision 1.1.1.1 2005/09/26 17:23:55 reddawg - no message - - Revision 1.30 2004/09/11 22:21:11 reddawg - oInfo.cwd is now an array no longer a pointer.. - - Revision 1.29 2004/09/08 23:19:58 reddawg - hmm - - Revision 1.28 2004/09/08 22:16:02 reddawg - Fixens - - Revision 1.27 2004/09/08 21:19:32 reddawg - All good now - - Revision 1.26 2004/09/07 21:54:38 reddawg - ok reverted back to old scheduling for now.... - - Revision 1.20 2004/08/09 12:58:05 reddawg - let me know when you got the surce - - Revision 1.19 2004/08/06 22:43:04 reddawg - ok - - Revision 1.18 2004/08/06 22:32:16 reddawg - Ubix Works Again - - Revision 1.16 2004/08/04 08:17:57 reddawg - tty: we have primative ttys try f1-f5 so it is easier to use and debug - ubixos - - Revision 1.15 2004/07/29 21:32:16 reddawg - My quick lunchs breaks worth of updates.... - - Revision 1.14 2004/07/21 17:15:02 reddawg - removed garbage - - Revision 1.13 2004/07/21 14:43:14 flameshadow - add: added cwc (current working container) to the osInfo strut - - Revision 1.12 2004/07/19 02:32:21 reddawg - sched: we now set task status to dead which then makes the scheduler do some clean it could be some minor overhead but i feel this is our most efficient approach right now to prevent corruption of the queues - - Revision 1.11 2004/07/19 02:08:27 reddawg - Cleaned out the rest of debuging code also temporarily disabled the ip stack to improve boot time - - Revision 1.10 2004/07/18 05:24:15 reddawg - Fixens - - 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 - - Revision 1.7 2004/06/18 13:01:47 solar - Added nice and timeSlice members to the kTask_t type - - Revision 1.6 2004/06/17 02:12:57 reddawg - Cleaned Out Dead Code - - Revision 1.5 2004/06/16 14:04:51 reddawg - Renamed a typedef - - Revision 1.4 2004/06/14 12:20:54 reddawg - notes: many bugs repaired and ld works 100% now. - - Revision 1.3 2004/05/21 15:49:13 reddawg - The os does better housekeeping now when a task is exited - - Revision 1.2 2004/05/21 15:20:00 reddawg - Cleaned up - - - END - ***/ - diff --git a/sys/include/ubixos/wait.h b/sys/include/ubixos/wait.h index 22feb5e..1abbef4 100644 --- a/sys/include/ubixos/wait.h +++ b/sys/include/ubixos/wait.h @@ -13,4 +13,12 @@ struct wait_queue *wait; }; +#define sti() __asm__ __volatile__ ("sti": : :"memory") +#define cli() __asm__ __volatile__ ("cli": : :"memory") +#define nop() __asm__ __volatile__ ("nop") + +#define save_flags(x) __asm__ __volatile__("pushfl ; popl %0":"=r" (x): /* no input */ :"memory") + +#define restore_flags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"r" (x):"memory") + #endif diff --git a/sys/kernel/access.c b/sys/kernel/access.c index 0c5d901..639b76d 100644 --- a/sys/kernel/access.c +++ b/sys/kernel/access.c @@ -75,7 +75,18 @@ return (-1); } -/*** - END - ***/ +int in_group_p(gid_t grp) +{ + int i; + if (grp == _current->egid) + return 1; + + for (i = 0; i < NGROUPS; i++) { + if (_current->groups[i] == NOGROUP) + break; + if (_current->groups[i] == grp) + return 1; + } + return 0; +} diff --git a/sys/vmm/Makefile b/sys/vmm/Makefile index 9b4b704..601de40 100644 --- a/sys/vmm/Makefile +++ b/sys/vmm/Makefile @@ -6,7 +6,7 @@ include ../Makefile.incl # Objects -OBJS = page_fault.o pagefault.o getfreevirtualpage.o copyvirtualspace.o setpageattributes.o unmappage.o getphysicaladdr.o getfreepage.o createvirtualspace.o vmm_memory.o paging.o vmm_init.o vmm_mmap.o +OBJS = page_fault.o pagefault.o getfreevirtualpage.o copyvirtualspace.o setpageattributes.o unmappage.o getphysicaladdr.o getfreepage.o createvirtualspace.o vmm_memory.o paging.o vmm_init.o vmm_mmap.o freevirtualpage.o all: $(OBJS) diff --git a/sys/vmm/freevirtualpage.c b/sys/vmm/freevirtualpage.c new file mode 100644 index 0000000..11dc32d --- /dev/null +++ b/sys/vmm/freevirtualpage.c @@ -0,0 +1,5 @@ +#include + +int vmm_freeVirtualPage(uint32_t addr) { + return(0); +} diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 0f298c9..158be12 100644 --- a/sys/vmm/vmm_mmap.c +++ b/sys/vmm/vmm_mmap.c @@ -33,6 +33,7 @@ #include #include #include +#include /* MrOlsen (2016-01-15) TEMP: Put These somewhere else */ typedef __uint32_t __vm_size_t;