Compare commits
2 Commits
e90b90c556
...
f5deb1048a
Author | SHA1 | Date | |
---|---|---|---|
f5deb1048a | |||
b3e16068ef |
@ -8,4 +8,10 @@ namespace Interrupts
|
||||
|
||||
bool is_in_handler();
|
||||
void return_from_handler(Context* context);
|
||||
|
||||
bool are_enabled();
|
||||
bool were_enabled();
|
||||
void push_and_disable();
|
||||
void push_and_enable();
|
||||
void pop();
|
||||
}
|
@ -5,4 +5,6 @@ namespace Utilities
|
||||
{
|
||||
uint64_t get_blocks_from_size(uint64_t blocksize,
|
||||
uint64_t size); // Returns how many blocks of size blocksize does size occupy.
|
||||
|
||||
uint64_t get_rflags();
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
#include "interrupts/Interrupts.h"
|
||||
#include "misc/utils.h"
|
||||
#include "trace/StackTracer.h"
|
||||
|
||||
void Interrupts::disable()
|
||||
@ -24,4 +25,35 @@ void Interrupts::return_from_handler(Context* context)
|
||||
"jmp _asm_interrupt_exit"
|
||||
:
|
||||
: "r"(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;
|
||||
}
|
@ -25,4 +25,10 @@ asm_enable_sse:
|
||||
mov rax, cr4
|
||||
or ax, 3 << 9
|
||||
mov cr4, rax
|
||||
ret
|
||||
|
||||
global asm_get_rflags
|
||||
asm_get_rflags:
|
||||
pushfq
|
||||
pop rax
|
||||
ret
|
@ -3,4 +3,10 @@
|
||||
uint64_t Utilities::get_blocks_from_size(uint64_t blocksize, uint64_t size)
|
||||
{
|
||||
return (size + (blocksize - 1)) / blocksize;
|
||||
}
|
||||
|
||||
extern "C" uint64_t asm_get_rflags();
|
||||
uint64_t Utilities::get_rflags()
|
||||
{
|
||||
return asm_get_rflags();
|
||||
}
|
Loading…
Reference in New Issue
Block a user