Kernel: Add custom stack to double fault handler
This prevents triple faults!
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
#include <kernel/GDT.h>
|
||||
#include <kernel/Memory/Types.h>
|
||||
#include <kernel/Processor.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
extern "C" uint8_t g_boot_stack_top[];
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
@@ -62,6 +65,7 @@ namespace Kernel
|
||||
{
|
||||
memset(&m_tss, 0x00, sizeof(TaskStateSegment));
|
||||
m_tss.iopb = sizeof(TaskStateSegment);
|
||||
m_tss.ist1 = reinterpret_cast<vaddr_t>(g_boot_stack_top);
|
||||
|
||||
uintptr_t base = reinterpret_cast<uintptr_t>(&m_tss);
|
||||
|
||||
|
||||
@@ -401,7 +401,7 @@ namespace Kernel
|
||||
Thread::current().load_sse();
|
||||
}
|
||||
|
||||
void IDT::register_interrupt_handler(uint8_t index, void (*handler)())
|
||||
void IDT::register_interrupt_handler(uint8_t index, void (*handler)(), uint8_t ist)
|
||||
{
|
||||
auto& desc = m_idt[index];
|
||||
memset(&desc, 0, sizeof(GateDescriptor));
|
||||
@@ -412,6 +412,7 @@ namespace Kernel
|
||||
desc.offset2 = (uint32_t)((uintptr_t)handler >> 32);
|
||||
#endif
|
||||
|
||||
desc.IST = ist;
|
||||
desc.selector = 0x08;
|
||||
desc.flags = 0x8E;
|
||||
}
|
||||
@@ -453,6 +454,9 @@ namespace Kernel
|
||||
ISR_LIST_X
|
||||
#undef X
|
||||
|
||||
idt->register_interrupt_handler(DoubleFault, isr8, 1);
|
||||
static_assert(DoubleFault == 8);
|
||||
|
||||
#define X(num) idt->register_interrupt_handler(IRQ_VECTOR_BASE + num, irq ## num);
|
||||
IRQ_LIST_X
|
||||
#undef X
|
||||
|
||||
Reference in New Issue
Block a user