From 228e500a0c2b5a26492c84f73951a46c58c86509 Mon Sep 17 00:00:00 2001
From: kolya <kolya>
Date: Wed, 15 Oct 2008 05:01:39 +0000
Subject: [PATCH] save cpus.intena in sched(), so we get the right EFLAGS.IF
 value once a timer-preempted kernel thread resumes execution in trap() after
 yield(). otherwise the kernel could get an arbitrary number of nested timer
 intrs.

---
 proc.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/proc.c b/proc.c
index 614a130..fdd633d 100644
--- a/proc.c
+++ b/proc.c
@@ -207,7 +207,7 @@ scheduler(void)
 
   c = &cpus[cpu()];
   for(;;){
-    // Enable interrupts on this processor.
+    // Enable interrupts on this processor, in lieu of saving intena.
     sti();
 
     // Loop over process table looking for process to run.
@@ -240,6 +240,8 @@ scheduler(void)
 void
 sched(void)
 {
+  int intena;
+
   if(read_eflags()&FL_IF)
     panic("sched interruptible");
   if(cp->state == RUNNING)
@@ -249,7 +251,9 @@ sched(void)
   if(cpus[cpu()].ncli != 1)
     panic("sched locks");
 
+  intena = cpus[cpu()].intena;
   swtch(&cp->context, &cpus[cpu()].context);
+  cpus[cpu()].intena = intena;
 }
 
 // Give up the CPU for one scheduling round.
-- 
GitLab