From 4a88273db5df00c5d3397ad5bcef50eb68f4bef8 Mon Sep 17 00:00:00 2001
From: Robert Morris <rtm@csail.mit.edu>
Date: Mon, 17 Oct 2022 04:07:24 -0400
Subject: [PATCH] oops. scheduler() inherits the interrupt status of the most
 recent process to run, so it must explicitly turn them on again. It would be
 better if cpu->intena were really thread->intena.

---
 kernel/proc.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/kernel/proc.c b/kernel/proc.c
index bc4b274..809d112 100644
--- a/kernel/proc.c
+++ b/kernel/proc.c
@@ -447,12 +447,12 @@ scheduler(void)
   struct proc *p;
   struct cpu *c = mycpu();
 
-  // Interrupts are disabled at first, but they must be
-  // enabled in order for the shell to get input.
-  intr_on();
-  
   c->proc = 0;
   for(;;){
+    // The most recent process to run may have had interrupts
+    // turned off; turn them on to avoid deadlock.
+    intr_on();
+
     for(p = proc; p < &proc[NPROC]; p++) {
       acquire(&p->lock);
       if(p->state == RUNNABLE) {