Browse Source

Kernel: Add interrupt related functions to Processor class

This adds {enable, disable}_interrupts() and are_interrupts_enabled()
to the Processor class, and also implements them for x86(_64) and
aarch64.
Timon Kruiper 3 năm trước cách đây
mục cha
commit
9413fe9fe5
2 tập tin đã thay đổi với 32 bổ sung0 xóa
  1. 17 0
      Kernel/Arch/aarch64/Processor.h
  2. 15 0
      Kernel/Arch/x86/Processor.h

+ 17 - 0
Kernel/Arch/aarch64/Processor.h

@@ -12,6 +12,7 @@
 #include <AK/Types.h>
 
 #include <Kernel/Arch/ProcessorSpecificDataID.h>
+#include <Kernel/Arch/aarch64/Registers.h>
 
 class VirtualAddress;
 
@@ -119,6 +120,22 @@ public:
         return 0;
     }
 
+    ALWAYS_INLINE static bool are_interrupts_enabled()
+    {
+        auto daif = Aarch64::DAIF::read();
+        return !daif.I;
+    }
+
+    ALWAYS_INLINE static void enable_interrupts()
+    {
+        Aarch64::DAIF::clear_I();
+    }
+
+    ALWAYS_INLINE static void disable_interrupts()
+    {
+        Aarch64::DAIF::set_I();
+    }
+
     ALWAYS_INLINE static void enter_critical() { VERIFY_NOT_REACHED(); }
     ALWAYS_INLINE static void leave_critical() { VERIFY_NOT_REACHED(); }
     ALWAYS_INLINE static u32 in_critical()

+ 15 - 0
Kernel/Arch/x86/Processor.h

@@ -422,6 +422,21 @@ public:
         return m_features.has_flag(feature);
     }
 
+    ALWAYS_INLINE static bool are_interrupts_enabled()
+    {
+        return Kernel::are_interrupts_enabled();
+    }
+
+    ALWAYS_INLINE static void enable_interrupts()
+    {
+        sti();
+    }
+
+    ALWAYS_INLINE static void disable_interrupts()
+    {
+        cli();
+    }
+
     void check_invoke_scheduler();
     void invoke_scheduler_async() { m_invoke_scheduler_async = true; }