Browse Source

Kernel: Don't update Thread TSS if scheduler tick reschedules it

If we didn't find anything else that wants to run, we don't need to
update the current thread's TSS since we're just gonna return to the
same thread anyway.
Andreas Kling 5 years ago
parent
commit
c33ac7f170
1 changed files with 24 additions and 22 deletions
  1. 24 22
      Kernel/Scheduler.cpp

+ 24 - 22
Kernel/Scheduler.cpp

@@ -540,33 +540,35 @@ void Scheduler::timer_tick(RegisterDump& regs)
     if (current->tick())
         return;
 
-    current->tss().gs = regs.gs;
-    current->tss().fs = regs.fs;
-    current->tss().es = regs.es;
-    current->tss().ds = regs.ds;
-    current->tss().edi = regs.edi;
-    current->tss().esi = regs.esi;
-    current->tss().ebp = regs.ebp;
-    current->tss().ebx = regs.ebx;
-    current->tss().edx = regs.edx;
-    current->tss().ecx = regs.ecx;
-    current->tss().eax = regs.eax;
-    current->tss().eip = regs.eip;
-    current->tss().cs = regs.cs;
-    current->tss().eflags = regs.eflags;
+    auto& outgoing_tss = current->tss();
+
+    if (!pick_next())
+        return;
+
+    outgoing_tss.gs = regs.gs;
+    outgoing_tss.fs = regs.fs;
+    outgoing_tss.es = regs.es;
+    outgoing_tss.ds = regs.ds;
+    outgoing_tss.edi = regs.edi;
+    outgoing_tss.esi = regs.esi;
+    outgoing_tss.ebp = regs.ebp;
+    outgoing_tss.ebx = regs.ebx;
+    outgoing_tss.edx = regs.edx;
+    outgoing_tss.ecx = regs.ecx;
+    outgoing_tss.eax = regs.eax;
+    outgoing_tss.eip = regs.eip;
+    outgoing_tss.cs = regs.cs;
+    outgoing_tss.eflags = regs.eflags;
 
     // Compute process stack pointer.
     // Add 12 for CS, EIP, EFLAGS (interrupt mechanic)
-    current->tss().esp = regs.esp + 12;
-    current->tss().ss = regs.ss;
+    outgoing_tss.esp = regs.esp + 12;
+    outgoing_tss.ss = regs.ss;
 
-    if ((current->tss().cs & 3) != 0) {
-        current->tss().ss = regs.ss_if_crossRing;
-        current->tss().esp = regs.esp_if_crossRing;
+    if ((outgoing_tss.cs & 3) != 0) {
+        outgoing_tss.ss = regs.ss_if_crossRing;
+        outgoing_tss.esp = regs.esp_if_crossRing;
     }
-
-    if (!pick_next())
-        return;
     prepare_for_iret_to_new_process();
 
     // Set the NT (nested task) flag.