ref: a3cfb13960d937a0ecaad3ea738fd55bf7c14105
parent: 18cd045b76f7e605ac127f4276a6029a844cfd53
author: glenda <glenda@fileserver>
date: Sat Dec 27 23:37:11 EST 2025
io.c fix
--- a/io.c
+++ b/io.c
@@ -66,7 +66,7 @@
extern IOApic *ioapic;
extern IpiQueue *ipiqueue;
int target_cpu;
- static int rotate_cpu = 0;
+ static int rotate_cpu = 0;
u64int redir;
int vector;
@@ -76,22 +76,40 @@
return;
}
- extern void ipi_queue(int, int);
+ if(irqnum < 16 && !(lapic_svr[0] & 0x100)){+ irqline(irqnum, level);
+ return;
+ }
+ extern void ipi_queue(int, int);
+
if(irqnum >= 0 && irqnum < 24){lock(&ioapic->lock);
redir = ioapic->redir[irqnum];
- unlock(&ioapic->lock);
- if(redir & (1ULL << 16))
- return; /* Masked */
+ /* CRITICAL FIX: Track IRQ level state for level-triggered interrupts */
+ if(level)
+ ioapic->irq_level |= (1 << irqnum);
+ else
+ ioapic->irq_level &= ~(1 << irqnum);
+ if(redir & (1ULL << 16)){+ /* Masked - set pending so it fires when unmasked */
+ if(level)
+ ioapic->irq_pending |= (1 << irqnum);
+ unlock(&ioapic->lock);
+ if(irqnum < 16)
+ irqline(irqnum, level);
+ return;
+ }
+
+ unlock(&ioapic->lock);
+
vector = redir & 0xFF;
- /* Get target CPU from destination */
if(redir & (1ULL << 11)){- rotate_cpu = (rotate_cpu + 1) % nvcpu;
- target_cpu = rotate_cpu; /* Logical mode - simplified */
+ rotate_cpu = (rotate_cpu + 1) % nvcpu;
+ target_cpu = rotate_cpu;
} else {target_cpu = (redir >> 56) & 0xF;
if(target_cpu >= MAXVCPU)
@@ -103,8 +121,6 @@
}
}
}
-
-
static void
uarttxflush(int idx)
{--
⑨