Index: kernel/generic/include/proc/program.h
===================================================================
--- kernel/generic/include/proc/program.h	(revision fb04cd903622a3c4f06209951d12543e563b5987)
+++ kernel/generic/include/proc/program.h	(revision 4585bda8a6ccb9dab3c79849b3492463ec254ab2)
@@ -50,4 +50,5 @@
 	struct task *task;           /**< Program task */
 	struct thread *main_thread;  /**< Program main thread */
+	unsigned int loader_status;  /**< Binary loader error status */
 } program_t;
 
Index: kernel/generic/src/lib/rd.c
===================================================================
--- kernel/generic/src/lib/rd.c	(revision fb04cd903622a3c4f06209951d12543e563b5987)
+++ kernel/generic/src/lib/rd.c	(revision 4585bda8a6ccb9dab3c79849b3492463ec254ab2)
@@ -38,4 +38,5 @@
  */
 
+#include <print.h>
 #include <lib/rd.h>
 #include <mm/frame.h>
@@ -66,4 +67,6 @@
 	sysinfo_set_item_val("rd.size", NULL, size);
 	sysinfo_set_item_val("rd.address.physical", NULL, (sysarg_t) base);
+	
+	printf("RAM disk at %p (size %zu bytes)\n", (void *) base, size);
 }
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision fb04cd903622a3c4f06209951d12543e563b5987)
+++ kernel/generic/src/main/kinit.c	(revision 4585bda8a6ccb9dab3c79849b3492463ec254ab2)
@@ -201,5 +201,5 @@
 		str_cpy(namebuf + INIT_PREFIX_LEN,
 		    TASK_NAME_BUFLEN - INIT_PREFIX_LEN, name);
-
+		
 		/*
 		 * Create virtual memory mappings for init task images.
@@ -236,5 +236,7 @@
 			init_rd((void *) init.tasks[i].paddr, init.tasks[i].size);
 		} else
-			printf("init[%zu]: Init binary load failed (error %d)\n", i, rc);
+			printf("init[%zu]: Init binary load failed "
+			    "(error %d, loader status %u)\n", i, rc,
+			    programs[i].loader_status);
 	}
 	
Index: kernel/generic/src/proc/program.c
===================================================================
--- kernel/generic/src/proc/program.c	(revision fb04cd903622a3c4f06209951d12543e563b5987)
+++ kernel/generic/src/proc/program.c	(revision 4585bda8a6ccb9dab3c79849b3492463ec254ab2)
@@ -80,4 +80,5 @@
 	kernel_uarg->uspace_uarg = NULL;
 	
+	prg->loader_status = EE_OK;
 	prg->task = task_create(as, name);
 	if (!prg->task)
@@ -111,9 +112,10 @@
  * executable image. The task is returned in *task.
  *
- * @param image_addr Address of an executable program image.
- * @param name       Name to set for the program's task.
- * @param prg        Buffer for storing program info. If image_addr
- *                   points to a loader image, p->task will be set to
- *                   NULL and EOK will be returned.
+ * @param[in]  image_addr Address of an executable program image.
+ * @param[in]  name       Name to set for the program's task.
+ * @param[out] prg        Buffer for storing program info.
+ *                        If image_addr points to a loader image,
+ *                        prg->task will be set to NULL and EOK
+ *                        will be returned.
  *
  * @return EOK on success or negative error code.
@@ -126,11 +128,11 @@
 		return ENOMEM;
 	
-	unsigned int rc = elf_load((elf_header_t *) image_addr, as, 0);
-	if (rc != EE_OK) {
+	prg->loader_status = elf_load((elf_header_t *) image_addr, as, 0);
+	if (prg->loader_status != EE_OK) {
 		as_destroy(as);
 		prg->task = NULL;
 		prg->main_thread = NULL;
 		
-		if (rc != EE_LOADER)
+		if (prg->loader_status != EE_LOADER)
 			return ENOTSUP;
 		
@@ -140,6 +142,5 @@
 		
 		program_loader = image_addr;
-		LOG("Registered program loader at %p",
-		    (void *) image_addr);
+		printf("Program loader at %p\n", (void *) image_addr);
 		
 		return EOK;
@@ -171,9 +172,10 @@
 	}
 	
-	unsigned int rc = elf_load((elf_header_t *) program_loader, as,
+	prg->loader_status = elf_load((elf_header_t *) program_loader, as,
 	    ELD_F_LOADER);
-	if (rc != EE_OK) {
+	if (prg->loader_status != EE_OK) {
 		as_destroy(as);
-		printf("Cannot spawn loader (%s)\n", elf_error(rc));
+		printf("Cannot spawn loader (%s)\n",
+		    elf_error(prg->loader_status));
 		return ENOENT;
 	}
Index: tools/toolchain.sh
===================================================================
--- tools/toolchain.sh	(revision fb04cd903622a3c4f06209951d12543e563b5987)
+++ tools/toolchain.sh	(revision 4585bda8a6ccb9dab3c79849b3492463ec254ab2)
@@ -149,5 +149,6 @@
 	echo " sparc64    SPARC V9"
 	echo " all        build all targets"
-	echo " parallel   same as 'all', but in parallel"
+	echo " parallel   same as 'all', but all in parallel"
+	echo " 2-way      same as 'all', but 2-way parallel"
 	echo
 	echo "The toolchain will be installed to the directory specified by"
@@ -431,4 +432,26 @@
 		wait
 		;;
+	"2-way")
+		prepare
+		build_target "amd64" "amd64-linux-gnu" &
+		build_target "arm32" "arm-linux-gnueabi" &
+		wait
+		
+		build_target "ia32" "i686-pc-linux-gnu" &
+		build_target "ia64" "ia64-pc-linux-gnu" &
+		wait
+		
+		build_target "mips32" "mipsel-linux-gnu" &
+		build_target "mips32eb" "mips-linux-gnu" &
+		wait
+		
+		build_target "mips64" "mips64el-linux-gnu" &
+		build_target "ppc32" "ppc-linux-gnu" &
+		wait
+		
+		build_target "ppc64" "ppc64-linux-gnu" &
+		build_target "sparc64" "sparc64-linux-gnu" &
+		wait
+		;;
 	*)
 		show_usage
