diff --git a/kernel/arch/i686/boot.S b/kernel/arch/i686/boot.S index 9d003b36..e516a5f7 100644 --- a/kernel/arch/i686/boot.S +++ b/kernel/arch/i686/boot.S @@ -59,10 +59,10 @@ bananboot_start: bananboot_end: .section .bss, "aw", @nobits - .align 4096 - boot_stack_bottom: + .global g_boot_stack_top + g_boot_stack_bottom: .skip 4096 * 4 - boot_stack_top: + g_boot_stack_top: .global g_kernel_cmdline g_kernel_cmdline: @@ -194,7 +194,7 @@ _start: movl %ebx, V2P(bootloader_info) # load boot stack - movl $V2P(boot_stack_top), %esp + movl $V2P(g_boot_stack_top), %esp # load boot GDT lgdt V2P(boot_gdtr) @@ -212,7 +212,7 @@ gdt_flush: call initialize_paging # load higher half stack pointer - movl $boot_stack_top, %esp + movl $g_boot_stack_top, %esp # jump to higher half leal higher_half, %ecx diff --git a/kernel/arch/x86_64/boot.S b/kernel/arch/x86_64/boot.S index c598d943..b6a97c7d 100644 --- a/kernel/arch/x86_64/boot.S +++ b/kernel/arch/x86_64/boot.S @@ -59,9 +59,10 @@ bananboot_start: bananboot_end: .section .bss, "aw", @nobits - boot_stack_bottom: - .skip 4096 * 64 - boot_stack_top: + .global g_boot_stack_top + g_boot_stack_bottom: + .skip 4096 * 4 + g_boot_stack_top: .global g_kernel_cmdline g_kernel_cmdline: @@ -193,7 +194,7 @@ _start: movl %eax, V2P(bootloader_magic) movl %ebx, V2P(bootloader_info) - movl $V2P(boot_stack_top), %esp + movl $V2P(g_boot_stack_top), %esp call check_requirements call enable_sse diff --git a/kernel/include/kernel/IDT.h b/kernel/include/kernel/IDT.h index cb7d200c..a7649b2a 100644 --- a/kernel/include/kernel/IDT.h +++ b/kernel/include/kernel/IDT.h @@ -75,7 +75,7 @@ namespace Kernel private: IDT() = default; - void register_interrupt_handler(uint8_t index, void (*handler)()); + void register_interrupt_handler(uint8_t index, void (*handler)(), uint8_t ist = 0); void register_syscall_handler(uint8_t index, void (*handler)()); private: diff --git a/kernel/kernel/GDT.cpp b/kernel/kernel/GDT.cpp index f14d816d..f8b502ba 100644 --- a/kernel/kernel/GDT.cpp +++ b/kernel/kernel/GDT.cpp @@ -1,8 +1,11 @@ #include +#include #include #include +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(g_boot_stack_top); uintptr_t base = reinterpret_cast(&m_tss); diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index e4860d37..5d298c80 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -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