summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2017-01-31 17:47:16 -0500
committerFrans Kaashoek <[email protected]>2017-01-31 17:47:16 -0500
commitabf847a083888bbed4260ecacf849ea19f23e810 (patch)
tree4ae9b3487bbfe27f6382486bf877917dbb8bc030 /proc.c
parent59cdd6c63b89395d64ec9550181af5ed569b8466 (diff)
downloadxv6-labs-abf847a083888bbed4260ecacf849ea19f23e810.tar.gz
xv6-labs-abf847a083888bbed4260ecacf849ea19f23e810.tar.bz2
xv6-labs-abf847a083888bbed4260ecacf849ea19f23e810.zip
Start of an experiment to remove the use of gs for cpu local variables.
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c89
1 files changed, 49 insertions, 40 deletions
diff --git a/proc.c b/proc.c
index 7d03ad7..bd62e4b 100644
--- a/proc.c
+++ b/proc.c
@@ -26,6 +26,16 @@ pinit(void)
initlock(&ptable.lock, "ptable");
}
+int
+cpuid() {
+ return mycpu()-cpus;
+}
+
+void
+setproc(struct proc* p) {
+ mycpu()->proc = p;
+}
+
//PAGEBREAK: 32
// Look in the process table for an UNUSED proc.
// If found, change state to EMBRYO and initialize
@@ -121,16 +131,16 @@ growproc(int n)
{
uint sz;
- sz = proc->sz;
+ sz = myproc()->sz;
if(n > 0){
- if((sz = allocuvm(proc->pgdir, sz, sz + n)) == 0)
+ if((sz = allocuvm(myproc()->pgdir, sz, sz + n)) == 0)
return -1;
} else if(n < 0){
- if((sz = deallocuvm(proc->pgdir, sz, sz + n)) == 0)
+ if((sz = deallocuvm(myproc()->pgdir, sz, sz + n)) == 0)
return -1;
}
- proc->sz = sz;
- switchuvm(proc);
+ myproc()->sz = sz;
+ switchuvm(myproc());
return 0;
}
@@ -148,26 +158,26 @@ fork(void)
return -1;
}
- // Copy process state from p.
- if((np->pgdir = copyuvm(proc->pgdir, proc->sz)) == 0){
+ // Copy process state from proc.
+ if((np->pgdir = copyuvm(myproc()->pgdir, myproc()->sz)) == 0){
kfree(np->kstack);
np->kstack = 0;
np->state = UNUSED;
return -1;
}
- np->sz = proc->sz;
- np->parent = proc;
- *np->tf = *proc->tf;
+ np->sz = myproc()->sz;
+ np->parent = myproc();
+ *np->tf = *myproc()->tf;
// Clear %eax so that fork returns 0 in the child.
np->tf->eax = 0;
for(i = 0; i < NOFILE; i++)
- if(proc->ofile[i])
- np->ofile[i] = filedup(proc->ofile[i]);
- np->cwd = idup(proc->cwd);
+ if(myproc()->ofile[i])
+ np->ofile[i] = filedup(myproc()->ofile[i]);
+ np->cwd = idup(myproc()->cwd);
- safestrcpy(np->name, proc->name, sizeof(proc->name));
+ safestrcpy(np->name, myproc()->name, sizeof(myproc()->name));
pid = np->pid;
@@ -189,30 +199,30 @@ exit(void)
struct proc *p;
int fd;
- if(proc == initproc)
+ if(myproc() == initproc)
panic("init exiting");
// Close all open files.
for(fd = 0; fd < NOFILE; fd++){
- if(proc->ofile[fd]){
- fileclose(proc->ofile[fd]);
- proc->ofile[fd] = 0;
+ if(myproc()->ofile[fd]){
+ fileclose(myproc()->ofile[fd]);
+ myproc()->ofile[fd] = 0;
}
}
begin_op();
- iput(proc->cwd);
+ iput(myproc()->cwd);
end_op();
- proc->cwd = 0;
+ myproc()->cwd = 0;
acquire(&ptable.lock);
// Parent might be sleeping in wait().
- wakeup1(proc->parent);
+ wakeup1(myproc()->parent);
// Pass abandoned children to init.
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
- if(p->parent == proc){
+ if(p->parent == myproc()){
p->parent = initproc;
if(p->state == ZOMBIE)
wakeup1(initproc);
@@ -220,7 +230,7 @@ exit(void)
}
// Jump into the scheduler, never to return.
- proc->state = ZOMBIE;
+ myproc()->state = ZOMBIE;
sched();
panic("zombie exit");
}
@@ -238,7 +248,7 @@ wait(void)
// Scan through table looking for exited children.
havekids = 0;
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
- if(p->parent != proc)
+ if(p->parent != myproc())
continue;
havekids = 1;
if(p->state == ZOMBIE){
@@ -258,13 +268,13 @@ wait(void)
}
// No point waiting if we don't have any children.
- if(!havekids || proc->killed){
+ if(!havekids || myproc()->killed){
release(&ptable.lock);
return -1;
}
// Wait for children to exit. (See wakeup1 call in proc_exit.)
- sleep(proc, &ptable.lock); //DOC: wait-sleep
+ sleep(myproc(), &ptable.lock); //DOC: wait-sleep
}
}
@@ -294,15 +304,15 @@ scheduler(void)
// Switch to chosen process. It is the process's job
// to release ptable.lock and then reacquire it
// before jumping back to us.
- proc = p;
+ setproc(p);
switchuvm(p);
p->state = RUNNING;
- swtch(&cpu->scheduler, p->context);
+ swtch(&(mycpu()->scheduler), p->context);
switchkvm();
// Process is done running for now.
// It should have changed its p->state before coming back.
- proc = 0;
+ setproc(0);
}
release(&ptable.lock);
@@ -323,15 +333,15 @@ sched(void)
if(!holding(&ptable.lock))
panic("sched ptable.lock");
- if(cpu->ncli != 1)
+ if(mycpu()->ncli != 1)
panic("sched locks");
- if(proc->state == RUNNING)
+ if(myproc()->state == RUNNING)
panic("sched running");
if(readeflags()&FL_IF)
panic("sched interruptible");
- intena = cpu->intena;
- swtch(&proc->context, cpu->scheduler);
- cpu->intena = intena;
+ intena = mycpu()->intena;
+ swtch(&myproc()->context, mycpu()->scheduler);
+ mycpu()->intena = intena;
}
// Give up the CPU for one scheduling round.
@@ -339,7 +349,7 @@ void
yield(void)
{
acquire(&ptable.lock); //DOC: yieldlock
- proc->state = RUNNABLE;
+ myproc()->state = RUNNABLE;
sched();
release(&ptable.lock);
}
@@ -370,7 +380,7 @@ forkret(void)
void
sleep(void *chan, struct spinlock *lk)
{
- if(proc == 0)
+ if(myproc() == 0)
panic("sleep");
if(lk == 0)
@@ -386,14 +396,13 @@ sleep(void *chan, struct spinlock *lk)
acquire(&ptable.lock); //DOC: sleeplock1
release(lk);
}
-
// Go to sleep.
- proc->chan = chan;
- proc->state = SLEEPING;
+ myproc()->chan = chan;
+ myproc()->state = SLEEPING;
sched();
// Tidy up.
- proc->chan = 0;
+ myproc()->chan = 0;
// Reacquire original lock.
if(lk != &ptable.lock){ //DOC: sleeplock2