diff options
author | rtm <rtm> | 2006-06-15 19:58:01 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-06-15 19:58:01 +0000 |
commit | be0a7eacdab4443199ed0ed4379a84edc7c98fd6 (patch) | |
tree | 5528a9d64865c1f29ded1f179ebf408e50df3d50 /proc.c | |
parent | a4c03dea09b7b5f2463147e979d20b035b81de96 (diff) | |
download | xv6-labs-be0a7eacdab4443199ed0ed4379a84edc7c98fd6.tar.gz xv6-labs-be0a7eacdab4443199ed0ed4379a84edc7c98fd6.tar.bz2 xv6-labs-be0a7eacdab4443199ed0ed4379a84edc7c98fd6.zip |
sleep, wakeup, wait, exit
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 28 |
1 files changed, 27 insertions, 1 deletions
@@ -7,6 +7,7 @@ struct proc proc[NPROC]; struct proc *curproc; +int next_pid = 1; /* * set up a process's task state and segment descriptors @@ -54,6 +55,8 @@ newproc() if(np >= &proc[NPROC]) return 0; + np->pid = next_pid++; + np->ppid = curproc->pid; np->sz = curproc->sz; np->mem = kalloc(curproc->sz); if(np->mem == 0) @@ -111,7 +114,12 @@ swtch() // XXX callee-saved registers? - // XXX probably ought to lgdt on trap return too + // h/w sets busy bit in TSS descriptor sometimes, and faults + // if it's set in LTR. so clear tss descriptor busy bit. + curproc->gdt[SEG_TSS].sd_type = STS_T32A; + + // XXX probably ought to lgdt on trap return too, in case + // a system call has moved a program or changed its size. asm volatile("lgdt %0" : : "g" (np->gdt_pd.pd_lim)); ltr(SEG_TSS << 3); @@ -122,3 +130,21 @@ swtch() asm volatile("movl %0, %%esp" : : "g" (np->esp)); asm volatile("movl %0, %%ebp" : : "g" (np->ebp)); } + +void +sleep(void *chan) +{ + curproc->chan = chan; + curproc->state = WAITING; + swtch(); +} + +void +wakeup(void *chan) +{ + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) + if(p->state == WAITING && p->chan == chan) + p->state = RUNNABLE; +} |