fix (core): made CORE_HALT_WHILE interruptable while interrupt handlers
This commit is contained in:
parent
ebe10b359d
commit
9d5ba72228
|
@ -83,6 +83,7 @@ typedef struct {
|
||||||
} idt_descriptor_entry_T;
|
} idt_descriptor_entry_T;
|
||||||
|
|
||||||
extern idt_register_T g_idt_register;
|
extern idt_register_T g_idt_register;
|
||||||
|
extern uint8_t g_handling_interrupt;
|
||||||
|
|
||||||
void idt_init ();
|
void idt_init ();
|
||||||
void pic_init ();
|
void pic_init ();
|
||||||
|
|
|
@ -25,10 +25,11 @@
|
||||||
#define NOX_CORE_H
|
#define NOX_CORE_H
|
||||||
|
|
||||||
#include "utils/logger.h"
|
#include "utils/logger.h"
|
||||||
|
#include "platform/interrupts.h"
|
||||||
|
|
||||||
#define CORE_HALT_WHILE(a) while(a) { asm("hlt"); }
|
#define CORE_INTERRUPTABLE_HALT_WHILE(a) while(!g_handling_interrupt && a) { asm("hlt"); }
|
||||||
#define CORE_HALT_FOREVER log(LOG_WARNING, "!=====[ HALTING SYSTEM ]=====!");\
|
#define CORE_HALT_WHILE(a) while(!g_handling_interrupt && a) { asm("hlt"); }
|
||||||
while(1) { asm("hlt"); }
|
#define CORE_HALT_FOREVER log(LOG_WARNING, "!=====[ HALTING SYSTEM ]=====!"); while(1) { asm("hlt"); }
|
||||||
|
|
||||||
#define CORE_INTERRUPTS_ENABLE asm("sti");
|
#define CORE_INTERRUPTS_ENABLE asm("sti");
|
||||||
#define CORE_INTERRUPTS_DISABLE asm("cli");
|
#define CORE_INTERRUPTS_DISABLE asm("cli");
|
||||||
|
|
|
@ -109,7 +109,7 @@ void graphics_buffer_draw_char(graphics_buffer_T* graphics_buffer, uint32_t x, u
|
||||||
}
|
}
|
||||||
|
|
||||||
position_T graphics_buffer_draw_string(graphics_buffer_T* graphics_buffer, uint32_t x, uint32_t y, color_argb_T color, string_t string) {
|
position_T graphics_buffer_draw_string(graphics_buffer_T* graphics_buffer, uint32_t x, uint32_t y, color_argb_T color, string_t string) {
|
||||||
CORE_HALT_WHILE(graphics_buffer->blocked)
|
CORE_INTERRUPTABLE_HALT_WHILE(graphics_buffer->blocked)
|
||||||
graphics_buffer->blocked = true;
|
graphics_buffer->blocked = true;
|
||||||
|
|
||||||
position_T pos = (position_T){x, y};
|
position_T pos = (position_T){x, y};
|
||||||
|
@ -203,7 +203,7 @@ void graphics_renderer_update_graphics_buffer(graphics_buffer_T* graphics_buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
void graphics_renderer_update() {
|
void graphics_renderer_update() {
|
||||||
CORE_HALT_WHILE(g_renderer.blocked)
|
CORE_INTERRUPTABLE_HALT_WHILE(g_renderer.blocked)
|
||||||
g_renderer.blocked = true;
|
g_renderer.blocked = true;
|
||||||
|
|
||||||
memory_set(g_renderer.back_buffer, 0, g_renderer.buffer_size);
|
memory_set(g_renderer.back_buffer, 0, g_renderer.buffer_size);
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
page_frame_manager_T g_page_frame_manager;
|
page_frame_manager_T g_page_frame_manager;
|
||||||
|
|
||||||
void pframe_reserve(void* address) {
|
void pframe_reserve(void* address) {
|
||||||
CORE_HALT_WHILE(g_page_frame_manager.blocked)
|
CORE_INTERRUPTABLE_HALT_WHILE(g_page_frame_manager.blocked)
|
||||||
g_page_frame_manager.blocked = true;
|
g_page_frame_manager.blocked = true;
|
||||||
|
|
||||||
uint64_t index = (uint64_t)address / PFRAME_SIZE;
|
uint64_t index = (uint64_t)address / PFRAME_SIZE;
|
||||||
|
@ -55,7 +55,7 @@ void pframe_reserve_multi(void* address, uint32_t n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void pframe_unreserve(void* address) {
|
void pframe_unreserve(void* address) {
|
||||||
CORE_HALT_WHILE(g_page_frame_manager.blocked)
|
CORE_INTERRUPTABLE_HALT_WHILE(g_page_frame_manager.blocked)
|
||||||
g_page_frame_manager.blocked = true;
|
g_page_frame_manager.blocked = true;
|
||||||
|
|
||||||
uint64_t index = (uint64_t)address / PFRAME_SIZE;
|
uint64_t index = (uint64_t)address / PFRAME_SIZE;
|
||||||
|
@ -104,7 +104,7 @@ void pframe_lock_multi(void* address, uint32_t n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void pframe_free(void* address) {
|
void pframe_free(void* address) {
|
||||||
CORE_HALT_WHILE(g_page_frame_manager.blocked)
|
CORE_INTERRUPTABLE_HALT_WHILE(g_page_frame_manager.blocked)
|
||||||
g_page_frame_manager.blocked = true;
|
g_page_frame_manager.blocked = true;
|
||||||
|
|
||||||
uint64_t index = (uint64_t)address / PFRAME_SIZE;
|
uint64_t index = (uint64_t)address / PFRAME_SIZE;
|
||||||
|
@ -133,7 +133,7 @@ void pframe_free_multi(void* address, uint32_t n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void* pframe_request() {
|
void* pframe_request() {
|
||||||
CORE_HALT_WHILE(g_page_frame_manager.blocked)
|
CORE_INTERRUPTABLE_HALT_WHILE(g_page_frame_manager.blocked)
|
||||||
g_page_frame_manager.blocked = true;
|
g_page_frame_manager.blocked = true;
|
||||||
|
|
||||||
while (g_page_frame_manager.page_bitmap_index < g_page_frame_manager.page_bitmap.size * 8) {
|
while (g_page_frame_manager.page_bitmap_index < g_page_frame_manager.page_bitmap.size * 8) {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "proc/scheduler.h"
|
#include "proc/scheduler.h"
|
||||||
|
|
||||||
idt_register_T g_idt_register;
|
idt_register_T g_idt_register;
|
||||||
|
uint8_t g_handling_interrupt;
|
||||||
|
|
||||||
extern void idt_load(idt_register_T* idt_register);
|
extern void idt_load(idt_register_T* idt_register);
|
||||||
|
|
||||||
|
@ -255,7 +256,7 @@ cpu_state_T* irq_handle(cpu_state_T* state, pic_irq_E irq) {
|
||||||
return return_state;
|
return return_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu_state_T* interrupts_handle(cpu_state_T* state) {
|
cpu_state_T* interrupts_handle_stage_2(cpu_state_T* state) {
|
||||||
if (state->interrupt_id < EXCEPTIONS_ENUM_END) {
|
if (state->interrupt_id < EXCEPTIONS_ENUM_END) {
|
||||||
return exception_handle(state);
|
return exception_handle(state);
|
||||||
}
|
}
|
||||||
|
@ -273,3 +274,13 @@ cpu_state_T* interrupts_handle(cpu_state_T* state) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cpu_state_T* interrupts_handle(cpu_state_T* state) {
|
||||||
|
g_handling_interrupt++;
|
||||||
|
|
||||||
|
state = interrupts_handle_stage_2(state);
|
||||||
|
|
||||||
|
g_handling_interrupt--;
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue