Index: kernel/arch/amd64/src/smp/ap.S
===================================================================
--- kernel/arch/amd64/src/smp/ap.S	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
+++ kernel/arch/amd64/src/smp/ap.S	(revision 65f3117b0c526538a5c5e972042a0bf4f1a325e1)
@@ -98,7 +98,8 @@
 .code64
 start64:
-	movabsq $ctx, %rsp
-	movq CONTEXT_OFFSET_SP(%rsp), %rsp
+	movabsq $bootstrap_stack_top, %rsp
+	movq (%rsp), %rsp
 
+	pushq $0
 	pushq $0
 	movq %rsp, %rbp
Index: kernel/arch/ia32/src/smp/ap.S
===================================================================
--- kernel/arch/ia32/src/smp/ap.S	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
+++ kernel/arch/ia32/src/smp/ap.S	(revision 65f3117b0c526538a5c5e972042a0bf4f1a325e1)
@@ -75,6 +75,6 @@
 	movw %ax, %es
 	movw %ax, %ss
-	movl $KA2PA(ctx), %eax          /* KA2PA((uintptr_t) &ctx) */
-	movl CONTEXT_OFFSET_SP(%eax), %esp
+	movl $KA2PA(bootstrap_stack_top), %eax   /* KA2PA((uintptr_t) &bootstrap_stack_top) */
+	movl (%eax), %esp
 	leal KA2PA(0)(%esp), %esp       /* KA2PA(ctx.sp) */
 
Index: kernel/arch/mips32/src/mm/frame.c
===================================================================
--- kernel/arch/mips32/src/mm/frame.c	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
+++ kernel/arch/mips32/src/mm/frame.c	(revision 65f3117b0c526538a5c5e972042a0bf4f1a325e1)
@@ -111,9 +111,4 @@
 	if (overlaps(frame << ZERO_PAGE_WIDTH, ZERO_PAGE_SIZE,
 	    KA2PA(config.base), config.kernel_size))
-		return false;
-
-	/* Kernel stack */
-	if (overlaps(frame << ZERO_PAGE_WIDTH, ZERO_PAGE_SIZE,
-	    KA2PA(config.stack_base), config.stack_size))
 		return false;
 
Index: kernel/arch/sparc64/src/sun4u/start.S
===================================================================
--- kernel/arch/sparc64/src/sun4u/start.S	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
+++ kernel/arch/sparc64/src/sun4u/start.S	(revision 65f3117b0c526538a5c5e972042a0bf4f1a325e1)
@@ -356,6 +356,5 @@
 	 * in the ctx global variable.
 	 */
-	set ctx, %g1
-	add %g1, CONTEXT_OFFSET_SP, %g1
+	set bootstrap_stack_top, %g1
 	ldx [%g1], %o6
 
Index: kernel/generic/include/config.h
===================================================================
--- kernel/generic/include/config.h	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
+++ kernel/generic/include/config.h	(revision 65f3117b0c526538a5c5e972042a0bf4f1a325e1)
@@ -87,9 +87,4 @@
 	size_t kernel_size;
 
-	/** Base adddress of initial stack. */
-	uintptr_t stack_base;
-	/** Size of initial stack. */
-	size_t stack_size;
-
 	bool identity_configured;
 	/** Base address of the kernel identity mapped memory. */
Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
+++ kernel/generic/src/main/main.c	(revision 65f3117b0c526538a5c5e972042a0bf4f1a325e1)
@@ -137,4 +137,10 @@
 uintptr_t stack_safe = 0;
 
+// NOTE: All kernel stacks must be aligned to STACK_SIZE, see CURRENT.
+const size_t bootstrap_stack_size = STACK_SIZE;
+_Alignas(STACK_SIZE) uint8_t bootstrap_stack[STACK_SIZE];
+/* Just a convenient value for some assembly code. */
+const uint8_t *bootstrap_stack_top = bootstrap_stack + STACK_SIZE;
+
 /*
  * These two functions prevent stack from underflowing during the
@@ -170,38 +176,7 @@
 	    ALIGN_UP((uintptr_t) kdata_end - config.base, PAGE_SIZE);
 
-	/*
-	 * NOTE: All kernel stacks must be aligned to STACK_SIZE,
-	 *       see CURRENT.
-	 */
-
-	/* Place the stack after the kernel, init and ballocs. */
-	config.stack_base =
-	    ALIGN_UP(config.base + config.kernel_size, STACK_SIZE);
-	config.stack_size = STACK_SIZE;
-
-	/* Avoid placing stack on top of init */
-	size_t i;
-	for (i = 0; i < init.cnt; i++) {
-		uintptr_t p = init.tasks[i].paddr + init.tasks[i].size;
-		uintptr_t bottom = PA2KA(ALIGN_UP(p, STACK_SIZE));
-
-		if (config.stack_base < bottom)
-			config.stack_base = bottom;
-	}
-
-	/* Avoid placing stack on top of boot allocations. */
-	if (ballocs.size) {
-		uintptr_t bottom =
-		    ALIGN_UP(ballocs.base + ballocs.size, STACK_SIZE);
-		if (config.stack_base < bottom)
-			config.stack_base = bottom;
-	}
-
-	if (config.stack_base < stack_safe)
-		config.stack_base = ALIGN_UP(stack_safe, STACK_SIZE);
-
 	context_save(&ctx);
 	context_set(&ctx, FADDR(main_bsp_separated_stack),
-	    config.stack_base, STACK_SIZE);
+	    bootstrap_stack, bootstrap_stack_size);
 	context_restore(&ctx);
 	/* not reached */
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 4f84ee4268fbebe449f1346536fa63cef10bd266)
+++ kernel/generic/src/mm/frame.c	(revision 65f3117b0c526538a5c5e972042a0bf4f1a325e1)
@@ -752,8 +752,4 @@
 					continue;
 
-				if (overlaps(addr, PFN2ADDR(confcount),
-				    KA2PA(config.stack_base), config.stack_size))
-					continue;
-
 				bool overlap = false;
 				for (size_t i = 0; i < init.cnt; i++) {
@@ -1121,6 +1117,4 @@
 		frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)),
 		    SIZE2FRAMES(config.kernel_size));
-		frame_mark_unavailable(ADDR2PFN(KA2PA(config.stack_base)),
-		    SIZE2FRAMES(config.stack_size));
 
 		for (size_t i = 0; i < init.cnt; i++)
