summaryrefslogtreecommitdiff
path: root/trap.c
diff options
context:
space:
mode:
authorrsc <rsc>2006-09-07 16:53:16 +0000
committerrsc <rsc>2006-09-07 16:53:16 +0000
commit0b75a8e8bea4f4c8230daae8d81eda04c19e622c (patch)
treee091b079155c18619ff5add30fd45e8b1dca0245 /trap.c
parent5a71f9330162dd9f8a302c3ed1fa33539acdfdec (diff)
downloadxv6-labs-0b75a8e8bea4f4c8230daae8d81eda04c19e622c.tar.gz
xv6-labs-0b75a8e8bea4f4c8230daae8d81eda04c19e622c.tar.bz2
xv6-labs-0b75a8e8bea4f4c8230daae8d81eda04c19e622c.zip
no recursive interrupts
Diffstat (limited to 'trap.c')
-rw-r--r--trap.c65
1 files changed, 34 insertions, 31 deletions
diff --git a/trap.c b/trap.c
index b35107f..0505c5f 100644
--- a/trap.c
+++ b/trap.c
@@ -18,10 +18,9 @@ tvinit(void)
{
int i;
- for(i = 0; i < 256; i++){
- SETGATE(idt[i], 1, SEG_KCODE << 3, vectors[i], 0);
- }
- SETGATE(idt[T_SYSCALL], 1, SEG_KCODE << 3, vectors[T_SYSCALL], 3);
+ for(i = 0; i < 256; i++)
+ SETGATE(idt[i], 0, SEG_KCODE << 3, vectors[i], 0);
+ SETGATE(idt[T_SYSCALL], 0, SEG_KCODE << 3, vectors[T_SYSCALL], 3);
}
void
@@ -34,9 +33,9 @@ void
trap(struct trapframe *tf)
{
int v = tf->trapno;
+ struct proc *cp = curproc[cpu()];
if(v == T_SYSCALL){
- struct proc *cp = curproc[cpu()];
if(cp->killed)
proc_exit();
cp->tf = tf;
@@ -46,9 +45,15 @@ trap(struct trapframe *tf)
return;
}
- if(v == (IRQ_OFFSET + IRQ_TIMER)){
- struct proc *cp = curproc[cpu()];
+ // Increment nlock to make sure interrupts stay off
+ // during interrupt handler. Must decrement before
+ // returning.
+ cpus[cpu()].nlock++;
+
+ switch(v){
+ case IRQ_OFFSET + IRQ_TIMER:
lapic_timerintr();
+ cpus[cpu()].nlock--;
if(cp){
// Force process exit if it has been killed
// and the interrupt came from user space.
@@ -63,36 +68,34 @@ trap(struct trapframe *tf)
yield();
}
return;
- }
- if(v == IRQ_OFFSET + IRQ_IDE){
+ case IRQ_OFFSET + IRQ_IDE:
ide_intr();
- cli(); // prevent a waiting interrupt from overflowing stack
lapic_eoi();
- return;
- }
-
- if(v == IRQ_OFFSET + IRQ_KBD){
+ break;
+
+ case IRQ_OFFSET + IRQ_KBD:
kbd_intr();
- cli(); // prevent a waiting interrupt from overflowing stack
lapic_eoi();
- return;
- }
-
- if(v == IRQ_OFFSET + IRQ_SPURIOUS){
+ break;
+
+ case IRQ_OFFSET + IRQ_SPURIOUS:
cprintf("spurious interrupt from cpu %d eip %x\n", cpu(), tf->eip);
- return; // no eoi for this one.
- }
-
- if(curproc[cpu()]) {
- // assume process caused unexpected trap,
- // for example by dividing by zero or dereferencing a bad pointer
- cprintf("pid %d: unhandled trap %d on cpu %d eip %x -- kill proc\n",
- curproc[cpu()]->pid, v, cpu(), tf->eip);
- proc_exit();
+ break;
+
+ default:
+ if(curproc[cpu()]) {
+ // assume process caused unexpected trap,
+ // for example by dividing by zero or dereferencing a bad pointer
+ cprintf("pid %d: unhandled trap %d on cpu %d eip %x -- kill proc\n",
+ curproc[cpu()]->pid, v, cpu(), tf->eip);
+ proc_exit();
+ }
+
+ // otherwise it's our mistake
+ cprintf("unexpected trap %d from cpu %d eip %x\n", v, cpu(), tf->eip);
+ panic("trap");
}
- // otherwise it's our mistake
- cprintf("unexpected trap %d from cpu %d eip %x\n", v, cpu(), tf->eip);
- panic("trap");
+ cpus[cpu()].nlock--;
}