summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-08-10 22:08:14 +0000
committerrtm <rtm>2006-08-10 22:08:14 +0000
commit5be0039ce9e22f140a29e167526c64c723c5be3c (patch)
tree4096ed2b728cbee37dd2adee06e83f0e908f72b6 /proc.c
parent8a8be1b8c36e38f58f8ba3e425b6e701ad65abf3 (diff)
downloadxv6-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.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/proc.c b/proc.c
index 0254c2e..5f8769b 100644
--- a/proc.c
+++ b/proc.c
@@ -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);
}