Index: kernel/arch/mips32/include/arch.h
===================================================================
--- kernel/arch/mips32/include/arch.h	(revision 7f34182064fa93a69263014cb1b9789bf87da965)
+++ kernel/arch/mips32/include/arch.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32	
+/** @addtogroup mips32
  * @{
  */
@@ -36,4 +36,24 @@
 #define KERN_mips32_ARCH_H_
 
+#define TASKMAP_MAX_RECORDS  32
+#define CPUMAP_MAX_RECORDS   32
+
+#include <typedefs.h>
+
+extern count_t cpu_count;
+
+typedef struct {
+	uintptr_t addr;
+	uint32_t size;
+} utask_t;
+
+typedef struct {
+	uint32_t cpumap;
+	uint32_t cnt;
+	utask_t tasks[TASKMAP_MAX_RECORDS];
+} bootinfo_t;
+
+extern void arch_pre_main(void *entry, bootinfo_t *bootinfo);
+
 #endif
 
Index: kernel/arch/mips32/include/asm/boot.h
===================================================================
--- kernel/arch/mips32/include/asm/boot.h	(revision 7f34182064fa93a69263014cb1b9789bf87da965)
+++ kernel/arch/mips32/include/asm/boot.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32	
+/** @addtogroup mips32
  * @{
  */
Index: kernel/arch/mips32/include/boot.h
===================================================================
--- kernel/arch/mips32/include/boot.h	(revision 7f34182064fa93a69263014cb1b9789bf87da965)
+++ 	(revision )
@@ -1,48 +1,0 @@
-/*
- * Copyright (c) 2006 Martin Decky
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef KERN_mips32_BOOT_H_
-#define KERN_mips32_BOOT_H_
-
-#define TASKMAP_MAX_RECORDS 32
-
-#include <arch/types.h>
-
-typedef struct {
-	uintptr_t addr;
-	uint32_t size;
-} utask_t;
-
-typedef struct {
-	uint32_t cnt;
-	utask_t tasks[TASKMAP_MAX_RECORDS];
-} bootinfo_t;
-
-extern bootinfo_t bootinfo;
-
-#endif
Index: kernel/arch/mips32/src/mips32.c
===================================================================
--- kernel/arch/mips32/src/mips32.c	(revision 7f34182064fa93a69263014cb1b9789bf87da965)
+++ kernel/arch/mips32/src/mips32.c	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -34,5 +34,4 @@
 
 #include <arch.h>
-#include <arch/boot.h>
 #include <arch/cp0.h>
 #include <arch/exception.h>
@@ -59,32 +58,37 @@
 #include <arch/asm/regname.h>
 
-/* Size of the code jumping to the exception handler code 
- * - J+NOP 
- */
-#define EXCEPTION_JUMP_SIZE    8
-
-#define TLB_EXC ((char *) 0x80000000)
-#define NORM_EXC ((char *) 0x80000180)
-#define CACHE_EXC ((char *) 0x80000100)
+/* Size of the code jumping to the exception handler code
+ * - J+NOP
+ */
+#define EXCEPTION_JUMP_SIZE  8
+
+#define TLB_EXC    ((char *) 0x80000000)
+#define NORM_EXC   ((char *) 0x80000180)
+#define CACHE_EXC  ((char *) 0x80000100)
 
 
 /* Why the linker moves the variable 64K away in assembler
- * when not in .text section ????????
- */
+ * when not in .text section?
+ */
+
+/* Stack pointer saved when entering user mode */
 uintptr_t supervisor_sp __attribute__ ((section (".text")));
-/* Stack pointer saved when entering user mode */
-/* TODO: How do we do it on SMP system???? */
-bootinfo_t bootinfo __attribute__ ((section (".text")));
-
-void arch_pre_main(void)
+
+count_t cpu_count = 0;
+
+void arch_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
 {
 	/* Setup usermode */
-	init.cnt = bootinfo.cnt;
-	
-	uint32_t i;
-	
-	for (i = 0; i < bootinfo.cnt; i++) {
-		init.tasks[i].addr = bootinfo.tasks[i].addr;
-		init.tasks[i].size = bootinfo.tasks[i].size;
+	init.cnt = bootinfo->cnt;
+	
+	count_t i;
+	for (i = 0; i < min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); i++) {
+		init.tasks[i].addr = bootinfo->tasks[i].addr;
+		init.tasks[i].size = bootinfo->tasks[i].size;
+	}
+	
+	for (i = 0; i < CPUMAP_MAX_RECORDS; i++) {
+		if ((bootinfo->cpumap & (1 << i)) != 0)
+			cpu_count++;
 	}
 }
Index: kernel/arch/mips32/src/smp/smp.c
===================================================================
--- kernel/arch/mips32/src/smp/smp.c	(revision 7f34182064fa93a69263014cb1b9789bf87da965)
+++ kernel/arch/mips32/src/smp/smp.c	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -33,5 +33,7 @@
  */
 
+#include <config.h>
 #include <smp/smp.h>
+#include <arch/arch.h>
 
 #ifdef CONFIG_SMP
@@ -39,4 +41,5 @@
 void smp_init(void)
 {
+	config.cpu_count = cpu_count;
 }
 
Index: kernel/arch/mips32/src/start.S
===================================================================
--- kernel/arch/mips32/src/start.S	(revision 7f34182064fa93a69263014cb1b9789bf87da965)
+++ kernel/arch/mips32/src/start.S	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -32,5 +32,5 @@
 #include <arch/context_offset.h>
 #include <arch/stack.h>
-	
+
 .text
 
@@ -153,7 +153,7 @@
 	# Move $k0 (superveisor_sp)
 	lw $k0, 0($k0)
-1:		
+1:
 .endm
-		
+
 .org 0x0
 kernel_image_start:
@@ -162,28 +162,9 @@
 	ori $sp, $sp, %lo(end_stack)
 	
+	/* Not sure about this, but might
+	   be needed for PIC code */
+	lui $gp, 0x8000
+	
 	/* $a1 contains physical address of bootinfo_t */
-	/* $a2 contains size of bootinfo_t */
-	
-	beq $a2, $0, bootinfo_end
-	
-	/* Not sure about this, but might be needed for PIC code???? */
-	lui $gp, 0x8000
-	
-	lui $a3, %hi(bootinfo)
-	ori $a3, $a3, %lo(bootinfo)
-	
-	bootinfo_loop:
-		
-		lw $v0, 0($a1)
-		sw $v0, 0($a3)
-		
-		addi $a1, $a1, 4
-		addi $a3, $a3, 4
-		addi $a2, $a2, -4
-		
-		bgtz $a2, bootinfo_loop
-		nop
-		
-	bootinfo_end:
 	
 	jal arch_pre_main
@@ -206,6 +187,6 @@
 exception_entry:
 	j exception_handler
-	nop	
-	
+	nop
+
 exception_handler:
 	KERNEL_STACK_TO_K0
@@ -216,15 +197,15 @@
 	mfc0 $k0, $cause
 	
-	sra $k0, $k0, 0x2		# cp0_exc_cause() part 1
-	andi $k0, $k0, 0x1f		# cp0_exc_cause() part 2
-	sub $k0, 8			# 8 = SYSCALL
+	sra $k0, $k0, 0x2    # cp0_exc_cause() part 1
+	andi $k0, $k0, 0x1f  # cp0_exc_cause() part 2
+	sub $k0, 8           # 8 = SYSCALL
 	
 	beqz $k0, syscall_shortcut
-	add $k0, 8			# Revert $k0 back to correct exc number
+	add $k0, 8           # Revert $k0 back to correct exc number
 	
 	REGISTERS_STORE_AND_EXC_RESET $sp
 	
 	move $a1, $sp
-	jal exc_dispatch		# exc_dispatch(excno, register_space)
+	jal exc_dispatch     # exc_dispatch(excno, register_space)
 	move $a0, $k0
 
