fix (core): made CORE_HALT_WHILE interruptable while interrupt handlers

This commit is contained in:
antifallobst 2023-03-04 17:23:12 +01:00
parent ebe10b359d
commit 9d5ba72228
5 changed files with 25 additions and 12 deletions

View File

@ -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 ();

View File

@ -25,12 +25,13 @@
#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");
#endif //NOX_CORE_H #endif //NOX_CORE_H

View File

@ -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);

View File

@ -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) {

View File

@ -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;
}