Index: boot/arch/arm32/loader/asm.h
===================================================================
--- boot/arch/arm32/loader/asm.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/arm32/loader/asm.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -33,5 +33,5 @@
 /** @file
  *  @brief Functions implemented in assembly.
- */ 
+ */
 
 
@@ -41,8 +41,8 @@
 
 /** Copies cnt bytes from dst to src.
- * 
+ *
  * @param dst Destination address.
  * @param src Source address.
- * @param cnt Count of bytes to be copied. 
+ * @param cnt Count of bytes to be copied.
  */
 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt))
@@ -59,10 +59,9 @@
 /** Jumps to the kernel entry point.
  *
- * @param entry          Kernel entry point address.
- * @param bootinfo       Structure holding information about loaded tasks.
- * @param bootinfo_size  Size of the bootinfo structure.
+ * @param entry    Kernel entry point address.
+ * @param bootinfo Structure holding information about loaded tasks.
+ *
  */
-extern void jump_to_kernel(void *entry, void *bootinfo,
-    unsigned int bootinfo_size) __attribute__((noreturn));
+extern void jump_to_kernel(void *entry, void *bootinfo) __attribute__((noreturn));
 
 
Index: boot/arch/arm32/loader/boot.S
===================================================================
--- boot/arch/arm32/loader/boot.S	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/arm32/loader/boot.S	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -54,4 +54,2 @@
 page_table:
 	.skip PTL0_ENTRIES * PTL0_ENTRY_SIZE
-
-
Index: boot/arch/arm32/loader/main.c
===================================================================
--- boot/arch/arm32/loader/main.c	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/arm32/loader/main.c	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -33,5 +33,5 @@
 /** @file
  *  @brief Bootstrap.
- */ 
+ */
 
 
@@ -40,4 +40,5 @@
 #include "_components.h"
 #include <printf.h>
+#include <align.h>
 #include <macros.h>
 
@@ -110,5 +111,5 @@
 	
 	printf("\nBooting the kernel...\n");
-	jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo, sizeof(bootinfo));
+	jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo);
 }
 
Index: boot/arch/arm32/loader/main.h
===================================================================
--- boot/arch/arm32/loader/main.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/arm32/loader/main.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -33,5 +33,5 @@
 /** @file
  *  @brief Boot related declarations.
- */ 
+ */
 
 
@@ -39,11 +39,4 @@
 #define BOOT_arm32_MAIN_H
 
-
-/** Aligns to the nearest higher address.
- *
- * @param addr  Address or number to be aligned.
- * @param align Size of alignment, must be power of 2.
- */
-#define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1))
 
 /** Maximum number of tasks in the #bootinfo_t struct. */
@@ -75,3 +68,2 @@
 /** @}
  */
-
Index: boot/arch/mips32/loader/asm.h
===================================================================
--- boot/arch/mips32/loader/asm.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/mips32/loader/asm.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -30,10 +30,10 @@
 #define BOOT_mips32_ASM_H_
 
-#define PAGE_SIZE 16384
-#define PAGE_WIDTH 14
+#define PAGE_SIZE   16384
+#define PAGE_WIDTH  14
 
-#define memcpy(dst, src, cnt)	__builtin_memcpy((dst), (src), (cnt))
+#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
 
-void jump_to_kernel(void *entry, void *bootinfo, unsigned int bootinfo_size) __attribute__((noreturn));
+void jump_to_kernel(void *entry, void *bootinfo) __attribute__((noreturn));
 
 #endif
Index: boot/arch/mips32/loader/boot.S
===================================================================
--- boot/arch/mips32/loader/boot.S	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/mips32/loader/boot.S	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -28,7 +28,5 @@
 
 #include "regname.h"
-
-#define INITIAL_STACK        0x80040000
-#define MSIM_DORDER_ADDRESS  0x90000004
+#include "main.h"
 
 .set noat
@@ -41,13 +39,66 @@
 start:
 	
+	/* Setup CPU map (on msim this code
+	   is executed in parallel on all CPUs,
+	   but it not an issue) */
+	la $a0, CPUMAP
+	
+	sw $zero, 0($a0)
+	sw $zero, 4($a0)
+	sw $zero, 8($a0)
+	sw $zero, 12($a0)
+	
+	sw $zero, 16($a0)
+	sw $zero, 20($a0)
+	sw $zero, 24($a0)
+	sw $zero, 28($a0)
+	
+	sw $zero, 32($a0)
+	sw $zero, 36($a0)
+	sw $zero, 40($a0)
+	sw $zero, 44($a0)
+	
+	sw $zero, 48($a0)
+	sw $zero, 52($a0)
+	sw $zero, 56($a0)
+	sw $zero, 60($a0)
+	
+	sw $zero, 64($a0)
+	sw $zero, 68($a0)
+	sw $zero, 72($a0)
+	sw $zero, 76($a0)
+	
+	sw $zero, 80($a0)
+	sw $zero, 84($a0)
+	sw $zero, 88($a0)
+	sw $zero, 92($a0)
+	
+	sw $zero, 96($a0)
+	sw $zero, 100($a0)
+	sw $zero, 104($a0)
+	sw $zero, 108($a0)
+	
+	sw $zero, 112($a0)
+	sw $zero, 116($a0)
+	sw $zero, 120($a0)
+	sw $zero, 124($a0)
+	
+	lui $a1, 1
+	
 #ifdef MACHINE_msim
+	
 	/* Read dorder value */
 	la $k0, MSIM_DORDER_ADDRESS
-	lw $k0, ($k0)
+	lw $k1, ($k0)
 	
 	/* If we are not running on BSP
-	   end in an infinite loop  */
-	beq $k0, $zero, bsp
+	   then end in an infinite loop  */
+	beq $k1, $zero, bsp
 	nop
+	
+	/* Record CPU presence */
+	sll $a2, $k1, 2
+	addu $a2, $a2, $a0
+	sw $a1, ($a2)
 	
 	loop:
@@ -58,7 +109,9 @@
 	
 	bsp:
+		/* Record CPU presence */
+		sw $a1, ($a0)
+		
 		/* Setup initial stack */
-		lui $sp, INITIAL_STACK >> 16
-		ori $sp, $sp, INITIAL_STACK & 0xffff
+		la $sp, INITIAL_STACK
 		
 		j bootstrap
Index: boot/arch/mips32/loader/main.c
===================================================================
--- boot/arch/mips32/loader/main.c	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/mips32/loader/main.c	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -29,4 +29,5 @@
 #include "main.h" 
 #include <printf.h>
+#include <align.h>
 #include <macros.h>
 #include "msim.h"
@@ -74,7 +75,8 @@
 	
 	printf("\nCopying components\n");
+	
 	unsigned int top = 0;
 	bootinfo.cnt = 0;
-	for (i = 0; i < COMPONENTS; i++) {
+	for (i = 0; i < min(COMPONENTS, TASKMAP_MAX_RECORDS); i++) {
 		printf(" %s...", components[i].name);
 		top = ALIGN_UP(top, PAGE_SIZE);
@@ -89,5 +91,12 @@
 	}
 	
+	unsigned int *cpumap = (unsigned int *) CPUMAP;
+	bootinfo.cpumap = 0;
+	for (i = 0; i < CPUMAP_MAX_RECORDS; i++) {
+		if (cpumap[i] != 0)
+			bootinfo.cpumap |= (1 << i);
+	}
+	
 	printf("\nBooting the kernel...\n");
-	jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo, sizeof(bootinfo));
+	jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo);
 }
Index: boot/arch/mips32/loader/main.h
===================================================================
--- boot/arch/mips32/loader/main.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ boot/arch/mips32/loader/main.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -30,12 +30,12 @@
 #define BOOT_mips32_MAIN_H_
 
-/** Align to the nearest higher address.
- *
- * @param addr  Address or size to be aligned.
- * @param align Size of alignment, must be power of 2.
- */
-#define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1))
+#define CPUMAP               0x80001000
+#define INITIAL_STACK        0x80002000
+#define MSIM_DORDER_ADDRESS  0xb0000004
 
-#define TASKMAP_MAX_RECORDS 32
+#define TASKMAP_MAX_RECORDS  32
+#define CPUMAP_MAX_RECORDS   32
+
+#ifndef __ASM__
 
 typedef struct {
@@ -45,4 +45,5 @@
 
 typedef struct {
+	unsigned int cpumap;
 	unsigned int cnt;
 	task_t tasks[TASKMAP_MAX_RECORDS];
@@ -53,2 +54,4 @@
 
 #endif
+
+#endif
Index: kernel/arch/arm32/include/arch.h
===================================================================
--- kernel/arch/arm32/include/arch.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/arm32/include/arch.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup arm32	
+/** @addtogroup arm32
  * @{
  */
@@ -37,4 +37,21 @@
 #define KERN_arm32_ARCH_H_
 
+#define TASKMAP_MAX_RECORDS  32
+#define CPUMAP_MAX_RECORDS   32
+
+#include <typedefs.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 void arch_pre_main(void *entry, bootinfo_t *bootinfo);
+
 #endif
 
Index: kernel/arch/arm32/include/asm/boot.h
===================================================================
--- kernel/arch/arm32/include/asm/boot.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/arm32/include/asm/boot.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup arm32	
+/** @addtogroup arm32
  * @{
  */
@@ -40,21 +40,4 @@
 #define TEMP_STACK_SIZE 0x100
 
-#ifndef __ASM__
-
-/** Kernel entry point.
- *
- * Implemented in assembly. Copies boot_bootinfo (declared as bootinfo in 
- * boot/arch/arm32/loader/main.c) to #bootinfo struct. Then jumps to
- * #arch_pre_main and #main_bsp.
- *
- * @param entry          Entry point address (not used).
- * @param boot_bootinfo  Struct holding information about loaded tasks.
- * @param bootinfo_size  Size of the bootinfo structure.
- */
-extern void kernel_image_start(void *entry, void *boot_bootinfo,
-    unsigned int bootinfo_size);
-
-#endif
-
 #endif
 
Index: rnel/arch/arm32/include/boot.h
===================================================================
--- kernel/arch/arm32/include/boot.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ 	(revision )
@@ -1,76 +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.
- */
-
-/** @addtogroup arm32	
- * @{
- */
-/** @file
- *  @brief Bootinfo declarations.
- *
- *  Reflects boot/arch/arm32/loader/main.h.
- */
-
-#ifndef KERN_arm32_BOOT_H_
-#define KERN_arm32_BOOT_H_
-
-#include <arch/types.h>
-
-/** Maximum number of tasks in the #bootinfo_t struct. */
-#define TASKMAP_MAX_RECORDS 32
-
-
-/** Struct holding information about single loaded uspace task. */
-typedef struct {
-
-	/** Address where the task was placed. */
-	uintptr_t addr;
-
-	/** Size of the task's binary. */
-	uint32_t size;
-} utask_t;
-
-
-/** Struct holding information about loaded uspace tasks. */
-typedef struct {
-
-	/** Number of loaded tasks. */
-	uint32_t cnt;
-
-	/** Array of loaded tasks. */	
-	utask_t tasks[TASKMAP_MAX_RECORDS];
-} bootinfo_t;
-
-
-/** Bootinfo that is filled in #kernel_image_start. */ 
-extern bootinfo_t bootinfo;
-
-
-#endif
-
-/** @}
- */
Index: kernel/arch/arm32/src/arm32.c
===================================================================
--- kernel/arch/arm32/src/arm32.c	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/arm32/src/arm32.c	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -35,5 +35,4 @@
 
 #include <arch.h>
-#include <arch/boot.h>
 #include <config.h>
 #include <arch/console.h>
@@ -49,20 +48,17 @@
 #include <arch/machine.h>
 #include <userspace.h>
-
-/** Information about loaded tasks. */
-bootinfo_t bootinfo;
+#include <macros.h>
 
 /** Performs arm32 specific initialization before main_bsp() is called. */
-void arch_pre_main(void)
+void arch_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
 {
 	unsigned int i;
-
-	init.cnt = bootinfo.cnt;
-
-	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;
+	
+	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;
 	}
-	
 }
 
Index: kernel/arch/arm32/src/start.S
===================================================================
--- kernel/arch/arm32/src/start.S	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/arm32/src/start.S	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -41,28 +41,10 @@
 	bic r3, r3, #0x1f
 	orr r3, r3, #0x13
-	msr cpsr_c, r3	
+	msr cpsr_c, r3
 	
 	ldr sp, =temp_stack
-
-	cmp r2, #0
-	beq bootinfo_end
-
-	ldr r3, =bootinfo
-
-	bootinfo_loop:
-		ldr r4, [r1]
-		str r4, [r3]
-
-		add r1, r1, #4
-		add r3, r3, #4
-		add r2, r2, #-4
-
-		cmp r2, #0
-		bne bootinfo_loop
 	
-	bootinfo_end:
-
 	bl arch_pre_main
-
+	
 	bl main_bsp
 
@@ -75,3 +57,2 @@
 supervisor_sp:
 	.space 4
-
Index: kernel/arch/ia64/include/arch.h
===================================================================
--- kernel/arch/ia64/include/arch.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/ia64/include/arch.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -40,4 +40,6 @@
 #include <arch/ski/ski.h>
 
+extern void arch_pre_main(void);
+
 #endif
 
Index: kernel/arch/mips32/include/arch.h
===================================================================
--- kernel/arch/mips32/include/arch.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/mips32/include/arch.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -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 e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/mips32/include/asm/boot.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32	
+/** @addtogroup mips32
  * @{
  */
Index: rnel/arch/mips32/include/boot.h
===================================================================
--- kernel/arch/mips32/include/boot.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ 	(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 e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/mips32/src/mips32.c	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -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 e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/mips32/src/smp/smp.c	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -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 e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/mips32/src/start.S	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -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
 
Index: kernel/arch/ppc32/include/arch.h
===================================================================
--- kernel/arch/ppc32/include/arch.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/ppc32/include/arch.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ppc32	
+/** @addtogroup ppc32
  * @{
  */
@@ -36,5 +36,5 @@
 #define KERN_ppc32_ARCH_H_
 
-#include <arch/drivers/cuda.h>
+extern void arch_pre_main(void);
 
 #endif
Index: kernel/arch/ppc32/include/boot/boot.h
===================================================================
--- kernel/arch/ppc32/include/boot/boot.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/ppc32/include/boot/boot.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ppc32	
+/** @addtogroup ppc32
  * @{
  */
@@ -36,11 +36,11 @@
 #define KERN_ppc32_BOOT_H_
 
-#define BOOT_OFFSET		0x8000
+#define BOOT_OFFSET  0x8000
 
 /* Temporary stack size for boot process */
-#define TEMP_STACK_SIZE 0x1000
+#define TEMP_STACK_SIZE  0x1000
 
-#define TASKMAP_MAX_RECORDS 32
-#define MEMMAP_MAX_RECORDS 32
+#define TASKMAP_MAX_RECORDS  32
+#define MEMMAP_MAX_RECORDS   32
 
 #ifndef __ASM__
Index: kernel/arch/ppc32/src/boot/boot.S
===================================================================
--- kernel/arch/ppc32/src/boot/boot.S	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/ppc32/src/boot/boot.S	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -34,5 +34,5 @@
 .global kernel_image_start
 kernel_image_start:
-
+	
 	# load temporal kernel stack
 	
@@ -53,5 +53,5 @@
 	
 	addis r3, r3, 0x8000
-
+	
 	lis r31, bootinfo@ha
 	addi r31, r31, bootinfo@l  # r31 = bootinfo
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -46,6 +46,7 @@
 #include <ddi/irq.h>
 #include <arch/drivers/pic.h>
+#include <macros.h>
 
-#define IRQ_COUNT	64
+#define IRQ_COUNT  64
 
 bootinfo_t bootinfo;
@@ -53,10 +54,9 @@
 void arch_pre_main(void)
 {
-	/* Setup usermode */
 	init.cnt = bootinfo.taskmap.count;
 	
 	uint32_t i;
 	
-	for (i = 0; i < bootinfo.taskmap.count; i++) {
+	for (i = 0; i < min3(bootinfo.taskmap.count, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); i++) {
 		init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr);
 		init.tasks[i].size = bootinfo.taskmap.tasks[i].size;
Index: kernel/arch/sparc64/include/arch.h
===================================================================
--- kernel/arch/sparc64/include/arch.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/arch/sparc64/include/arch.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -46,4 +46,10 @@
 #define NWINDOWS		8	/** Number of register window sets. */
 
+#ifndef __ASM__
+
+extern void arch_pre_main(void);
+
+#endif /* __ASM__ */
+
 #endif
 
Index: kernel/generic/include/arch.h
===================================================================
--- kernel/generic/include/arch.h	(revision e662a5f4f15083bb24a483054e771e47c59e9865)
+++ kernel/generic/include/arch.h	(revision 96e0748d7558e9aeb4c97ff5d520f773c406eeac)
@@ -64,10 +64,9 @@
 } the_t;
 
-#define THE		((the_t *)(get_stack_base()))
+#define THE  ((the_t * )(get_stack_base()))
 
 extern void the_initialize(the_t *the);
 extern void the_copy(the_t *src, the_t *dst);
 
-extern void arch_pre_main(void);
 extern void arch_pre_mm_init(void);
 extern void arch_post_mm_init(void);
