Index: kernel/generic/include/config.h
===================================================================
--- kernel/generic/include/config.h	(revision 29b2bbf5311052c0b1ad8971cfac6843f0ef6a1b)
+++ kernel/generic/include/config.h	(revision 61e90ddd605dc4854cbb016a4be65d1cd1e9510c)
@@ -56,4 +56,14 @@
 } init_t;
 
+/** Boot allocations.
+ *
+ * Allocatations made by the boot that are meant to be used by the kernel
+ * are all recorded in the ballocs_t type.
+ */
+typedef struct {
+	uintptr_t base;
+	size_t size;
+} ballocs_t;
+
 typedef struct {
 	count_t cpu_count;		/**< Number of processors detected. */
@@ -70,4 +80,5 @@
 extern config_t config;
 extern init_t init;
+extern ballocs_t ballocs;
 
 #endif
Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision 29b2bbf5311052c0b1ad8971cfac6843f0ef6a1b)
+++ kernel/generic/src/main/main.c	(revision 61e90ddd605dc4854cbb016a4be65d1cd1e9510c)
@@ -95,4 +95,10 @@
 };
 
+/** Boot allocations. */
+ballocs_t ballocs = {
+	.base = NULL,
+	.size = 0
+};
+
 context_t ctx;
 
@@ -106,5 +112,5 @@
 size_t hardcoded_kdata_size = 0;	/**< Size of the kernel data in bytes. */
 
-uintptr_t stack_safe = 0;	/**< Lowest safe stack virtual address */
+uintptr_t stack_safe = 0;		/**< Lowest safe stack virtual address */
 
 void main_bsp(void);
@@ -152,4 +158,10 @@
 		if (PA_overlaps(config.stack_base, config.stack_size, init.tasks[i].addr, init.tasks[i].size))
 			config.stack_base = ALIGN_UP(init.tasks[i].addr + init.tasks[i].size, config.stack_size);
+	}
+
+	/* Avoid placing stack on top of boot allocations. */
+	if (ballocs.size) {
+		if (PA_overlaps(config.stack_base, config.stack_size, ballocs.base, ballocs.size))
+			config.stack_base = ALIGN_UP(ballocs.base + ballocs.size, PAGE_SIZE);
 	}
 	
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 29b2bbf5311052c0b1ad8971cfac6843f0ef6a1b)
+++ kernel/generic/src/mm/frame.c	(revision 61e90ddd605dc4854cbb016a4be65d1cd1e9510c)
@@ -1078,4 +1078,7 @@
 			frame_mark_unavailable(ADDR2PFN(KA2PA(init.tasks[i].addr)), SIZE2FRAMES(init.tasks[i].size));
 
+		if (ballocs.size)
+			frame_mark_unavailable(ADDR2PFN(KA2PA(ballocs.base)), SIZE2FRAMES(ballocs.size));
+
 		/* Black list first frame, as allocating NULL would
 		 * fail in some places */
