summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-06-15 19:58:01 +0000
committerrtm <rtm>2006-06-15 19:58:01 +0000
commitbe0a7eacdab4443199ed0ed4379a84edc7c98fd6 (patch)
tree5528a9d64865c1f29ded1f179ebf408e50df3d50 /proc.c
parenta4c03dea09b7b5f2463147e979d20b035b81de96 (diff)
downloadxv6-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.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/proc.c b/proc.c
index 1e90e37..8291039 100644
--- a/proc.c
+++ b/proc.c
@@ -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;
+}