Index: boot/arch/ppc32/src/asm.S
===================================================================
--- boot/arch/ppc32/src/asm.S	(revision 4db05eabc7fa0bd0ef4a266c375abc1210212cba)
+++ boot/arch/ppc32/src/asm.S	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
@@ -403,5 +403,4 @@
 	# pc = kernel's entry point (r7)
 	# r3 = bootinfo (physical address)
-	# sprg0 = BOOT_OFFSET
 	# sprg3 = physical memory size
 	# sp = 0 (enforces the usage of sprg0 as exception stack)
@@ -409,6 +408,6 @@
 	mtspr srr0, r7
 
-	lis r31, BOOT_OFFSET@ha
-	addi r31, r31, BOOT_OFFSET@l
+	# Clear sprg0. Kernel will set it.
+	li r31, 0
 	mtsprg0 r31
 
@@ -416,4 +415,5 @@
 	# the physical memory size, get the lower 4 bytes
 
+	// FIXME: unchecked magic offset
 	lwz r31, 4(r3)
 	mtsprg3 r31
Index: boot/arch/ppc32/src/main.c
===================================================================
--- boot/arch/ppc32/src/main.c	(revision 4db05eabc7fa0bd0ef4a266c375abc1210212cba)
+++ boot/arch/ppc32/src/main.c	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
@@ -97,4 +97,14 @@
 	size_t pages = (balloc_start + ALIGN_UP(BALLOC_MAX_SIZE, PAGE_SIZE)) >>
 	    PAGE_WIDTH;
+
+	printf(" Boot allocations area: %p - %p\n", (void *) balloc_start,
+	    (void *) (pages << PAGE_WIDTH));
+
+	if ((pages << PAGE_WIDTH) >= (uintptr_t) loader_address_pa) {
+		printf("Boot allocations overlap loader area.\n");
+		printf("The boot image is too large. Halting.\n");
+		halt();
+	}
+
 	void *transtable;
 	void *transtable_pa;
