Ver código fonte

Kernel: Simplify x86 IOPL sanity check

Move this architecture-specific sanity check (IOPL must be 0) out of
Scheduler and into the x86 enter_thread_context(). Also do this for
every thread and not just userspace ones.
Andreas Kling 3 anos atrás
pai
commit
a6b5065d94
2 arquivos alterados com 4 adições e 10 exclusões
  1. 4 2
      Kernel/Arch/x86/common/Processor.cpp
  2. 0 8
      Kernel/Scheduler.cpp

+ 4 - 2
Kernel/Arch/x86/common/Processor.cpp

@@ -1312,6 +1312,10 @@ extern "C" void enter_thread_context(Thread* from_thread, Thread* to_thread)
     auto& from_regs = from_thread->regs();
     auto& to_regs = to_thread->regs();
 
+    // NOTE: IOPL should never be non-zero in any situation, so let's panic immediately
+    //       instead of carrying on with elevated I/O privileges.
+    VERIFY(get_iopl_from_eflags(to_regs.flags()) == 0);
+
     if (has_fxsr)
         asm volatile("fxsave %0"
                      : "=m"(from_thread->fpu_state()));
@@ -1358,8 +1362,6 @@ extern "C" void enter_thread_context(Thread* from_thread, Thread* to_thread)
         asm volatile("fxrstor %0" ::"m"(to_thread->fpu_state()));
     else
         asm volatile("frstor %0" ::"m"(to_thread->fpu_state()));
-
-    // TODO: ioperm?
 }
 
 extern "C" FlatPtr do_init_context(Thread* thread, u32 flags)

+ 0 - 8
Kernel/Scheduler.cpp

@@ -310,14 +310,6 @@ bool Scheduler::context_switch(Thread* thread)
     enter_current(*from_thread);
     VERIFY(thread == Thread::current());
 
-    if (thread->process().is_user_process() && thread->previous_mode() != Thread::PreviousMode::KernelMode && thread->current_trap()) {
-        auto& regs = thread->get_register_dump_from_stack();
-        auto iopl = get_iopl_from_eflags(regs.flags());
-        if (iopl != 0) {
-            PANIC("Switched to thread {} with non-zero IOPL={}", Thread::current()->tid().value(), iopl);
-        }
-    }
-
     return true;
 }