Преглед изворни кода

Interrupts: Assert if trying to install an handler on syscall vector

Installing an interrupt handler on the syscall IDT vector can lead to
fatal results, so we must assert if that happens.
Liav A пре 5 година
родитељ
комит
dbc536e917
3 измењених фајлова са 6 додато и 1 уклоњено
  1. 3 0
      Kernel/Interrupts/InterruptManagement.cpp
  2. 1 1
      Kernel/Syscall.cpp
  3. 2 0
      Kernel/Syscall.h

+ 3 - 0
Kernel/Interrupts/InterruptManagement.cpp

@@ -34,6 +34,7 @@
 #include <Kernel/Interrupts/PIC.h>
 #include <Kernel/Interrupts/SpuriousInterruptHandler.h>
 #include <Kernel/Interrupts/UnhandledInterruptHandler.h>
+#include <Kernel/Syscall.h>
 #include <Kernel/VM/MemoryManager.h>
 #include <LibBareMetal/IO.h>
 
@@ -99,6 +100,8 @@ u8 InterruptManagement::acquire_irq_number(u8 mapped_interrupt_vector)
 u8 InterruptManagement::get_mapped_interrupt_vector(u8 original_irq)
 {
     // FIXME: For SMP configuration (with IOAPICs) use a better routing scheme to make redirections more efficient.
+    // FIXME: Find a better way to handle conflict with Syscall interrupt gate.
+    ASSERT((original_irq + IRQ_VECTOR_BASE) != syscall_vector);
     return original_irq;
 }
 

+ 1 - 1
Kernel/Syscall.cpp

@@ -69,7 +69,7 @@ static int handle(RegisterState&, u32 function, u32 arg1, u32 arg2, u32 arg3);
 
 void initialize()
 {
-    register_user_callable_interrupt_handler(0x82, syscall_asm_entry);
+    register_user_callable_interrupt_handler(syscall_vector, syscall_asm_entry);
     klog() << "Syscall: int 0x82 handler installed";
 }
 

+ 2 - 0
Kernel/Syscall.h

@@ -32,6 +32,8 @@
 #    include <LibC/fd_set.h>
 #endif
 
+constexpr int syscall_vector = 0x82;
+
 extern "C" {
 struct timeval;
 struct timespec;