Iros
 
Loading...
Searching...
No Matches
interrupt_disabler.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/types/prelude.h"
4
5namespace iris {
6namespace arch {
7 constexpr inline di::u64 interrupt_enable_flag = 1 << 9;
8}
9
10static inline void raw_enable_interrupts() {
11 asm volatile("sti");
12}
13
14static inline void raw_disable_interrupts() {
15 asm volatile("cli");
16}
17
18static inline auto interrupts_disabled() -> bool {
19 di::u64 rflags;
20 asm volatile("pushfq\n"
21 "pop %0\n"
22 : "=r"(rflags)
23 :
24 : "cc");
25 return (rflags & arch::interrupt_enable_flag) == 0U;
26}
27
28static inline auto raw_disable_interrupts_and_save_previous_state() -> bool {
29 di::u64 rflags;
30 asm volatile("pushfq\n"
31 "pop %0\n"
32 : "=r"(rflags)
33 :
34 : "cc");
35 if (!(rflags & arch::interrupt_enable_flag)) {
36 return true;
37 }
38 raw_disable_interrupts();
39 return false;
40}
41
43public:
44 InterruptDisabler() { m_had_interrupts_disabled = raw_disable_interrupts_and_save_previous_state(); }
45
47 if (!m_had_interrupts_disabled) {
48 raw_enable_interrupts();
49 }
50 }
51
52private:
53 bool m_had_interrupts_disabled { false };
54};
55}
InterruptDisabler()
Definition interrupt_disabler.h:44
~InterruptDisabler()
Definition interrupt_disabler.h:46
__UINT64_TYPE__ u64
Definition integers.h:12
Definition cxx_init.cpp:12
constexpr di::u64 interrupt_enable_flag
Definition interrupt_disabler.h:7
Definition cxx_init.cpp:12
@ U
Definition key.h:30