Index: kernel/arch/arm32/include/arch.h
===================================================================
--- kernel/arch/arm32/include/arch.h	(revision 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/arm32/include/arch.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/arm32/include/asm/boot.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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: kernel/arch/arm32/include/boot.h
===================================================================
--- kernel/arch/arm32/include/boot.h	(revision 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ 	(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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/arm32/src/arm32.c	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/arm32/src/start.S	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/ia64/include/arch.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ 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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ 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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ 	(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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ 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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ 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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ 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
 
Index: kernel/arch/ppc32/include/arch.h
===================================================================
--- kernel/arch/ppc32/include/arch.h	(revision 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/ppc32/include/arch.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/ppc32/include/boot/boot.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/ppc32/src/boot/boot.S	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/arch/sparc64/include/arch.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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 6bf612bbbe34393f2172ff7651103f824ecdaa4c)
+++ kernel/generic/include/arch.h	(revision 3f95377042657539cf9cca0cfec68cd3976ef5e0)
@@ -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);
