Index: arch/ia32/include/acpi/acpi.h
===================================================================
--- arch/ia32/include/acpi/acpi.h	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ arch/ia32/include/acpi/acpi.h	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -74,3 +74,5 @@
 extern void acpi_init(void);
 
+static int rsdp_check(__u8 *rsdp);
+
 #endif /* __ACPI_H__ */
Index: arch/ia32/src/acpi/acpi.c
===================================================================
--- arch/ia32/src/acpi/acpi.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ arch/ia32/src/acpi/acpi.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -28,8 +28,57 @@
 
 #include <arch/acpi/acpi.h>
+#include <arch/bios/bios.h>
+
+#define RSDP_SIGNATURE		"RSD PTR "
+#define RSDP_REVISION_OFFS	15
 
 struct acpi_rsdp *acpi_rsdp = NULL;
 
+int rsdp_check(__u8 *rsdp) {
+	struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp;
+	__u8 sum = 0;
+	int i;
+	
+	for (i=0; i<20; i++)
+		sum += rsdp[i];
+		
+	if (sum)	
+		return 0; /* bad checksum */
+
+	if (r->revision == 0)
+		return 1; /* ACPI 1.0 */
+		
+	for (; i<r->length; i++)
+		sum += rsdp[i];
+		
+	return !sum;
+	
+}
+
 void acpi_init(void)
 {
+        __u8 *addr[2] = { NULL, (__u8 *) 0xe0000 };
+        int i, j, length[2] = { 1024, 128*1024 };
+	__u64 *sig = (__u64 *) RSDP_SIGNATURE;
+
+        /*
+	 * Find Root System Description Pointer
+         * 1. search first 1K of EBDA
+         * 2. search 128K starting at 0xe0000
+         */
+
+	addr[0] = (__u8 *) ebda;
+	for (i = (ebda ? 0 : 1); i < 2; i++) {
+                for (j = 0; j < length[i]; j += 16) {
+                        if (*((__u64 *) &addr[i][j]) == *sig && rsdp_check(&addr[i][j])) {
+                                acpi_rsdp = (struct acpi_rsdp *) &addr[i][j];
+                                goto rsdp_found;
+                        }
+                }
+        }
+
+        return;
+
+rsdp_found:
+        printf("%L: ACPI Root System Description Pointer\n", acpi_rsdp);		
 }
Index: arch/ia32/src/ia32.c
===================================================================
--- arch/ia32/src/ia32.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ arch/ia32/src/ia32.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -86,5 +86,14 @@
 	if (config.cpu_active == 1) {
 		ega_init();	/* video */
+	}
+}
+
+void arch_late_init()
+{
+	if (config.cpu_active == 1) {
+		#ifdef __SMP__
 		acpi_init();
+		mp_init();
+		#endif /* __SMP__ */
 	}
 }
Index: arch/ia32/src/smp/mp.c
===================================================================
--- arch/ia32/src/smp/mp.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ arch/ia32/src/smp/mp.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -129,47 +129,23 @@
 void mp_init(void)
 {
-	__address addr, frame;
-	int cnt, n;
-	
-
-	/*
-	 * EBDA can be undefined. In that case addr would be 0. 
-	 */
-	addr = ebda;
-	if (addr) {
-		cnt = 1024;
-		while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
-			if (mp_fs_check((__u8 *) addr))
+	__u8 *addr[2] = { NULL, (__u8 *) 0xf0000 };
+	int i, j, length[2] = { 1024, 64*1024 };
+	
+
+	/*
+	 * Find MP Floating Pointer Structure
+	 * 1a. search first 1K of EBDA
+	 * 1b. if EBDA is undefined, search last 1K of base memory
+	 *  2. search 64K starting at 0xf0000
+	 */
+
+	addr[0] = (__u8 *) (ebda ? ebda : 639 * 1024);
+	for (i = 0; i < 2; i++) {
+		for (j = 0; j < length[i]; j += 16) {
+			if (*((__u32 *) &addr[i][j]) == FS_SIGNATURE && mp_fs_check(&addr[i][j])) {
+				fs = (struct __mpfs *) &addr[i][j];
 				goto fs_found;
-			addr++;
-			cnt--;
-		}
-	}
-	else {
-		/*
-		 * Second place where the MP Floating Pointer Structure may live is the last
-		 * kilobyte of base memory.
-		 */
-		addr = 639*1024;
-		cnt = 1024;
-		while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
-			if (mp_fs_check((__u8 *) addr))
-				goto fs_found;
-			addr++;
-			cnt--;
-		}
-	}
-
-	/*
-	 * As the last resort, MP Floating Pointer Structure is searched in the BIOS
-	 * ROM.
-	 */
-	addr = 0xf0000;
-	cnt = 64*1024;
-	while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
-		if (mp_fs_check((__u8 *) addr))
-			goto fs_found;
-		addr++;
-		cnt--;
+			}
+		}
 	}
 
@@ -177,9 +153,8 @@
 	
 fs_found:
-	printf("%L: MP Floating Pointer Structure\n", addr);
-
-	fs = (struct __mpfs *) addr;
+	printf("%L: MP Floating Pointer Structure\n", fs);
+
 	frame_not_free((__address) fs);
-	
+
 	if (fs->config_type == 0 && fs->configuration_table) {
 		if (fs->mpfib2 >> 7) {
Index: arch/mips/src/mips.c
===================================================================
--- arch/mips/src/mips.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ arch/mips/src/mips.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -54,2 +54,6 @@
 {
 }
+
+void arch_late_init(void)
+{
+}
Index: include/arch.h
===================================================================
--- include/arch.h	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ include/arch.h	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -42,4 +42,5 @@
 extern void arch_pre_mm_init(void);
 extern void arch_post_mm_init(void);
+extern void arch_late_init(void);
 extern void calibrate_delay_loop(void);
 
Index: include/func.h
===================================================================
--- include/func.h	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ include/func.h	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -38,5 +38,3 @@
 extern int strcmp(char *src, char *dst);
 
-extern __address __u32_search(__address src, int cnt, __u32 x);
-
 #endif
Index: src/lib/func.c
===================================================================
--- src/lib/func.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ src/lib/func.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -60,14 +60,2 @@
 	return 1;
 }
-
-__address __u32_search(__address src, int cnt, __u32 x)
-{
-	__u32 *base = (__u32 *) src; 
-	int i;
-	
-	for (i=0; i<=cnt-sizeof(__u32); i++)
-		if (base[i] == x)
-			return (__address) &base[i];
-
-	return 0;
-}
Index: src/main/kinit.c
===================================================================
--- src/main/kinit.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ src/main/kinit.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -86,7 +86,10 @@
 	 * Now that all CPUs are up, we can report what we've found.
 	 */
-	for (i = 0; i < config.cpu_count; i++)
+	for (i = 0; i < config.cpu_count; i++) {
 		if (cpus[i].active)
 			cpu_print_report(&cpus[i]);
+		else
+			printf("cpu%d: not active\n", i);
+	}
 
 #ifdef __SMP__
Index: src/main/main.c
===================================================================
--- src/main/main.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ src/main/main.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -116,7 +116,5 @@
 		config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024);
 
-	#ifdef __SMP__
-	mp_init();	/* Multiprocessor */
-	#endif /* __SMP__ */
+	arch_late_init();
 	
 	printf("config.cpu_count=%d\n", config.cpu_count);
Index: src/mm/tlb.c
===================================================================
--- src/mm/tlb.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
+++ src/mm/tlb.c	(revision babcb14871c9712680b4a8eaff315215bbc41404)
@@ -55,5 +55,5 @@
 	
 busy_wait:	
-	for (i = 0; i<config.cpu_active; i++)
+	for (i = 0; i<config.cpu_count; i++)
 		if (cpus[i].tlb_active)
 			goto busy_wait;
