diff -uNr linux-2.6.8.1-ioapic-virtwire-on-shutdown.i386/arch/x86_64/kernel/io_apic.c linux-2.6.8.1-ioapic-virtwire-on-shutdown.x86_64/arch/x86_64/kernel/io_apic.c
--- linux-2.6.8.1-ioapic-virtwire-on-shutdown.i386/arch/x86_64/kernel/io_apic.c	Wed Aug 18 14:54:30 2004
+++ linux-2.6.8.1-ioapic-virtwire-on-shutdown.x86_64/arch/x86_64/kernel/io_apic.c	Wed Aug 18 14:59:27 2004
@@ -1123,10 +1123,42 @@
  */
 void disable_IO_APIC(void)
 {
+	int pin;
 	/*
 	 * Clear the IO-APIC before rebooting:
 	 */
 	clear_IO_APIC();
+
+	/*
+	 * If the i82559 is routed through an IOAPIC
+	 * Put that IOAPIC in virtual wire mode
+	 * so legacy interrups can be delivered.
+	 */
+	pin = find_isa_irq_pin(0, mp_ExtINT);
+	if (pin != -1) {
+		struct IO_APIC_route_entry entry;
+		unsigned long flags;
+
+		memset(&entry, 0, sizeof(entry));
+		entry.mask            = 0; /* Enabled */
+		entry.trigger         = 0; /* Edge */
+		entry.irr             = 0;
+		entry.polarity        = 0; /* High */
+		entry.delivery_status = 0;
+		entry.dest_mode       = 0; /* Physical */
+		entry.delivery_mode   = 7; /* ExtInt */
+		entry.vector          = 0;
+		entry.dest.physical.physical_dest = 0;
+
+
+		/*
+		 * Add it to the IO-APIC irq-routing table:
+		 */
+		spin_lock_irqsave(&ioapic_lock, flags);
+		io_apic_write(0, 0x11+2*pin, *(((int *)&entry)+1));
+		io_apic_write(0, 0x10+2*pin, *(((int *)&entry)+0));
+		spin_unlock_irqrestore(&ioapic_lock, flags);
+	}
 
 	disconnect_bsp_APIC();
 }
