Index: genarch/src/acpi/matd.c
===================================================================
--- genarch/src/acpi/matd.c	(revision 8cd20b70a0088e1be6c075558d55af632961f0af)
+++ genarch/src/acpi/matd.c	(revision 8418c7d1885256e7d6e4cb637e377cbb2a1be321)
@@ -45,6 +45,10 @@
 #ifdef CONFIG_SMP
 
+/** Standard ISA IRQ map; can be overriden by Interrupt Source Override entries of MADT. */
+int isa_irq_map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+
 static void madt_l_apic_entry(struct madt_l_apic *la, __u32 index);
 static void madt_io_apic_entry(struct madt_io_apic *ioa, __u32 index);
+static void madt_intr_src_ovrd_entry(struct madt_intr_src_ovrd *override, __u32 index);
 static int madt_cmp(void * a, void * b);
 
@@ -80,4 +84,5 @@
 static bool madt_cpu_bootstrap(index_t i);
 static __u8 madt_cpu_apic_id(index_t i);
+static int madt_irq_to_pin(int irq);
 
 struct smp_config_operations madt_config_operations = {
@@ -85,13 +90,14 @@
 	.cpu_enabled = madt_cpu_enabled,
 	.cpu_bootstrap = madt_cpu_bootstrap,
-	.cpu_apic_id = madt_cpu_apic_id
+	.cpu_apic_id = madt_cpu_apic_id,
+	.irq_to_pin = madt_irq_to_pin
 };
 
-static count_t madt_cpu_count(void)
+count_t madt_cpu_count(void)
 {
 	return madt_l_apic_entry_cnt;
 }
 
-static bool madt_cpu_enabled(index_t i)
+bool madt_cpu_enabled(index_t i)
 {
 	ASSERT(i < madt_l_apic_entry_cnt);
@@ -100,5 +106,5 @@
 }
 
-static bool madt_cpu_bootstrap(index_t i)
+bool madt_cpu_bootstrap(index_t i)
 {
 	ASSERT(i < madt_l_apic_entry_cnt);
@@ -106,8 +112,14 @@
 }
 
-static __u8 madt_cpu_apic_id(index_t i)
+__u8 madt_cpu_apic_id(index_t i)
 {
 	ASSERT(i < madt_l_apic_entry_cnt);
 	return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->apic_id;
+}
+
+int madt_irq_to_pin(int irq)
+{
+	ASSERT(irq < sizeof(isa_irq_map)/sizeof(int));
+        return isa_irq_map[irq];
 }
 
@@ -155,4 +167,6 @@
 				break;
 			case MADT_INTR_SRC_OVRD:
+				madt_intr_src_ovrd_entry((struct madt_intr_src_ovrd *) h, index);
+				break;
 			case MADT_NMI_SRC:
 			case MADT_L_APIC_NMI:
@@ -210,4 +224,11 @@
 }
 
+void madt_intr_src_ovrd_entry(struct madt_intr_src_ovrd *override, __u32 index)
+{
+	ASSERT(override->source < sizeof(isa_irq_map)/sizeof(int));
+	printf("Remapping irq%d to IO APIC pin%d\n",  override->source, override->global_intr);
+	isa_irq_map[override->source] = override->global_intr;
+	
+}
 
 #endif /* CONFIG_SMP */
