diff options
author | rtm <rtm> | 2006-08-10 22:08:14 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-08-10 22:08:14 +0000 |
commit | 5be0039ce9e22f140a29e167526c64c723c5be3c (patch) | |
tree | 4096ed2b728cbee37dd2adee06e83f0e908f72b6 /proc.c | |
parent | 8a8be1b8c36e38f58f8ba3e425b6e701ad65abf3 (diff) | |
download | xv6-labs-5be0039ce9e22f140a29e167526c64c723c5be3c.tar.gz xv6-labs-5be0039ce9e22f140a29e167526c64c723c5be3c.tar.bz2 xv6-labs-5be0039ce9e22f140a29e167526c64c723c5be3c.zip |
interrupts could be recursive since lapic_eoi() called before rti
so fast interrupts overflow the kernel stack
fix: cli() before lapic_eoi()
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -7,7 +7,7 @@ #include "defs.h" #include "spinlock.h" -struct spinlock proc_table_lock = { "proc_table" }; +struct spinlock proc_table_lock; struct proc proc[NPROC]; struct proc *curproc[NCPU]; @@ -15,6 +15,12 @@ int next_pid = NCPU; extern void forkret(void); extern void forkret1(struct trapframe*); +void +pinit(void) +{ + initlock(&proc_table_lock, "proc_table"); +} + /* * set up a process's task state and segment descriptors * correctly, given its current size and address in memory. @@ -146,6 +152,9 @@ scheduler(void) // Loop over process table looking for process to run. acquire(&proc_table_lock); for(i = 0; i < NPROC; i++){ + if(cpus[cpu()].guard1 != 0xdeadbeef || + cpus[cpu()].guard2 != 0xdeadbeef) + panic("cpu guard"); p = &proc[i]; if(p->state != RUNNABLE) continue; @@ -194,6 +203,7 @@ scheduler(void) // XXX if not holding proc_table_lock panic. } + release(&proc_table_lock); if(cpus[cpu()].nlock != 0) @@ -212,7 +222,9 @@ scheduler(void) void sched(void) { - if(setjmp(&curproc[cpu()]->jmpbuf) == 0) + struct proc *p = curproc[cpu()]; + + if(setjmp(&p->jmpbuf) == 0) longjmp(&cpus[cpu()].jmpbuf); } |