2022-09-05 14:13:51 +00:00
|
|
|
#include "interrupts/Interrupts.h"
|
2022-09-29 16:35:51 +00:00
|
|
|
#include "trace/StackTracer.h"
|
2022-10-14 15:21:16 +00:00
|
|
|
#include "utils/Registers.h"
|
2022-09-05 14:13:51 +00:00
|
|
|
|
|
|
|
void Interrupts::disable()
|
|
|
|
{
|
|
|
|
asm volatile("cli");
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interrupts::enable()
|
|
|
|
{
|
|
|
|
asm volatile("sti");
|
2022-09-20 15:16:07 +00:00
|
|
|
}
|
|
|
|
|
2022-09-29 16:35:51 +00:00
|
|
|
extern int _asm_interrupt_exit;
|
2022-09-20 15:16:07 +00:00
|
|
|
|
2022-09-29 16:35:51 +00:00
|
|
|
bool Interrupts::is_in_handler()
|
2022-09-21 19:03:49 +00:00
|
|
|
{
|
2022-09-29 16:35:51 +00:00
|
|
|
return stack_trace_contains((uintptr_t)&_asm_interrupt_exit);
|
2022-09-21 19:03:49 +00:00
|
|
|
}
|
|
|
|
|
2022-09-20 17:56:43 +00:00
|
|
|
void Interrupts::return_from_handler(Context* context)
|
2022-09-20 15:16:07 +00:00
|
|
|
{
|
|
|
|
asm volatile("mov %0, %%rsp\n"
|
|
|
|
"jmp _asm_interrupt_exit"
|
|
|
|
:
|
|
|
|
: "r"(context));
|
2022-10-12 10:56:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Interrupts::are_enabled()
|
|
|
|
{
|
2022-10-14 15:21:16 +00:00
|
|
|
return (read_rflags() & 0x200) > 0;
|
2022-10-12 10:58:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2022-09-05 14:13:51 +00:00
|
|
|
}
|