Index: arch/ia32/include/acpi/madt.h
===================================================================
--- arch/ia32/include/acpi/madt.h	(revision a26ddd11445ebfd4a188b1e7aba9091fb10326d5)
+++ arch/ia32/include/acpi/madt.h	(revision 232e3ec7da87512a523d53e8b673b483962d5d33)
@@ -32,4 +32,5 @@
 #include <arch/acpi/acpi.h>
 #include <arch/smp/apic.h>
+#include <arch/smp/smp.h>
 
 #define	MADT_L_APIC			0
@@ -133,4 +134,5 @@
 
 extern struct acpi_madt *acpi_madt;
+extern struct smp_config_operations madt_config_operations;
 
 extern void acpi_madt_parse(void);
Index: arch/ia32/src/acpi/madt.c
===================================================================
--- arch/ia32/src/acpi/madt.c	(revision a26ddd11445ebfd4a188b1e7aba9091fb10326d5)
+++ arch/ia32/src/acpi/madt.c	(revision 232e3ec7da87512a523d53e8b673b483962d5d33)
@@ -28,9 +28,13 @@
 
 #include <arch/types.h>
+#include <typedefs.h>
 #include <arch/acpi/acpi.h>
 #include <arch/acpi/madt.h>
 #include <arch/smp/apic.h>
+#include <arch/smp/smp.h>
 #include <mm/page.h>
 #include <panic.h>
+#include <debug.h>
+#include <config.h>
 
 struct acpi_madt *acpi_madt = NULL;
@@ -65,4 +69,42 @@
 	"PLATFORM_INTR_SRC"
 };
+
+/*
+ * ACPI MADT Implementation of SMP configuration interface.
+ */
+static count_t madt_cpu_count(void);
+static bool madt_cpu_enabled(index_t i);
+static bool madt_cpu_bootstrap(index_t i);
+static __u8 madt_cpu_apic_id(index_t i);
+
+struct smp_config_operations madt_config_operations = {
+	.cpu_count = madt_cpu_count,
+	.cpu_enabled = madt_cpu_enabled,
+	.cpu_bootstrap = madt_cpu_bootstrap,
+	.cpu_apic_id = madt_cpu_apic_id
+};
+
+static count_t madt_cpu_count(void)
+{
+	return madt_l_apic_entry_cnt;
+}
+
+static bool madt_cpu_enabled(index_t i)
+{
+	ASSERT(i < madt_l_apic_entry_cnt);
+	return madt_l_apic_entries[i].flags & 0x1;
+}
+
+static bool madt_cpu_bootstrap(index_t i)
+{
+	ASSERT(i < madt_l_apic_entry_cnt);
+	return madt_l_apic_entries[i].apic_id == l_apic_id();
+}
+
+static __u8 madt_cpu_apic_id(index_t i)
+{
+	ASSERT(i < madt_l_apic_entry_cnt);
+	return madt_l_apic_entries[i].apic_id;
+}
 
 void acpi_madt_parse(void)
@@ -106,4 +148,6 @@
 	}
 
+	if (madt_l_apic_entry_cnt)
+		config.cpu_count = madt_l_apic_entry_cnt;
 }
  
Index: arch/ia32/src/smp/smp.c
===================================================================
--- arch/ia32/src/smp/smp.c	(revision a26ddd11445ebfd4a188b1e7aba9091fb10326d5)
+++ arch/ia32/src/smp/smp.c	(revision 232e3ec7da87512a523d53e8b673b483962d5d33)
@@ -52,4 +52,5 @@
 	if (acpi_madt) {
 		acpi_madt_parse();
+		ops = &madt_config_operations;
 	}
 	if (config.cpu_count == 1) {
