diff --git a/kernel/include/interrupts/Interrupts.h b/kernel/include/interrupts/Interrupts.h index 507fa590..e5e5b26f 100644 --- a/kernel/include/interrupts/Interrupts.h +++ b/kernel/include/interrupts/Interrupts.h @@ -10,4 +10,8 @@ namespace Interrupts void return_from_handler(Context* context); bool are_enabled(); + bool were_enabled(); + void push_and_disable(); + void push_and_enable(); + void pop(); } \ No newline at end of file diff --git a/kernel/src/interrupts/Interrupts.cpp b/kernel/src/interrupts/Interrupts.cpp index 96dd830f..06d40db7 100644 --- a/kernel/src/interrupts/Interrupts.cpp +++ b/kernel/src/interrupts/Interrupts.cpp @@ -30,4 +30,30 @@ void Interrupts::return_from_handler(Context* context) bool Interrupts::are_enabled() { return (Utilities::get_rflags() & 0x200) > 0; +} + +static bool saved_interrupt_state; + +void Interrupts::push_and_disable() +{ + saved_interrupt_state = are_enabled(); + disable(); +} + +void Interrupts::push_and_enable() +{ + saved_interrupt_state = are_enabled(); + enable(); +} + +void Interrupts::pop() +{ + if (saved_interrupt_state && !are_enabled()) enable(); + else if (!saved_interrupt_state && are_enabled()) + disable(); +} + +bool Interrupts::were_enabled() +{ + return saved_interrupt_state; } \ No newline at end of file