--- a/sys/src/9/pc/trap.c +++ b/sys/src/9/pc/trap.c @@ -356,7 +355,7 @@ trap(Ureg* ureg) if(ctl->irq == IrqCLOCK || ctl->irq == IrqTIMER) clockintr = 1; - if(up && !clockintr) + if(up && !clockintr && m->ilockdepth == 0) preempted(); } } @@ -435,7 +434,7 @@ trap(Ureg* ureg) splhi(); /* delaysched set because we held a lock or because our quantum ended */ - if(up && up->delaysched && clockintr){ + if(up && up->delaysched && clockintr && m->ilockdepth == 0){ sched(); splhi(); } --- a/sys/src/9/pc/x86watchdog.c +++ b/sys/src/9/pc/x86watchdog.c @@ -133,8 +133,10 @@ x86wdenable(void) break; case P4: rdmsr(0x1A0, &r); - if(!(r & 0x0000000000000080LL)) - return; + if(!(r & 0x0000000000000080LL)){ + iunlock(wd); + error(Enodev); + } for(i = 0; i < 18; i++) wrmsr(0x300+i, 0); /* perfctr */