#include <devices/apic.h>
+/*
+#ifndef DEBUG_IO_APIC
+#undef PrintDebug
+#define PrintDebug(fmt, args...)
+#endif
+*/
+
#define IO_APIC_BASE_ADDR 0xfec00000
break;
default:
{
- uint_t redir_index = (ioapic->index_reg - IOAPIC_REDIR_BASE_REG) % 2;
+ uint_t redir_index = (ioapic->index_reg - IOAPIC_REDIR_BASE_REG) & 0xfffffffe;
uint_t hi_val = (ioapic->index_reg - IOAPIC_REDIR_BASE_REG) % 1;
if (redir_index > 0x3f) {
break;
default:
{
- uint_t redir_index = (ioapic->index_reg - IOAPIC_REDIR_BASE_REG) % 2;
+ uint_t redir_index = (ioapic->index_reg - IOAPIC_REDIR_BASE_REG) & 0xfffffffe;
uint_t hi_val = (ioapic->index_reg - IOAPIC_REDIR_BASE_REG) % 1;
+
+
+
if (redir_index > 0x3f) {
PrintError("Invalid redirection table entry %x\n", (uint32_t)redir_index);
return -1;
}
if (hi_val) {
+ PrintDebug("Writing to hi of pin %d\n", redir_index);
ioapic->redir_tbl[redir_index].hi = op_val;
} else {
+ PrintDebug("Writing to lo of pin %d\n", redir_index);
op_val &= REDIR_LO_MASK;
ioapic->redir_tbl[redir_index].lo &= ~REDIR_LO_MASK;
ioapic->redir_tbl[redir_index].lo |= op_val;
irq_entry = &(ioapic->redir_tbl[irq]);
if (irq_entry->mask == 0) {
+ PrintDebug("IOAPIC Signalling APIC to raise INTR %d\n", irq_entry->vec);
v3_apic_raise_intr(ioapic->apic, irq_entry->vec);
}