Index: Makefile
===================================================================
--- Makefile	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ Makefile	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -76,4 +76,7 @@
 	$(MAKE) -C $(USPACEDIR) clean ARCH=$(ARCH)
 
+clean_boot_gen:
+	-rm generic/*.o genarch/*.o
+
 distclean_kernel:
 	$(MAKE) -C $(KERNELDIR) distclean ARCH=$(ARCH)
Index: arch/mips32/Makefile.inc
===================================================================
--- arch/mips32/Makefile.inc	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/mips32/Makefile.inc	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -33,5 +33,5 @@
 	cp arch/$(ARCH)/loader/image.boot image.boot
 
-clean: clean_kernel clean_uspace
+clean: clean_boot_gen clean_kernel clean_uspace
 	make -C arch/$(ARCH)/loader clean
 	-rm -f image.boot
Index: arch/mips32/loader/Makefile
===================================================================
--- arch/mips32/loader/Makefile	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/mips32/loader/Makefile	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -47,6 +47,5 @@
 endif
 
-CFLAGS = -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mhard-float -mips3
-DEFS = -I.
+CFLAGS = -I. -I../../../generic -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mhard-float -mips3
 
 SOURCES = \
Index: arch/mips32/loader/main.c
===================================================================
--- arch/mips32/loader/main.c	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/mips32/loader/main.c	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -28,5 +28,5 @@
 
 #include "main.h" 
-#include "../../../generic/printf.h"
+#include <printf.h>
 #include "msim.h"
 #include "asm.h"
Index: arch/mips32/loader/msim.c
===================================================================
--- arch/mips32/loader/msim.c	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/mips32/loader/msim.c	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -28,5 +28,5 @@
  
 #include "msim.h"
-#include "../../../generic/printf.h"
+#include <printf.h>
 
 #define MSIM_VIDEORAM            0xB0000000
Index: arch/mips32/loader/types.h
===================================================================
--- arch/mips32/loader/types.h	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/mips32/loader/types.h	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -30,5 +30,5 @@
 #define TYPES_H__
 
-#include "../../../generic/types.h"
+#include <gentypes.h>
 
 typedef signed char __s8;
Index: arch/ppc32/Makefile.inc
===================================================================
--- arch/ppc32/Makefile.inc	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/ppc32/Makefile.inc	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -33,5 +33,5 @@
 	cp arch/$(ARCH)/loader/image.boot image.boot
 
-clean: clean_kernel clean_uspace
+clean: clean_boot_gen clean_kernel clean_uspace
 	make -C arch/$(ARCH)/loader clean KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR)
 	-rm -f image.boot
Index: arch/ppc32/loader/Makefile
===================================================================
--- arch/ppc32/loader/Makefile	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/ppc32/loader/Makefile	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -47,10 +47,11 @@
 endif
 
-CFLAGS = -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mcpu=powerpc -msoft-float -m32
+CFLAGS = -I. -I../../../generic -I../../../genarch -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mcpu=powerpc -msoft-float -m32
 
 SOURCES = \
 	main.c \
 	ofw.c \
-	printf.c \
+	../../../genarch/ofw.c \
+	../../../generic/printf.c \
 	asm.S \
 	boot.S
Index: arch/ppc32/loader/main.c
===================================================================
--- arch/ppc32/loader/main.c	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/ppc32/loader/main.c	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -28,5 +28,5 @@
 
 #include "main.h" 
-#include "printf.h"
+#include <printf.h>
 #include "asm.h"
 #include "_components.h"
Index: arch/ppc32/loader/ofw.c
===================================================================
--- arch/ppc32/loader/ofw.c	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/ppc32/loader/ofw.c	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -27,256 +27,9 @@
  */
  
-#include "ofw.h"
-#include "asm.h"
-#include "printf.h"
+#include <ofw.h>
+#include <printf.h>
 
-#define MAX_OFW_ARGS	10
-#define BUF_SIZE		1024
-
-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 *);
-
-
-typedef struct {
-	unsigned int info;
-	unsigned int addr_hi;
-    unsigned int addr_lo;
-} pci_addr_t;
-
-typedef struct {
-	pci_addr_t addr;
-    unsigned int size_hi;
-    unsigned int size_lo;
-} pci_reg_t;
-
-
-ofw_entry ofw;
-
-phandle ofw_chosen;
-ihandle ofw_stdout;
-phandle ofw_root;
-ihandle ofw_mmu;
-phandle ofw_memory;
-phandle ofw_aliases;
-
-
-static int ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, ...)
+void write(const char *str, const int len)
 {
-	va_list list;
-	ofw_args_t args;
-	int i;
-	
-	args.service = service;
-	args.nargs = nargs;
-	args.nret = nret;
-	
-	va_start(list, rets);
-	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);
-	
-	for (i = 1; i < nret; i++)
-		rets[i - 1] = args.args[i + nargs];
-	
-	return args.args[nargs];
+	ofw_write(str, len);
 }
-
-
-static phandle ofw_find_device(const char *name)
-{
-	return ofw_call("finddevice", 1, 1, NULL, name);
-}
-
-
-static int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
-{
-	return ofw_call("getprop", 4, 1, NULL, device, name, buf, buflen);
-}
-
-
-static unsigned int ofw_get_address_cells(const phandle device)
-{
-	unsigned int ret;
-	
-	if (ofw_get_property(device, "#address-cells", &ret, sizeof(ret)) <= 0)
-		if (ofw_get_property(ofw_root, "#address-cells", &ret, sizeof(ret)) <= 0)
-			ret = 1;
-	
-	return ret;
-}
-
-
-static unsigned int ofw_get_size_cells(const phandle device)
-{
-	unsigned int ret;
-	
-	if (ofw_get_property(device, "#size-cells", &ret, sizeof(ret)) <= 0)
-		if (ofw_get_property(ofw_root, "#size-cells", &ret, sizeof(ret)) <= 0)
-			ret = 1;
-	
-	return ret;
-}
-
-
-static ihandle ofw_open(const char *name)
-{
-	return ofw_call("open", 1, 1, NULL, name);
-}
-
-
-void init(void)
-{
-	ofw_chosen = ofw_find_device("/chosen");
-	if (ofw_chosen == -1)
-		halt();
-	
-	if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)
-		ofw_stdout = 0;
-	
-	ofw_root = ofw_find_device("/");
-	if (ofw_root == -1) {
-		puts("\r\nError: Unable to find / device, halted.\r\n");
-		halt();
-	}
-	
-	if (ofw_get_property(ofw_chosen, "mmu",  &ofw_mmu, sizeof(ofw_mmu)) <= 0) {
-		puts("\r\nError: Unable to get mmu property, halted.\r\n");
-		halt();
-	}
-	
-	ofw_memory = ofw_find_device("/memory");
-	if (ofw_memory == -1) {
-		puts("\r\nError: Unable to find /memory device, halted.\r\n");
-		halt();
-	}
-	
-	ofw_aliases = ofw_find_device("/aliases");
-	if (ofw_aliases == -1) {
-		puts("\r\nError: Unable to find /aliases device, halted.\r\n");
-		halt();
-	}
-}
-
-
-void ofw_write(const char *str, const int len)
-{
-	if (ofw_stdout == 0)
-		return;
-	
-	ofw_call("write", 3, 1, NULL, ofw_stdout, str, len);
-}
-
-
-void *ofw_translate(const void *virt)
-{
-	ofw_arg_t result[3];
-	
-	if (ofw_call("call-method", 4, 4, result, "translate", ofw_mmu, virt, 1) != 0) {
-		puts("Error: MMU method translate() failed, halting.\n");
-		halt();
-	}
-	return (void *) result[2];
-}
-
-
-int ofw_map(const void *phys, const void *virt, const int size, const int mode)
-{
-	return ofw_call("call-method", 6, 1, NULL, "map", ofw_mmu, mode, size, virt, phys);
-}
-
-
-int ofw_memmap(memmap_t *map)
-{
-	unsigned int buf[BUF_SIZE];
-	int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(unsigned int) * BUF_SIZE);
-	if (ret <= 0)
-		return false;
-		
-	unsigned int ac = ofw_get_address_cells(ofw_memory);
-	unsigned int sc = ofw_get_size_cells(ofw_memory);
-	
-	int pos;
-	map->total = 0;
-	map->count = 0;
-	for (pos = 0; (pos < ret / sizeof(unsigned int)) && (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) {
-		void * start = (void *) buf[pos + ac - 1];
-		unsigned int size = buf[pos + ac + sc - 1];
-		
-		if (size > 0) {
-			map->zones[map->count].start = start;
-			map->zones[map->count].size = size;
-			map->count++;
-			map->total += size;
-		}
-	}
-}
-
-
-int ofw_screen(screen_t *screen)
-{
-	char device_name[BUF_SIZE];
-	
-	if (ofw_get_property(ofw_aliases, "screen", device_name, sizeof(char) * BUF_SIZE) <= 0)
-		return false;
-	
-	phandle device = ofw_find_device(device_name);
-	if (device == -1)
-		return false;
-	
-	if (ofw_get_property(device, "address", &screen->addr, sizeof(screen->addr)) <= 0)
-		return false;
-	
-	if (ofw_get_property(device, "width", &screen->width, sizeof(screen->width)) <= 0)
-		return false;
-	
-	if (ofw_get_property(device, "height", &screen->height, sizeof(screen->height)) <= 0)
-		return false;
-	
-	if (ofw_get_property(device, "depth", &screen->bpp, sizeof(screen->bpp)) <= 0)
-		return false;
-	
-	if (ofw_get_property(device, "linebytes", &screen->scanline, sizeof(screen->scanline)) <= 0)
-		return false;
-	
-	return true;
-}
-
-
-int ofw_keyboard(keyboard_t *keyboard)
-{
-	char device_name[BUF_SIZE];
-	
-	if (ofw_get_property(ofw_aliases, "macio", device_name, sizeof(char) * BUF_SIZE) <= 0)
-		return false;
-	
-	phandle device = ofw_find_device(device_name);
-	if (device == -1)
-		return false;
-	
-	pci_reg_t macio;
-	if (ofw_get_property(device, "assigned-addresses", &macio, sizeof(macio)) <= 0)
-		return false;
-	
-	keyboard->addr = (void *) macio.addr.addr_lo;
-	keyboard->size = macio.size_lo;
-	
-	return true;
-}
Index: ch/ppc32/loader/ofw.h
===================================================================
--- arch/ppc32/loader/ofw.h	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ 	(revision )
@@ -1,77 +1,0 @@
-/*
- * 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 MEMMAP_MAX_RECORDS 32
-#define false 0
-#define true 1
-
-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 struct {
-	void *start;
-	unsigned int size;
-} memzone_t;
-
-typedef struct {
-	unsigned int total;
-	unsigned int count;
-	memzone_t zones[MEMMAP_MAX_RECORDS];
-} memmap_t;
-
-typedef struct {
-	void *addr;
-	unsigned int width;
-	unsigned int height;
-	unsigned int bpp;
-	unsigned int scanline;
-} screen_t;
-
-typedef struct {
-	void *addr;
-	unsigned int size;
-} keyboard_t;
-
-
-extern void init(void);
-extern void ofw_write(const char *str, const int len);
-
-extern void *ofw_translate(const void *virt);
-extern int ofw_map(const void *phys, const void *virt, const int size, const int mode);
-extern int ofw_memmap(memmap_t *map);
-extern int ofw_screen(screen_t *screen);
-extern int ofw_keyboard(keyboard_t *keyboard);
-
-#endif
Index: ch/ppc32/loader/printf.c
===================================================================
--- arch/ppc32/loader/printf.c	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ 	(revision )
@@ -1,243 +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.
- */
-
-#include "printf.h"
-#include "ofw.h"
-
-static char digits[] = "0123456789abcdef";  /**< Hexadecimal characters */
-
-
-void puts(const char *str)
-{
-	int len = 0;
-	
-	while (str[len] != 0)
-		len++;
-	
-	ofw_write(str, len);
-}
-
-
-/** 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;	
-	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':
-						puts(va_arg(ap, char_ptr));
-						goto loop;
-					
-					case 'c':
-						c = (char) va_arg(ap, int);
-						break;
-					
-					/*
-					 * Hexadecimal conversions with fixed width.
-					 */
-					case 'P': 
-						puts("0x");
-					case 'p':
-						print_fixed_hex(va_arg(ap, __native), sizeof(__native));
-						goto loop;
-					
-					case 'Q':
-						puts("0x");
-					case 'q':
-						print_fixed_hex(va_arg(ap, __u64), INT64);
-						goto loop;
-					
-					case 'L': 
-						puts("0x");
-					case 'l':
-						print_fixed_hex(va_arg(ap, __native), INT32);
-						goto loop;
-					
-					case 'W':
-						puts("0x");
-					case 'w':
-						print_fixed_hex(va_arg(ap, __native), INT16);
-						goto loop;
-					
-					case 'B':
-						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':
-						puts("0x");
-					case 'x':
-						print_number(va_arg(ap, __native), 16);
-						goto loop;
-					
-					/*
-					 * Bad formatting.
-					 */
-					default:
-						goto out;
-			}
-			
-			default:
-				if (c == '\n')
-					ofw_write("\r", 1);
-				ofw_write(&c, 1);
-		}
-	
-loop:
-		;
-	}
-	
-out:
-	
-	va_end(ap);
-}
Index: ch/ppc32/loader/printf.h
===================================================================
--- arch/ppc32/loader/printf.h	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ 	(revision )
@@ -1,52 +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 __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 int __u32;
-typedef unsigned long long __u64;
-
-typedef __u32 __address;
-typedef __u32 __native;
-
-typedef char *char_ptr;
-
-void puts(const char *str);
-void printf(const char *fmt, ...);
-
-#endif
Index: arch/ppc32/loader/types.h
===================================================================
--- arch/ppc32/loader/types.h	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
+++ arch/ppc32/loader/types.h	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -0,0 +1,44 @@
+/*
+ * 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 TYPES_H__
+#define TYPES_H__
+
+#include <gentypes.h>
+
+typedef signed char __s8;
+
+typedef unsigned char __u8;
+typedef unsigned short __u16;
+typedef unsigned int __u32;
+typedef unsigned long long __u64;
+
+typedef __u32 __address;
+typedef __u32 __native;
+
+#endif
Index: arch/ppc64/Makefile.inc
===================================================================
--- arch/ppc64/Makefile.inc	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ arch/ppc64/Makefile.inc	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -33,5 +33,5 @@
 	cp arch/$(ARCH)/loader/image.boot image.boot
 
-clean: clean_kernel clean_uspace
+clean: clean_boot_gen clean_kernel clean_uspace
 	make -C arch/$(ARCH)/loader clean KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR)
 	-rm -f image.boot
Index: genarch/ofw.c
===================================================================
--- genarch/ofw.c	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
+++ genarch/ofw.c	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -0,0 +1,281 @@
+/*
+ * 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"
+#include <printf.h>
+#include <asm.h>
+
+#define MAX_OFW_ARGS		10
+#define BUF_SIZE		1024
+
+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 *);
+
+
+typedef struct {
+	unsigned int info;
+	unsigned int addr_hi;
+    unsigned int addr_lo;
+} pci_addr_t;
+
+typedef struct {
+	pci_addr_t addr;
+    unsigned int size_hi;
+    unsigned int size_lo;
+} pci_reg_t;
+
+
+ofw_entry ofw;
+
+phandle ofw_chosen;
+ihandle ofw_stdout;
+phandle ofw_root;
+ihandle ofw_mmu;
+phandle ofw_memory;
+phandle ofw_aliases;
+
+static int ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, ...)
+{
+	va_list list;
+	ofw_args_t args;
+	int i;
+	
+	args.service = service;
+	args.nargs = nargs;
+	args.nret = nret;
+	
+	va_start(list, rets);
+	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);
+	
+	for (i = 1; i < nret; i++)
+		rets[i - 1] = args.args[i + nargs];
+	
+	return args.args[nargs];
+}
+
+
+static phandle ofw_find_device(const char *name)
+{
+	return ofw_call("finddevice", 1, 1, NULL, name);
+}
+
+
+static int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
+{
+	return ofw_call("getprop", 4, 1, NULL, device, name, buf, buflen);
+}
+
+
+static unsigned int ofw_get_address_cells(const phandle device)
+{
+	unsigned int ret;
+	
+	if (ofw_get_property(device, "#address-cells", &ret, sizeof(ret)) <= 0)
+		if (ofw_get_property(ofw_root, "#address-cells", &ret, sizeof(ret)) <= 0)
+			ret = 1;
+	
+	return ret;
+}
+
+
+static unsigned int ofw_get_size_cells(const phandle device)
+{
+	unsigned int ret;
+	
+	if (ofw_get_property(device, "#size-cells", &ret, sizeof(ret)) <= 0)
+		if (ofw_get_property(ofw_root, "#size-cells", &ret, sizeof(ret)) <= 0)
+			ret = 1;
+	
+	return ret;
+}
+
+
+static ihandle ofw_open(const char *name)
+{
+	return ofw_call("open", 1, 1, NULL, name);
+}
+
+
+void init(void)
+{
+	ofw_chosen = ofw_find_device("/chosen");
+	if (ofw_chosen == -1)
+		halt();
+	
+	if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)
+		ofw_stdout = 0;
+	
+	ofw_root = ofw_find_device("/");
+	if (ofw_root == -1) {
+		puts("\r\nError: Unable to find / device, halted.\r\n");
+		halt();
+	}
+	
+	if (ofw_get_property(ofw_chosen, "mmu",  &ofw_mmu, sizeof(ofw_mmu)) <= 0) {
+		puts("\r\nError: Unable to get mmu property, halted.\r\n");
+		halt();
+	}
+	
+	ofw_memory = ofw_find_device("/memory");
+	if (ofw_memory == -1) {
+		puts("\r\nError: Unable to find /memory device, halted.\r\n");
+		halt();
+	}
+	
+	ofw_aliases = ofw_find_device("/aliases");
+	if (ofw_aliases == -1) {
+		puts("\r\nError: Unable to find /aliases device, halted.\r\n");
+		halt();
+	}
+}
+
+
+void ofw_write(const char *str, const int len)
+{
+	if (ofw_stdout == 0)
+		return;
+	
+	ofw_call("write", 3, 1, NULL, ofw_stdout, str, len);
+}
+
+
+void *ofw_translate(const void *virt)
+{
+	ofw_arg_t result[3];
+	
+	if (ofw_call("call-method", 4, 4, result, "translate", ofw_mmu, virt, 1) != 0) {
+		puts("Error: MMU method translate() failed, halting.\n");
+		halt();
+	}
+	return (void *) result[2];
+}
+
+
+int ofw_map(const void *phys, const void *virt, const int size, const int mode)
+{
+	return ofw_call("call-method", 6, 1, NULL, "map", ofw_mmu, mode, size, virt, phys);
+}
+
+
+int ofw_memmap(memmap_t *map)
+{
+	unsigned int buf[BUF_SIZE];
+	int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(unsigned int) * BUF_SIZE);
+	if (ret <= 0)
+		return false;
+		
+	unsigned int ac = ofw_get_address_cells(ofw_memory);
+	unsigned int sc = ofw_get_size_cells(ofw_memory);
+	
+	int pos;
+	map->total = 0;
+	map->count = 0;
+	for (pos = 0; (pos < ret / sizeof(unsigned int)) && (map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) {
+		void * start = (void *) buf[pos + ac - 1];
+		unsigned int size = buf[pos + ac + sc - 1];
+		
+		if (size > 0) {
+			map->zones[map->count].start = start;
+			map->zones[map->count].size = size;
+			map->count++;
+			map->total += size;
+		}
+	}
+}
+
+
+int ofw_screen(screen_t *screen)
+{
+	char device_name[BUF_SIZE];
+	
+	if (ofw_get_property(ofw_aliases, "screen", device_name, sizeof(char) * BUF_SIZE) <= 0)
+		return false;
+	
+	phandle device = ofw_find_device(device_name);
+	if (device == -1)
+		return false;
+	
+	if (ofw_get_property(device, "address", &screen->addr, sizeof(screen->addr)) <= 0)
+		return false;
+	
+	if (ofw_get_property(device, "width", &screen->width, sizeof(screen->width)) <= 0)
+		return false;
+	
+	if (ofw_get_property(device, "height", &screen->height, sizeof(screen->height)) <= 0)
+		return false;
+	
+	if (ofw_get_property(device, "depth", &screen->bpp, sizeof(screen->bpp)) <= 0)
+		return false;
+	
+	if (ofw_get_property(device, "linebytes", &screen->scanline, sizeof(screen->scanline)) <= 0)
+		return false;
+	
+	return true;
+}
+
+
+int ofw_keyboard(keyboard_t *keyboard)
+{
+	char device_name[BUF_SIZE];
+	
+	if (ofw_get_property(ofw_aliases, "macio", device_name, sizeof(char) * BUF_SIZE) <= 0)
+		return false;
+	
+	phandle device = ofw_find_device(device_name);
+	if (device == -1)
+		return false;
+	
+	pci_reg_t macio;
+	if (ofw_get_property(device, "assigned-addresses", &macio, sizeof(macio)) <= 0)
+		return false;
+	
+	keyboard->addr = (void *) macio.addr.addr_lo;
+	keyboard->size = macio.size_lo;
+	
+	return true;
+}
Index: genarch/ofw.h
===================================================================
--- genarch/ofw.h	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
+++ genarch/ofw.h	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -0,0 +1,77 @@
+/*
+ * 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 MEMMAP_MAX_RECORDS 32
+#define false 0
+#define true 1
+
+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 struct {
+	void *start;
+	unsigned int size;
+} memzone_t;
+
+typedef struct {
+	unsigned int total;
+	unsigned int count;
+	memzone_t zones[MEMMAP_MAX_RECORDS];
+} memmap_t;
+
+typedef struct {
+	void *addr;
+	unsigned int width;
+	unsigned int height;
+	unsigned int bpp;
+	unsigned int scanline;
+} screen_t;
+
+typedef struct {
+	void *addr;
+	unsigned int size;
+} keyboard_t;
+
+
+extern void init(void);
+extern void ofw_write(const char *str, const int len);
+
+extern void *ofw_translate(const void *virt);
+extern int ofw_map(const void *phys, const void *virt, const int size, const int mode);
+extern int ofw_memmap(memmap_t *map);
+extern int ofw_screen(screen_t *screen);
+extern int ofw_keyboard(keyboard_t *keyboard);
+
+#endif
Index: generic/gentypes.h
===================================================================
--- generic/gentypes.h	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
+++ generic/gentypes.h	(revision ce8725be1e22b7ff35142a2d2b8ba3272390cb43)
@@ -0,0 +1,36 @@
+/*
+ * 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 GENTYPES_H__
+#define GENTYPES_H__
+
+#define NULL 0
+#define false 0
+#define true 1
+
+#endif
Index: neric/types.h
===================================================================
--- generic/types.h	(revision 282f4724a29a7f1525a6b730340cd7674af2e831)
+++ 	(revision )
@@ -1,36 +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 GENERIC_TYPES_H__
-#define GENERIC_TYPES_H__
-
-#define NULL 0
-#define false 0
-#define true 1
-
-#endif
