From 0185572afc18c8a33df7faecd5aa723e89dca391 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 27 Jun 2023 20:03:57 -0300 Subject: [PATCH] interrupts: IPL_IGNORE which doesn't raise nor lower the IPL on an interrupt --- kernel-src/arch/x86-64/apic.c | 2 +- kernel-src/arch/x86-64/idt.c | 2 +- kernel-src/arch/x86-64/mmu.c | 2 +- kernel-src/include/kernel/interrupt.h | 2 +- kernel-src/sys/interrupt.c | 7 +++++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/kernel-src/arch/x86-64/apic.c b/kernel-src/arch/x86-64/apic.c index bbf806c5..741cd950 100644 --- a/kernel-src/arch/x86-64/apic.c +++ b/kernel-src/arch/x86-64/apic.c @@ -201,7 +201,7 @@ void arch_apic_initap() { writelapic(APIC_LVT_LINT1, LVT_MASK); writelapic(APIC_LVT_ERROR, LVT_MASK); writelapic(APIC_LVT_TIMER, LVT_MASK); - interrupt_register(0xff, spurious, NULL, IPL_MAX); // XXX for now max ipl suffices, however it's likely not the best one + interrupt_register(0xff, spurious, NULL, IPL_IGNORE); writelapic(APIC_REG_SPURIOUS, 0x1FF); _cpu()->id = readlapic(APIC_REG_ID) >> 24; diff --git a/kernel-src/arch/x86-64/idt.c b/kernel-src/arch/x86-64/idt.c index b9219693..f4fb85db 100644 --- a/kernel-src/arch/x86-64/idt.c +++ b/kernel-src/arch/x86-64/idt.c @@ -79,7 +79,7 @@ void arch_idt_reload() { // make sure to reserve the first 32 isrs for exceptions with a dummy panic isr for (int i = 0; i < 32; ++i) - interrupt_register(i, exceptisr, NULL, IPL_MAX); + interrupt_register(i, exceptisr, NULL, IPL_IGNORE); _cpu()->ipl = IPL_NORMAL; interrupt_set(true); diff --git a/kernel-src/arch/x86-64/mmu.c b/kernel-src/arch/x86-64/mmu.c index 21cee419..b519508e 100644 --- a/kernel-src/arch/x86-64/mmu.c +++ b/kernel-src/arch/x86-64/mmu.c @@ -265,5 +265,5 @@ void arch_mmu_init() { } arch_mmu_switch(FROM_HHDM(template)); - interrupt_register(14, pfisr, NULL, IPL_MAX); + interrupt_register(14, pfisr, NULL, IPL_IGNORE); } diff --git a/kernel-src/include/kernel/interrupt.h b/kernel-src/include/kernel/interrupt.h index 6cb837e7..14627202 100644 --- a/kernel-src/include/kernel/interrupt.h +++ b/kernel-src/include/kernel/interrupt.h @@ -11,7 +11,7 @@ #error Unsupported architecture! #endif -#define IPL_EXCEPT -1 +#define IPL_IGNORE -1 #define IPL_MAX 0 #define IPL_TIMER 1 #define IPL_KEYBOARD 2 diff --git a/kernel-src/sys/interrupt.c b/kernel-src/sys/interrupt.c index 980d54b7..7bfedc54 100644 --- a/kernel-src/sys/interrupt.c +++ b/kernel-src/sys/interrupt.c @@ -30,12 +30,15 @@ static void insertinqueue(isr_t *isr) { } static void runisr(isr_t *isr, context_t *ctx) { - long oldipl = interrupt_raiseipl(isr->priority); + long oldipl = -1; + if (isr->priority != IPL_IGNORE) + oldipl = interrupt_raiseipl(isr->priority); isr->func(isr, ctx); interrupt_set(false); - interrupt_loweripl(oldipl); + if (isr->priority != IPL_IGNORE) + interrupt_loweripl(oldipl); } static void dopending(context_t *ctx) {