diff --git a/console.c b/console.c index 122ccb3..ca20842 100644 --- a/console.c +++ b/console.c @@ -17,7 +17,7 @@ static void consputc(int); -static int panicked = 0; +static volatile int panicked = 0; static struct { struct spinlock lock; @@ -120,6 +120,7 @@ printf(char *fmt, ...) void panic(char *s) { + cons.locking = 0; printf("panic: "); printf(s); printf("\n"); diff --git a/proc.c b/proc.c index 28cac26..7093566 100644 --- a/proc.c +++ b/proc.c @@ -11,7 +11,6 @@ struct { struct proc proc[NPROC]; } ptable; -// XXX riscv move somewhere else struct cpu cpus[NCPU]; struct proc *initproc; @@ -54,10 +53,10 @@ mycpu(void) { // Return the current struct proc *. struct proc* myproc(void) { - // XXX push intr off + push_off(); struct cpu *c = mycpu(); struct proc *p = c->proc; - // XXX pop intr + pop_off(); return p; } @@ -403,8 +402,13 @@ sched(void) if(!holding(&ptable.lock)) panic("sched ptable.lock"); + if(mycpu()->noff != 1) + panic("sched locks"); if(p->state == RUNNING) panic("sched running"); + if(intr_get()) + panic("sched interruptible"); + intena = mycpu()->intena; swtch(&p->context, &mycpu()->scheduler); mycpu()->intena = intena;