Index: kernel/arch/ppc32/src/boot/boot.S
===================================================================
--- kernel/arch/ppc32/src/boot/boot.S	(revision d99c1d2ba8c7b2c687d430f2e9fd237046606545)
+++ kernel/arch/ppc32/src/boot/boot.S	(revision 34bf3d57b654a7c5ea18d1c73a769dbf49c8eee4)
@@ -47,28 +47,6 @@
 	
 	# r3 contains physical address of bootinfo_t
-	# r4 contains size of bootinfo_t
-	
-	cmpwi r4, 0
-	beq bootinfo_end
 	
 	addis r3, r3, 0x8000
-	
-	lis r31, bootinfo@ha
-	addi r31, r31, bootinfo@l  # r31 = bootinfo
-	
-	bootinfo_loop:
-		
-		lwz r30, 0(r3)
-		stw r30, 0(r31)
-		
-		addi r3, r3, 4
-		addi r31, r31, 4
-		subi r4, r4, 4
-		
-		cmpwi r4, 0
-		bgt bootinfo_loop
-		
-	bootinfo_end:
-	
 	bl arch_pre_main
 	b main_bsp
Index: kernel/arch/ppc32/src/mm/frame.c
===================================================================
--- kernel/arch/ppc32/src/mm/frame.c	(revision d99c1d2ba8c7b2c687d430f2e9fd237046606545)
+++ kernel/arch/ppc32/src/mm/frame.c	(revision 34bf3d57b654a7c5ea18d1c73a769dbf49c8eee4)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ppc32mm	
+/** @addtogroup ppc32mm
  * @{
  */
@@ -41,4 +41,5 @@
 
 uintptr_t last_frame = 0;
+memmap_t memmap;
 
 void physmem_print(void)
@@ -49,7 +50,7 @@
 	printf("---------- ----------\n");
 		
-	for (i = 0; i < bootinfo.memmap.count; i++) {
-		printf("%#10x %#10x\n", bootinfo.memmap.zones[i].start,
-			bootinfo.memmap.zones[i].size);
+	for (i = 0; i < memmap.cnt; i++) {
+		printf("%#10x %#10x\n", memmap.zones[i].start,
+			memmap.zones[i].size);
 	}
 }
@@ -62,7 +63,7 @@
 	size_t size;
 	
-	for (i = 0; i < bootinfo.memmap.count; i++) {
-		start = ADDR2PFN(ALIGN_UP(bootinfo.memmap.zones[i].start, FRAME_SIZE));
-		size = SIZE2FRAMES(ALIGN_DOWN(bootinfo.memmap.zones[i].size, FRAME_SIZE));
+	for (i = 0; i < memmap.cnt; i++) {
+		start = ADDR2PFN(ALIGN_UP((uintptr_t) memmap.zones[i].start, FRAME_SIZE));
+		size = SIZE2FRAMES(ALIGN_DOWN(memmap.zones[i].size, FRAME_SIZE));
 		
 		if ((minconf < start) || (minconf >= start + size))
@@ -72,6 +73,6 @@
 		
 		zone_create(start, size, conf, 0);
-		if (last_frame < ALIGN_UP(bootinfo.memmap.zones[i].start + bootinfo.memmap.zones[i].size, FRAME_SIZE))
-			last_frame = ALIGN_UP(bootinfo.memmap.zones[i].start + bootinfo.memmap.zones[i].size, FRAME_SIZE);
+		if (last_frame < ALIGN_UP((uintptr_t) memmap.zones[i].start + memmap.zones[i].size, FRAME_SIZE))
+			last_frame = ALIGN_UP((uintptr_t) memmap.zones[i].start + memmap.zones[i].size, FRAME_SIZE);
 	}
 	
Index: kernel/arch/ppc32/src/mm/page.c
===================================================================
--- kernel/arch/ppc32/src/mm/page.c	(revision d99c1d2ba8c7b2c687d430f2e9fd237046606545)
+++ kernel/arch/ppc32/src/mm/page.c	(revision 34bf3d57b654a7c5ea18d1c73a769dbf49c8eee4)
@@ -45,5 +45,4 @@
 }
 
-
 uintptr_t hw_map(uintptr_t physaddr, size_t size)
 {
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision d99c1d2ba8c7b2c687d430f2e9fd237046606545)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 34bf3d57b654a7c5ea18d1c73a769dbf49c8eee4)
@@ -65,22 +65,30 @@
 
 /** Performs ppc32-specific initialization before main_bsp() is called. */
-void arch_pre_main(void)
-{
-	init.cnt = bootinfo.taskmap.count;
-	
-	uint32_t i;
-	
-	for (i = 0; i < min3(bootinfo.taskmap.count, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); i++) {
-		init.tasks[i].addr = bootinfo.taskmap.tasks[i].addr;
-		init.tasks[i].size = bootinfo.taskmap.tasks[i].size;
+void arch_pre_main(bootinfo_t *bootinfo)
+{
+	/* Copy tasks map. */
+	init.cnt = min3(bootinfo->taskmap.cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS);
+	size_t i;
+	for (i = 0; i < init.cnt; i++) {
+		init.tasks[i].addr = (uintptr_t) bootinfo->taskmap.tasks[i].addr;
+		init.tasks[i].size = bootinfo->taskmap.tasks[i].size;
 		str_cpy(init.tasks[i].name, CONFIG_TASK_NAME_BUFLEN,
-		    bootinfo.taskmap.tasks[i].name);
+		    bootinfo->taskmap.tasks[i].name);
+	}
+	
+	/* Copy physical memory map. */
+	memmap.total = bootinfo->memmap.total;
+	memmap.cnt = min(bootinfo->memmap.cnt, MEMMAP_MAX_RECORDS);
+	for (i = 0; i < memmap.cnt; i++) {
+		memmap.zones[i].start = bootinfo->memmap.zones[i].start;
+		memmap.zones[i].size = bootinfo->memmap.zones[i].size;
 	}
 	
 	/* Copy boot allocations info. */
-	ballocs.base = bootinfo.ballocs.base;
-	ballocs.size = bootinfo.ballocs.size;
-	
-	ofw_tree_init(bootinfo.ofw_root);
+	ballocs.base = bootinfo->ballocs.base;
+	ballocs.size = bootinfo->ballocs.size;
+	
+	/* Copy OFW tree. */
+	ofw_tree_init(bootinfo->ofw_root);
 }
 
