From 5cfe5443e678e3354ed3488baea9c91cbb9e7697 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Fri, 9 Jul 2021 16:49:59 +0200 Subject: interrupt self-test --- kernel/idt.c | 8 +++++++- kernel/isr.c | 8 ++++++++ kernel/isr.h | 6 ++++++ 3 files changed, 21 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/idt.c b/kernel/idt.c index e1d45b9..cd032d3 100644 --- a/kernel/idt.c +++ b/kernel/idt.c @@ -1,6 +1,7 @@ #include #include #include +#include // used only for the selftest #include #include @@ -51,7 +52,8 @@ static void idt_prepare() { for (int i = 0; i < 256; i++) IDT[i].present = 0; - idt_add(0x8, false, isr_double_fault); + idt_add(0x08, false, isr_double_fault); + idt_add(0x34, false, isr_test_interrupt); } static void idt_load() { @@ -62,6 +64,10 @@ static void idt_load() { static void idt_test() { asm("int $0x34" : : : "memory"); + if (!isr_test_interrupt_called) { + tty_const("IDT self test failed"); + for(;;); + } } void idt_init() { diff --git a/kernel/isr.c b/kernel/isr.c index 69c688b..331e9a5 100644 --- a/kernel/isr.c +++ b/kernel/isr.c @@ -1,9 +1,17 @@ #include #include +#include #include +bool isr_test_interrupt_called = false; + __attribute__((interrupt)) void isr_double_fault(struct interrupt_frame *frame) { tty_const("#DF"); for(;;); } + +__attribute__((interrupt)) +void isr_test_interrupt(struct interrupt_frame *frame) { + isr_test_interrupt_called = true; +} diff --git a/kernel/isr.h b/kernel/isr.h index 7230986..624e9ad 100644 --- a/kernel/isr.h +++ b/kernel/isr.h @@ -1,6 +1,12 @@ #pragma once +#include struct interrupt_frame; +extern bool isr_test_interrupt_called; // used in the self-test in idt.c + __attribute__((interrupt)) void isr_double_fault(struct interrupt_frame *frame); + +__attribute__((interrupt)) +void isr_test_interrupt(struct interrupt_frame *frame); -- cgit v1.2.3