Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision 934b2e0be99407bebe9e2a8fbb2ebaf1242b8c46)
+++ kernel/generic/src/main/main.c	(revision abe61634bccc1c2d5401ed6a63fae1ebb7feedd7)
@@ -132,7 +132,9 @@
 /** Main kernel routine for bootstrap CPU.
  *
- * Initializes the kernel by bootstrap CPU.
- * This function passes control directly to
- * main_bsp_separated_stack().
+ * The code here still runs on the boot stack, which knows nothing about
+ * preemption counts.  Because of that, this function cannot directly call
+ * functions that disable or enable preemption (e.g. spinlock_lock()). The
+ * primary task of this function is to calculate address of a new stack and
+ * switch to it.
  *
  * Assuming interrupts_disable().
@@ -141,6 +143,4 @@
 void main_bsp(void)
 {
-	LOG();
-	
 	config.cpu_count = 1;
 	config.cpu_active = 1;
@@ -174,11 +174,4 @@
 		config.stack_base = ALIGN_UP(stack_safe, PAGE_SIZE);
 	
-	version_print();
-	
-	LOG("\nconfig.base=%#" PRIp " config.kernel_size=%" PRIs
-		"\nconfig.stack_base=%#" PRIp " config.stack_size=%" PRIs,
-		config.base, config.kernel_size,
-		config.stack_base, config.stack_size);
-	
 	context_save(&ctx);
 	context_set(&ctx, FADDR(main_bsp_separated_stack), config.stack_base,
@@ -196,7 +189,16 @@
 void main_bsp_separated_stack(void) 
 {
+	/* Keep this the first thing. */
+	the_initialize(THE);
+
 	LOG();
 	
-	the_initialize(THE);
+	version_print();
+	
+	LOG("\nconfig.base=%#" PRIp " config.kernel_size=%" PRIs
+	    "\nconfig.stack_base=%#" PRIp " config.stack_size=%" PRIs,
+	    config.base, config.kernel_size, config.stack_base,
+	    config.stack_size);
+	
 
 	/*
@@ -250,8 +252,7 @@
 		count_t i;
 		for (i = 0; i < init.cnt; i++)
-			printf("init[%" PRIc "].addr=%#" PRIp
-				", init[%" PRIc "].size=%#" PRIs "\n",
-				i, init.tasks[i].addr,
-				i, init.tasks[i].size);
+			printf("init[%" PRIc "].addr=%#" PRIp ", init[%" PRIc
+			    "].size=%#" PRIs "\n", i, init.tasks[i].addr,
+			    i, init.tasks[i].size);
 	} else
 		printf("No init binaries found\n");
@@ -270,5 +271,6 @@
 	 * Create the first thread.
 	 */
-	thread_t *kinit_thread = thread_create(kinit, NULL, kernel, 0, "kinit", true);
+	thread_t *kinit_thread = thread_create(kinit, NULL, kernel, 0, "kinit",
+	    true);
 	if (!kinit_thread)
 		panic("Can't create kinit thread\n");
