shithub: vmxsmp

Download patch

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)
 {
--