Kernel: I have no idea what this commit does
I had committed a change in IDT but reverted it now. This propably only adds a spurious interrupt detection to common cpp interrupt handler?
This commit is contained in:
parent
9c31790359
commit
e87026f01d
|
@ -137,7 +137,19 @@ namespace IDT
|
||||||
if (s_irq_handlers[irq])
|
if (s_irq_handlers[irq])
|
||||||
s_irq_handlers[irq]();
|
s_irq_handlers[irq]();
|
||||||
else
|
else
|
||||||
Kernel::Panic("no handler for irq 0x{2H}\n", irq);
|
{
|
||||||
|
uint32_t isr_byte = irq / 32;
|
||||||
|
uint32_t isr_bit = irq % 32;
|
||||||
|
|
||||||
|
uint32_t isr[8];
|
||||||
|
InterruptController::Get().GetISR(isr);
|
||||||
|
if (!(isr[isr_byte] & (1 << isr_bit)))
|
||||||
|
{
|
||||||
|
dprintln("spurious irq 0x{2H}", irq);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dprintln("no handler for irq 0x{2H}\n", irq);
|
||||||
|
}
|
||||||
|
|
||||||
InterruptController::Get().EOI(irq);
|
InterruptController::Get().EOI(irq);
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,19 @@ namespace IDT
|
||||||
if (s_irq_handlers[irq])
|
if (s_irq_handlers[irq])
|
||||||
s_irq_handlers[irq]();
|
s_irq_handlers[irq]();
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
uint32_t isr_byte = irq / 32;
|
||||||
|
uint32_t isr_bit = irq % 32;
|
||||||
|
|
||||||
|
uint32_t isr[8];
|
||||||
|
InterruptController::Get().GetISR(isr);
|
||||||
|
if (!(isr[isr_byte] & (1 << isr_bit)))
|
||||||
|
{
|
||||||
|
dprintln("spurious irq 0x{2H}", irq);
|
||||||
|
return;
|
||||||
|
}
|
||||||
dprintln("no handler for irq 0x{2H}\n", irq);
|
dprintln("no handler for irq 0x{2H}\n", irq);
|
||||||
|
}
|
||||||
|
|
||||||
InterruptController::Get().EOI(irq);
|
InterruptController::Get().EOI(irq);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
#define PIC2_COMMAND PIC2
|
#define PIC2_COMMAND PIC2
|
||||||
#define PIC2_DATA (PIC2+1)
|
#define PIC2_DATA (PIC2+1)
|
||||||
|
|
||||||
#define PIC_EOI 0x20 /* End-of-interrupt command code */
|
#define PIC_READ_ISR 0x0B
|
||||||
|
#define PIC_EOI 0x20
|
||||||
|
|
||||||
#define ICW1_ICW4 0x01 /* ICW4 (not) needed */
|
#define ICW1_ICW4 0x01 /* ICW4 (not) needed */
|
||||||
#define ICW1_SINGLE 0x02 /* Single (cascade) mode */
|
#define ICW1_SINGLE 0x02 /* Single (cascade) mode */
|
||||||
|
@ -100,8 +101,8 @@ void PIC::EnableIrq(uint8_t irq)
|
||||||
void PIC::GetISR(uint32_t out[8])
|
void PIC::GetISR(uint32_t out[8])
|
||||||
{
|
{
|
||||||
memset(out, 0, 8 * sizeof(uint32_t));
|
memset(out, 0, 8 * sizeof(uint32_t));
|
||||||
IO::outb(PIC1_COMMAND, 0x0b);
|
IO::outb(PIC1_COMMAND, PIC_READ_ISR);
|
||||||
IO::outb(PIC2_COMMAND, 0x0b);
|
IO::outb(PIC2_COMMAND, PIC_READ_ISR);
|
||||||
uint16_t isr0 = IO::inb(PIC1_COMMAND);
|
uint16_t isr0 = IO::inb(PIC1_COMMAND);
|
||||||
uint16_t isr1 = IO::inb(PIC2_COMMAND);
|
uint16_t isr1 = IO::inb(PIC2_COMMAND);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue