Index: kernel/arch/mips32/src/mips32.c
===================================================================
--- kernel/arch/mips32/src/mips32.c	(revision 7f34182064fa93a69263014cb1b9789bf87da965)
+++ kernel/arch/mips32/src/mips32.c	(revision 4b44099d821552a64452274b994f2cf5cb8adbaf)
@@ -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 4b44099d821552a64452274b994f2cf5cb8adbaf)
@@ -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 4b44099d821552a64452274b994f2cf5cb8adbaf)
@@ -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
 
