Index: arch/ppc32/include/boot/boot.h
===================================================================
--- arch/ppc32/include/boot/boot.h	(revision 52011995a20ff6a71843bc616b3d864854e38772)
+++ arch/ppc32/include/boot/boot.h	(revision 40378479b8bf47b5c6ddf534dfbafae2c8441d34)
@@ -35,3 +35,37 @@
 #define TEMP_STACK_SIZE 0x100
 
+#define MEMMAP_MAX_RECORDS 32
+
+#ifndef __ASM__
+
+#include <arch/types.h>
+
+typedef struct {
+	__address start;
+	__u32 size;
+} memzone_t;
+
+typedef struct {
+	__u32 total;
+	__u32 count;
+	memzone_t zones[MEMMAP_MAX_RECORDS];
+} memmap_t;
+
+typedef struct {
+	unsigned int addr;
+	unsigned int width;
+	unsigned int height;
+	unsigned int bpp;
+	unsigned int scanline;
+} screen_t;
+
+typedef struct {
+	memmap_t memmap;
+	screen_t screen;
+} bootinfo_t;
+
+extern bootinfo_t bootinfo;
+
 #endif
+
+#endif
Index: ch/ppc32/include/boot/memmap.h
===================================================================
--- arch/ppc32/include/boot/memmap.h	(revision 52011995a20ff6a71843bc616b3d864854e38772)
+++ 	(revision )
@@ -1,53 +1,0 @@
-/*
- * Copyright (C) 2006 Martin Decky
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __ppc32_MEMMAP_H__
-#define __ppc32_MEMMAP_H__
-
-#define MEMMAP_MAX_RECORDS 32
-
-#ifndef __ASM__
-
-#include <arch/types.h>
-
-typedef struct {
-	__address start;
-	__u32 size;
-} memzone_t;
-
-typedef struct {
-	__u32 total;
-	__u32 count;
-	memzone_t zones[MEMMAP_MAX_RECORDS];
-} memmap_t;
-
-extern memmap_t memmap;
-
-#endif
-
-#endif
Index: arch/ppc32/src/boot/boot.S
===================================================================
--- arch/ppc32/src/boot/boot.S	(revision 52011995a20ff6a71843bc616b3d864854e38772)
+++ arch/ppc32/src/boot/boot.S	(revision 40378479b8bf47b5c6ddf534dfbafae2c8441d34)
@@ -29,5 +29,4 @@
 #include <arch/asm/regname.h>
 #include <arch/boot/boot.h>
-#include <arch/boot/memmap.h>
 
 .section K_TEXT_START, "ax"
@@ -41,6 +40,6 @@
 	addi sp, sp, end_stack@l
 	
-	# r10 contains physical address to memmap_t
-	# from boot loader
+	# r3 contains physical address of bootinfo_t
+	# r4 contains size of bootinfo_t
 	
 	lis r31, 0x80000000@ha
@@ -49,27 +48,23 @@
 	add r3, r3, r31
 
-	lis r31, memmap@ha
-	addi r31, r31, memmap@l    # r31 = memmap
+	lis r31, bootinfo@ha
+	addi r31, r31, bootinfo@l  # r31 = bootinfo
 	
-	lwz r30, 0(r3)             # memmap->total
-	stw r30, 0(r31)
+	cmpwi r4, 0
+	beq bootinfo_end
 	
-	lwzu r30, 4(r3)            # memmap->count
-	stwu r30, 4(r31)
-	
-	cmpwi r30, 0
-	beq memmap_end
-	
-	mtctr r30
-	memmap_loop:
-	
-		lwzu r30, 4(r3)           # memmap->zones[i].start
-		stwu r30, 4(r31)
+	bootinfo_loop:
 		
-		lwzu r30, 4(r3)           # memmap->zones[i].size
-		stwu r30, 4(r31)
-	
-	bdnz memmap_loop
-	memmap_end:
+		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:
 	
 	b main_bsp
Index: arch/ppc32/src/mm/frame.c
===================================================================
--- arch/ppc32/src/mm/frame.c	(revision 52011995a20ff6a71843bc616b3d864854e38772)
+++ arch/ppc32/src/mm/frame.c	(revision 40378479b8bf47b5c6ddf534dfbafae2c8441d34)
@@ -27,6 +27,6 @@
  */
 
+#include <arch/boot/boot.h>
 #include <arch/mm/frame.h>
-#include <arch/boot/memmap.h>
 #include <arch/mm/memory_init.h>
 #include <mm/frame.h>
@@ -43,7 +43,7 @@
 	size_t size;
 	
-	for (i = 0; i < memmap.count; i++) {
-		start = ADDR2PFN(ALIGN_UP(memmap.zones[i].start, FRAME_SIZE));
-		size = SIZE2FRAMES(ALIGN_DOWN(memmap.zones[i].size, FRAME_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));
 		
 		if ((minconf < start) || (minconf >= start + size))
@@ -53,6 +53,6 @@
 		
 		zone_create(start, size, conf, 0);
-		if (last_frame < ALIGN_UP(memmap.zones[i].start + memmap.zones[i].size, FRAME_SIZE))
-			last_frame = ALIGN_UP(memmap.zones[i].start + memmap.zones[i].size, FRAME_SIZE);
+		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);
 	}
 
Index: arch/ppc32/src/mm/memory_init.c
===================================================================
--- arch/ppc32/src/mm/memory_init.c	(revision 52011995a20ff6a71843bc616b3d864854e38772)
+++ arch/ppc32/src/mm/memory_init.c	(revision 40378479b8bf47b5c6ddf534dfbafae2c8441d34)
@@ -27,15 +27,13 @@
  */
 
-#include <arch/boot/memmap.h>
+#include <arch/boot/boot.h>
 #include <arch/mm/memory_init.h>
 #include <typedefs.h>
 #include <print.h>
 
-memmap_t memmap;
-
 
 size_t get_memory_size(void) 
 {
-	return memmap.total;
+	return bootinfo.memmap.total;
 }
 
@@ -45,5 +43,5 @@
 	count_t i;
 	
-	for (i = 0; i < memmap.count; i++)
-		printf("base: %L size: %L\n", memmap.zones[i].start, memmap.zones[i].size);
+	for (i = 0; i < bootinfo.memmap.count; i++)
+		printf("base: %L size: %L\n", bootinfo.memmap.zones[i].start, bootinfo.memmap.zones[i].size);
 }
Index: arch/ppc32/src/ppc32.c
===================================================================
--- arch/ppc32/src/ppc32.c	(revision 52011995a20ff6a71843bc616b3d864854e38772)
+++ arch/ppc32/src/ppc32.c	(revision 40378479b8bf47b5c6ddf534dfbafae2c8441d34)
@@ -28,8 +28,11 @@
 
 #include <arch.h>
+#include <arch/boot/boot.h>
 #include <arch/console.h>
 #include <arch/drivers/cuda.h>
 #include <arch/mm/memory_init.h>
 #include <arch/interrupt.h>
+
+bootinfo_t bootinfo;
 
 void arch_pre_mm_init(void)
