Index: arch/ppc32/boot/Makefile
===================================================================
--- arch/ppc32/boot/Makefile	(revision 13c1a0c1acd46ab48ff9ff039415a4af044d0810)
+++ arch/ppc32/boot/Makefile	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
@@ -2,17 +2,26 @@
 
 CFLAGS = -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -I../include
+DEFS = -DKERNEL_LOAD_ADDRESS=0x800000 -DKERNEL_SIZE=40960
+
+SOURCES = \
+	main.c \
+	ofw.c \
+	printf.c \
+	boot.S
+
+OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
 
 build: boot.bin
 	cp boot.bin ../../../load.bin
 
-boot.bin: boot.o main.o
-	$(LD) -no-check-sections -N -T _link.ld boot.o main.o -o $@
+boot.bin: $(OBJECTS)
+	$(LD) -no-check-sections -N -T _link.ld $(OBJECTS) -o $@
 
-boot.o: boot.S
-	$(CC) $(CFLAGS) -c boot.S -o $@
+%.o: %.S
+	$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@
 
-main.o: main.c
-	$(CC) $(CFLAGS) -c main.c -o $@
+%.o: %.c
+	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
 
 clean:
-	-rm -f boot.o main.o boot.bin ../../../load.bin
+	-rm -f $(OBJECTS) boot.bin ../../../load.bin
Index: arch/ppc32/boot/main.c
===================================================================
--- arch/ppc32/boot/main.c	(revision 13c1a0c1acd46ab48ff9ff039415a4af044d0810)
+++ arch/ppc32/boot/main.c	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
@@ -26,77 +26,24 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
- 
-#include "main.h"
 
-ofw_entry ofw;
+#include "main.h" 
+#include "printf.h"
+#include "ofw.h"
 
-phandle ofw_chosen;
-ihandle ofw_stdout;
-
-void init(void)
+static void halt(void)
 {
-	ofw_chosen = ofw_find_device("/chosen");
-	if (ofw_chosen == -1)
-		ofw_call("exit", 0, 0);
-	
-	if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)	
-		ofw_stdout = 0;
-}
-
-int ofw_call(const char *service, const int nargs, const int nret, ...)
-{
-	va_list list;
-	ofw_args_t args;
-	int i;
-	
-	args.service = service;
-	args.nargs = nargs;
-	args.nret = nret;
-	
-	va_start(list, nret);
-	for (i = 0; i < nargs; i++)
-		args.args[i] = va_arg(list, ofw_arg_t);
-	va_end(list);
-	
-	for (i = 0; i < nret; i++)
-		args.args[i + nargs] = 0;
-	
-	ofw(&args);
-	
-	return args.args[nargs];
-}
-
-void ofw_write(const char *str, const int len)
-{
-	if (ofw_stdout == 0)
-		return;
-	
-	ofw_call("write", 3, 1, ofw_stdout, str, len);
-}
-
-void ofw_puts(const char *str)
-{
-	int len = 0;
-	
-	while (str[len] != 0)
-		len++;
-	
-	ofw_write(str, len);
-}
-
-phandle ofw_find_device(const char *name)
-{
-	return ofw_call("finddevice", 1, 1, name);
-}
-
-int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen)
-{
-	return ofw_call("getprop", 4, 1, device, name, buf, buflen);
+	while (1);
 }
 
 void bootstrap(void)
 {
-	ofw_puts("\nHelenOS PPC Bootloader\n");
-
-	while (1);
+	printf("\nHelenOS PPC Bootloader\nKernel size %d, load address %L\n", KERNEL_SIZE, KERNEL_LOAD_ADDRESS);
+	
+	void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1);
+	if (addr == NULL) {
+		printf("Error: Unable to claim memory");
+		halt();
+	}
+	
+	halt();
 }
Index: arch/ppc32/boot/main.h
===================================================================
--- arch/ppc32/boot/main.h	(revision 13c1a0c1acd46ab48ff9ff039415a4af044d0810)
+++ arch/ppc32/boot/main.h	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
@@ -30,34 +30,4 @@
 #define __MAIN_H__
 
-#define MAX_OFW_ARGS	10
-
-typedef __builtin_va_list va_list;
-
-#define va_start(ap, last) 		__builtin_va_start(ap, last)
-#define va_arg(ap, type) 		__builtin_va_arg(ap, type)
-#define va_end(ap)			__builtin_va_end(ap)
-
-typedef unsigned int ofw_arg_t;
-typedef unsigned int ihandle;
-typedef unsigned int phandle;
-
-/** OpenFirmware command structure
- *
- */
-typedef struct {
-	const char *service;          /**< Command name */
-	unsigned int nargs;           /**< Number of in arguments */
-	unsigned int nret;            /**< Number of out arguments */
-	ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
-} ofw_args_t;
-
-typedef void (*ofw_entry)(ofw_args_t *);
-
-extern void init(void);
-extern int ofw_call(const char *service, const int nargs, const int nret, ...);
-extern void ofw_write(const char *str, const int len);
-extern void ofw_puts(const char *str);
-extern phandle ofw_find_device(const char *name);
-extern int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen);
 extern void bootstrap(void);
 
Index: arch/ppc32/boot/ofw.c
===================================================================
--- arch/ppc32/boot/ofw.c	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
+++ arch/ppc32/boot/ofw.c	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2005 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.
+ */
+ 
+#include "ofw.h"
+
+ofw_entry ofw;
+
+phandle ofw_chosen;
+ihandle ofw_stdout;
+
+
+void init(void)
+{
+	ofw_chosen = ofw_find_device("/chosen");
+	if (ofw_chosen == -1)
+		ofw_call("exit", 0, 0);
+	
+	if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)	
+		ofw_stdout = 0;
+}
+
+
+int ofw_call(const char *service, const int nargs, const int nret, ...)
+{
+	va_list list;
+	ofw_args_t args;
+	int i;
+	
+	args.service = service;
+	args.nargs = nargs;
+	args.nret = nret;
+	
+	va_start(list, nret);
+	for (i = 0; i < nargs; i++)
+		args.args[i] = va_arg(list, ofw_arg_t);
+	va_end(list);
+	
+	for (i = 0; i < nret; i++)
+		args.args[i + nargs] = 0;
+	
+	ofw(&args);
+	
+	return args.args[nargs];
+}
+
+
+void ofw_write(const char *str, const int len)
+{
+	if (ofw_stdout == 0)
+		return;
+	
+	ofw_call("write", 3, 1, ofw_stdout, str, len);
+}
+
+
+void ofw_puts(const char *str)
+{
+	int len = 0;
+	
+	while (str[len] != 0)
+		len++;
+	
+	ofw_write(str, len);
+}
+
+
+phandle ofw_find_device(const char *name)
+{
+	return ofw_call("finddevice", 1, 1, name);
+}
+
+
+int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
+{
+	return ofw_call("getprop", 4, 1, device, name, buf, buflen);
+}
+
+
+void *ofw_claim(const void *addr, const int size, const int align)
+{
+	return (void *) ofw_call("claim", 3, 1, addr, size, align);
+}
Index: arch/ppc32/boot/ofw.h
===================================================================
--- arch/ppc32/boot/ofw.h	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
+++ arch/ppc32/boot/ofw.h	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2005 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 __OFW_H__
+#define __OFW_H__
+
+#define NULL	0
+#define MAX_OFW_ARGS	10
+
+typedef __builtin_va_list va_list;
+
+#define va_start(ap, last) 		__builtin_va_start(ap, last)
+#define va_arg(ap, type) 		__builtin_va_arg(ap, type)
+#define va_end(ap)			__builtin_va_end(ap)
+
+typedef unsigned int ofw_arg_t;
+typedef unsigned int ihandle;
+typedef unsigned int phandle;
+
+/** OpenFirmware command structure
+ *
+ */
+typedef struct {
+	const char *service;          /**< Command name */
+	unsigned int nargs;           /**< Number of in arguments */
+	unsigned int nret;            /**< Number of out arguments */
+	ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
+} ofw_args_t;
+
+typedef void (*ofw_entry)(ofw_args_t *);
+
+extern void init(void);
+extern int ofw_call(const char *service, const int nargs, const int nret, ...);
+extern void ofw_write(const char *str, const int len);
+extern void ofw_puts(const char *str);
+extern void *ofw_claim(const void *addr, const int size, const int align);
+extern phandle ofw_find_device(const char *name);
+extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen);
+
+#endif
Index: arch/ppc32/boot/printf.c
===================================================================
--- arch/ppc32/boot/printf.c	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
+++ arch/ppc32/boot/printf.c	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
@@ -0,0 +1,230 @@
+/*
+ * 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.
+ */
+
+#include "printf.h"
+#include "ofw.h"
+
+static char digits[] = "0123456789abcdef";  /**< Hexadecimal characters */
+
+
+/** Print hexadecimal digits
+ *
+ * Print fixed count of hexadecimal digits from
+ * the number num. The digits are printed in
+ * natural left-to-right order starting with
+ * the width-th digit.
+ *
+ * @param num   Number containing digits.
+ * @param width Count of digits to print.
+ *
+ */
+static void print_fixed_hex(const __u64 num, const int width)
+{
+	int i;
+    
+	for (i = width * 8 - 4; i >= 0; i -= 4)
+	    ofw_write(digits + ((num >> i) & 0xf), 1);
+}
+
+
+/** Print number in given base
+ *
+ * Print significant digits of a number in given
+ * base.
+ *
+ * @param num  Number to print.
+ * @param base Base to print the number in (should
+ *             be in range 2 .. 16).
+ *
+ */
+static void print_number(const __native num, const unsigned int base)
+{
+	int val = num;
+	char d[sizeof(__native) * 8 + 1];		/* this is good enough even for base == 2 */
+	int i = sizeof(__native) * 8 - 1;
+	
+	do {
+		d[i--] = digits[val % base];
+	} while (val /= base);
+	
+	d[sizeof(__native) * 8] = 0;	
+	ofw_puts(&d[i + 1]);
+}
+
+
+/** General formatted text print
+ *
+ * Print text formatted according the fmt parameter
+ * and variant arguments. Each formatting directive
+ * begins with \% (percentage) character and one of the
+ * following character:
+ *
+ * \%    Prints the percentage character.
+ *
+ * s    The next variant argument is treated as char*
+ *      and printed as a NULL terminated string.
+ *
+ * c    The next variant argument is treated as a single char.
+ *
+ * p    The next variant argument is treated as a maximum
+ *      bit-width integer with respect to architecture
+ *      and printed in full hexadecimal width.
+ *
+ * P    As with 'p', but '0x' is prefixed.
+ *
+ * q    The next variant argument is treated as a 64b integer
+ *      and printed in full hexadecimal width.
+ *
+ * Q    As with 'q', but '0x' is prefixed.
+ *
+ * l    The next variant argument is treated as a 32b integer
+ *      and printed in full hexadecimal width.
+ *
+ * L    As with 'l', but '0x' is prefixed.
+ *
+ * w    The next variant argument is treated as a 16b integer
+ *      and printed in full hexadecimal width.
+ *
+ * W    As with 'w', but '0x' is prefixed.
+ *
+ * b    The next variant argument is treated as a 8b integer
+ *      and printed in full hexadecimal width.
+ *
+ * B    As with 'b', but '0x' is prefixed.
+ *
+ * d    The next variant argument is treated as integer
+ *      and printed in standard decimal format (only significant
+ *      digits).
+ *
+ * x    The next variant argument is treated as integer
+ *      and printed in standard hexadecimal format (only significant
+ *      digits).
+ *
+ * X    As with 'x', but '0x' is prefixed.
+ *
+ * All other characters from fmt except the formatting directives
+ * are printed in verbatim.
+ *
+ * @param fmt Formatting NULL terminated string.
+ */
+void printf(const char *fmt, ...)
+{
+	int i = 0;
+	va_list ap;
+	char c;	
+	
+	va_start(ap, fmt);
+	
+	while ((c = fmt[i++])) {
+		switch (c) {
+			
+			/* control character */
+			case '%':
+				
+				switch (c = fmt[i++]) {
+					
+					/* percentile itself */
+					case '%':
+						break;
+					
+					/*
+					 * String and character conversions.
+					 */
+					case 's':
+						ofw_puts(va_arg(ap, char_ptr));
+						goto loop;
+					
+					case 'c':
+						c = (char) va_arg(ap, int);
+						break;
+					
+					/*
+					 * Hexadecimal conversions with fixed width.
+					 */
+					case 'P': 
+						ofw_puts("0x");
+					case 'p':
+						print_fixed_hex(va_arg(ap, __native), sizeof(__native));
+						goto loop;
+					
+					case 'Q':
+						ofw_puts("0x");
+					case 'q':
+						print_fixed_hex(va_arg(ap, __u64), INT64);
+						goto loop;
+					
+					case 'L': 
+						ofw_puts("0x");
+					case 'l':
+						print_fixed_hex(va_arg(ap, __native), INT32);
+						goto loop;
+					
+					case 'W':
+						ofw_puts("0x");
+					case 'w':
+						print_fixed_hex(va_arg(ap, __native), INT16);
+						goto loop;
+					
+					case 'B':
+						ofw_puts("0x");
+					case 'b':
+						print_fixed_hex(va_arg(ap, __native), INT8);
+						goto loop;
+					
+					/*
+					 * Decimal and hexadecimal conversions.
+					 */
+					case 'd':
+						print_number(va_arg(ap, __native), 10);
+						goto loop;
+					
+					case 'X':
+						ofw_puts("0x");
+					case 'x':
+						print_number(va_arg(ap, __native), 16);
+						goto loop;
+					
+					/*
+					 * Bad formatting.
+					 */
+					default:
+						goto out;
+			}
+			
+			default:
+				ofw_write(&c, 1);
+		}
+	
+loop:
+		;
+	}
+	
+out:
+	
+	va_end(ap);
+}
Index: arch/ppc32/boot/printf.h
===================================================================
--- arch/ppc32/boot/printf.h	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
+++ arch/ppc32/boot/printf.h	(revision a0c732eafd1b291fabdcb52352f661718d3ca420)
@@ -0,0 +1,51 @@
+/*
+ * 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 __PRINTF_H__
+#define __PRINTF_H__
+
+#define INT8	1
+#define INT16	2
+#define INT32	4
+#define INT64	8
+
+typedef signed char __s8;
+
+typedef unsigned char __u8;
+typedef unsigned short __u16;
+typedef unsigned long __u32;
+typedef long long __u64;
+
+typedef __u32 __address;
+typedef __u32 __native;
+
+typedef char *char_ptr;
+
+void printf(const char *fmt, ...);
+
+#endif
